1. 程式人生 > 其它 >python逆向實戰:反編譯pyinstaller打包生成的exe

python逆向實戰:反編譯pyinstaller打包生成的exe

python逆向實戰:反編譯pyinstaller打包生成的exe

  1. 今天要逆向的軟體叫you-dl.exe,它是一個pyinstaller生成的exe,它原本的名字和圖示因為版權問題不能放出來了

  2. 首先下載pyinstxtractor.py,github可下,然後在執行pyinstxtractor.py you-dl.exe(記得下pyhton)指令.

​ 為了避免被反編譯,會進行一些混淆,使得pyinstxtractor轉換出錯。如下這個檔案,使用pyinstxtractor.py進行轉換時會報錯,“Error : Unsupported pyinstaller version or not a pyinstaller

archive”,意思就是說這不是一個pyinstaller打包的檔案。

  1. 檢視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

  1. 我們就刪除從’MEI’+88之後的所有垃圾資料。刪除後的結果如下:

修復後,可以正常轉換了

  1. 但是我們開啟解析後的資料夾you-dl.exe_extracted,發現PYZ-00.pyz_extracted是空的,PYZ-00.pyz_extracted非常重要,一般一個稍微大一點的專案都會分成多個py檔案,甚至會依賴其他模組,這些被依賴的檔案解析後都會放入PYZ-00.pyz_extracted
    中,可以說這裡放的是核心程式碼。
  1. 我們檢視pyinstxtractor原始碼,發現它會檢測PYZ-00.pyz的4到8個位元組是否為MAGIC_NUMBER,而這個變數的值是有python的版本確定的,由第4步可知這個軟體是由python3.7解釋的
  1. 我下載了python3.7,使用它運行了pyinstxtractor.py,然後就可以正常解析了

哈哈,這個軟體使用了youtube-dl框架.然後就是反編譯pyc檔案了,這個使用uncompyle6即可,這個工具網上有很多資料,我就不畫蛇添足了。