python逆向實戰:反編譯pyinstaller打包生成的exe
阿新 • • 發佈:2021-08-09
python逆向實戰:反編譯pyinstaller打包生成的exe
-
今天要逆向的軟體叫
you-dl.exe
,它是一個pyinstaller
生成的exe,它原本的名字和圖示因為版權問題不能放出來了
-
首先下載
pyinstxtractor.py
,github
可下,然後在執行pyinstxtractor.py you-dl.exe
(記得下pyhton
)指令.
為了避免被反編譯,會進行一些混淆,使得pyinstxtractor
轉換出錯。如下這個檔案,使用pyinstxtractor.py
進行轉換時會報錯,“Error : Unsupported pyinstaller
version or not a pyinstaller
pyinstaller
打包的檔案。
- 檢視
pyinstxtractor
原始碼發現它會在檔案末尾檢測有沒有MAGIC
欄位,沒有找到就會報錯
往上追溯,可以看到標識MAGIC為 MEI\xxxxxx
,2.0版本的MAGIC位於 [end - 24] 處,2.1版本的MAGIC位於 [end - 88] 處。
而當我們檢視檔案的二進位制時,發現檔案末尾都是些垃圾資料,根本沒有 ‘MEI’ 標識
我們搜尋一下,終於在上面的一個位置找到了MAGIC,這個就是pyinstaller
標識。接下來就是要把垃圾資料去除掉,使MAGIC位於24或88的位置,那到底是24還是88呢?(該檔案是pyinstaller2.0
pyinstaller2.1
打包的),這就得看下2.0和2.1的區別了。與2.0相比,2.1多了64位元組的pylibname
,那我們就看看該檔案裡存不存在pylibname
。這裡找到了python37.dll
明顯是2.1-
我們就刪除從’MEI’+88之後的所有垃圾資料。刪除後的結果如下:
修復後,可以正常轉換了
- 但是我們開啟解析後的資料夾
you-dl.exe_extracted
,發現PYZ-00.pyz_extracted
是空的,PYZ-00.pyz_extracted
非常重要,一般一個稍微大一點的專案都會分成多個py
檔案,甚至會依賴其他模組,這些被依賴的檔案解析後都會放入PYZ-00.pyz_extracted
- 我們檢視
pyinstxtractor
原始碼,發現它會檢測PYZ-00.pyz
的4到8個位元組是否為MAGIC_NUMBER
,而這個變數的值是有python
的版本確定的,由第4步可知這個軟體是由python3.7
解釋的
- 我下載了
python3.7
,使用它運行了pyinstxtractor.py
,然後就可以正常解析了
哈哈,這個軟體使用了youtube-dl
框架.然後就是反編譯pyc
檔案了,這個使用uncompyle6
即可,這個工具網上有很多資料,我就不畫蛇添足了。