目錄
1.前言
2.使用環境
3.還原過程
4.號外
5.exe文件和所用到的反編譯工具
6.參考
7.去簽名(補漏)
前言
拿到了利用驅動人生進行傳播的病毒樣本,發現是python打包成的exe文件,經過點波折才搞定。
使用環境
Python 3.6.1(網上說python2.7也可)
還原過程
首先用IDA進行分析,發現PyInstaller等關鍵信息,可以確認是利用PyInstaller打包的python文件,所以我們要想辦法把python文件dump出來
根據網上資料資料,我們可以使用pyinstxtractor.py進行反編譯,下載回來操作了一波,很開心的發現解不了。。。
聽說去掉簽名信息后再使用pyinstxtractor.py可以解開,然后嘗試了一下又不行。。。(這里的圖沒保存)
最后千辛萬苦終於找到工具來提取python文件。我們看到前面利用pyinstxtractor.py反編譯的錯誤里有個提示“not a pyinstaller archive”,而用來提取的py腳本叫archive_viewer.py(使用archive_viewer.py要安裝PyInstaller,通過pip install pyinstaller即可安裝)。
通過上面那張圖可以看到除了一些庫文件外,就可以看到“ii”這個文件,我們可以使用archive_viewer.py把它提取出來。這里輸入命令“x ii”,然后再輸入文件名“ii.pyc”。這里要清楚,即使提取出文件,也首先是pyc格式的文件
1 #這里是archive_viewer.py可以使用的命令,這里我們用“X”提取文件 2 U: go Up one level 3 O <name>: open embedded archive name 4 X <name>: extract name 5 Q: quit
由於用PyInstaller打包后,pyc文件的前8個字節會被抹掉,所以最后要自己添加回去。前四個字節為python編譯的版本,后四個字節為時間戳。想要獲得編譯版本可以查看打包文件里struct的信息,我這里還是提取出struct這個文件
用編輯工具查看struct文件的前8個字節,把它復制並添加到pyc文件中就可以了
最后可以搜索pyc在線反編譯或者使用工具“Easy Python Decompiler v1.3.2”對pyc文件進行反編譯
這里反編譯后文件后綴是dis,直接用notepad++打開即可看到源代碼(代碼里還有base64沒弄,這里不是重點就不多說了)
號外
這里看了一下別人的文章,pyc的格式簡略為,時間戳哪里填零也可以反編譯出來
1 最開始4個字節是一個Maigc int, 標識此pyc的版本信息, 不同的版本的 Magic 都在 Python/import.c 內定義 2 接下來四個字節還是個int,是pyc產生的時間(TIMESTAMP, 1970.01.01到產生pyc時候的秒數) 3 接下來是個序列化了的 PyCodeObject(此結構在 Include/code.h 內定義),序列化方法在 Python/marshal.c 內定義
關於為什么這個exe用pyinstxtractor.py解不開,看到了別人用來對抗反編譯的方法,原來被騷到了。。。。。。這里的內容可以看的下面參考“PyInstaller將Python文件打包為exe后如何反編譯(破解源碼)以及防止反編譯”
exe文件和所用到的反編譯工具
反編譯工具是在下面參考文章python程序反編譯里給的,這里十分感謝和說明一下
反編譯工具:https://pan.baidu.com/s/1IjavH7F0l-jDCcnYIIEWtA
exe文件:
鏈接:https://pan.baidu.com/s/1brGnrfPFU-0sKUw2qMxG9w
提取碼:ftht
參考
python程序反編譯:https://blog.csdn.net/x947955250/article/details/82777640
反編譯 pyinstaller 產生的可執行文件:http://howiedlut.top/pyinstaller-reverse-engineer/
PyInstaller將Python文件打包為exe后如何反編譯(破解源碼)以及防止反編譯:http://www.lizenghai.com/archives/898.html
pyc文件格式分析:https://kdr2.com/tech/python/pyc-format.html
去簽名(補漏)
昨天寫的時候還不知道是自己操作不行,原來去簽名這個方法是可以的(這里感謝同事的幫助)。之前去簽名一直用stud_PE這個工具直接把簽名抹掉,后來發現這個操作是不對的。首先看一下PyInstaller中的代碼,PyInstaller首先會通過讀取程序最后的數據進行識別,如果是符合格式的才會進行解析
用數據編輯軟件打開文件,然后搜索關鍵標志“MEI”,一般在最下面才會找到這個字符,這里我們還要根據是否匹配MAGIC整個結構才可以確定
最后就刪除格式之外的數據就可以,這里如何判斷格式是pyinstaller2.0(24字節)還是pyinstaller2.1(88字節)?其實我不是很清楚。。。不過我這里主要是24個字節后還沒有到python27.dll哪里,所以就用88個字節的。這里有個粗暴的方法就是兩種方式都用一下,看那個可以正確反編譯出來
用pyinstaller反編譯成功后就可以在目錄下找到解壓出來的文件夾,打開就會發現關鍵文件“ii”。這里也需要和之前一樣修復頭部數據,方法和上面一樣。