python exe文件解包方法總結(jié)
注:
除特別說明外,下面使用的python版本均為3.8.6
一、步驟
1. exe → pyc
方法1:pyinstxtractor.py
執(zhí)行python pyinstxtractor.py <待解包文件名>
,如果成功,即可獲得<待解包文件名>_extracted
文件夾。
注:執(zhí)行時會提示python版本問題,想要正常解包必須使用正確的python版本。
方法2:archive_viewer.py
執(zhí)行python archive_viewer.py <待解包文件名>
,會打印EXE文件中包含的所有文件信息
使用x <文件名>
命令將想要提取出的文件提取出來,q
命令退出。
兩者的區(qū)別
方法1可以一次性提取出所有文件,方法2只能逐個提取文件。但是在個人使用時,方法2的成功率相對較高??梢韵葒L試用方法1,失敗后用方法2。
2. pyc → py
步驟1獲得的文件是pyc文件,還需要進(jìn)一步反編譯獲得py文件。
注:我遇到過直接獲得py文件的情況,所以在反編譯之前可以先查看一下是不是已經(jīng)成功了。
2.1 pyc文件恢復(fù)
注:最新版pyinstxtractor.py支持自動恢復(fù)pyc,但是經(jīng)實(shí)驗(yàn)不能保證準(zhǔn)確性?;蛘哒f需要使用準(zhǔn)確的python版本才行。
在將python文件打包成exe文件的過程中,會抹去pyc文件前面的部分信息,所以在反編譯之前需要檢查并添加上這部分信息。
抹去的信息內(nèi)容可以從struct
文件中獲取:
struct文件:
pyc文件:
Q1:需要添加多少字節(jié)?
多個參考文章中提到的添加字節(jié)數(shù)都不一致,這應(yīng)該與使用的python版本有關(guān)。但是在已知的幾個例子中,可以看出pyc
文件開頭的幾個字節(jié)與struct
文件中的字節(jié)是一樣的。比如說上圖中pyc
文件是以E3 00 00 00
開頭,而這部分字節(jié)就和struct
文件的第二行起始字節(jié)相同。
因此在此例中,需要復(fù)制添加的字節(jié)就是struct
文件中第一行的16個字節(jié)
Q2:添加的方法是什么?
在010editor中,選擇Edit→Insert/Overwrite→InsertBytes
,Start Address
填0,Size
填16。
然后將字節(jié)復(fù)制進(jìn)去即可。
2.2 反編譯
反編譯工具
- Easy Python Decompiler
這是一個GUI界面的可執(zhí)行文件,下載下來直接用就可以,但是并不是每次都能成功,有些magic value不能識別。 - uncompyle6
該工具需要使用pip
安裝,使用腳本執(zhí)行。成功率較高。
反編譯提示magic value有問題怎么辦?
在上面我們添加的16個字節(jié)中,前四個字節(jié)表示的就是magic value,其中前兩個字節(jié)表示的是python的版本號,一般來說magic value的問題就是版本號有問題,編譯工具沒有識別出來該版本號表示的python版本。
如果使用的是Easy Python Decompiler,那么就可以直接轉(zhuǎn)用uncompyle6
了。
如果用的已經(jīng)是uncompyle6
,那么需要先看一下它可以識別的版本號都有哪些,這個信息可以在xdis
包的magics.py
文件中找到,具體方法如下:
- 命令行輸入
pip install xdis
,查看其安裝位置
- 到該目錄下,打開xdis文件夾下的magics.py文件
- 確定需要識別的版本號
- 就是之前添加的16個字節(jié)的前兩個字節(jié),此例中為
0D42
,需要轉(zhuǎn)換為十進(jìn)制,就是3394
。 - 查看magics.py中是否有該版本號。
我這里一開始沒有發(fā)現(xiàn)這個版本號
我的解決方法
我在谷歌上搜索了int2magic(3394)
,找到了這個Github項(xiàng)目。
下載下來,按照介紹進(jìn)行安裝。
在執(zhí)行pip install -e .
的時候,提示我xdis
和uncompyle6
的版本不匹配,于是卸載了uncompyle6
,又重新安裝了一次。
目前的版本:xdis 5.0.5
uncompyle6 3.7.4
查看該版本xdis
的magics.py
文件:
可以看到已經(jīng)有3394了。
反編譯:
成功!
注:pyc文件一定要有后綴名pyc,不然會報錯
二、PYZ文件的加密問題
有些時候在步驟1 exe→pyc的過程中,會出現(xiàn)PYZ中的文件無法正常提?。╝rchive_viewer.py),或者提取出來后顯示encrypted(pyinstxtractor.py)的問題。
這個問題可以使用參考文章2和3中的方法解決:
PYZ文件加密的密鑰保存在pyimod00_crypto_key
文件中,該文件也是一個pyc文件,可以使用上面介紹的方法進(jìn)行反編譯,然后就可以獲得密鑰:
之后的解密腳本有三個可供選擇,均在參考文章3中,根據(jù)pyinstaller的版本不同選擇不同的腳本,使用時需要替換其中的key、header以及待解密文件名和目標(biāo)文件名,執(zhí)行后即可獲得解密后的pyc文件,再使用uncompyle6反編譯即可。
注:這三個腳本中,第一個腳本適用于PyInstaller<4.0,使用python2執(zhí)行;第二個和第三個腳本適用于PyInstaller≥4.0,使用python3執(zhí)行。
以上就是python exe文件解包方法總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于python exe文件解包的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺談Pycharm調(diào)用同級目錄下的py腳本bug
今天小編就為大家分享一篇淺談Pycharm調(diào)用同級目錄下的py腳本bug,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python 實(shí)現(xiàn)兩個服務(wù)器之間文件的上傳方法
今天小編就為大家分享一篇Python 實(shí)現(xiàn)兩個服務(wù)器之間文件的上傳方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02詳解Python中的編碼問題(encoding與decode、str與bytes)
這篇文章主要介紹了Python中的編碼問題(encoding與decode、str與bytes),幫助大家更好的理解和使用python進(jìn)行開發(fā),感興趣的朋友可以了解下2020-09-09使用Python統(tǒng)計(jì)網(wǎng)站訪問流量
在現(xiàn)代Web開發(fā)中,了解和分析網(wǎng)站的訪問流量對于優(yōu)化用戶體驗(yàn)、提高網(wǎng)站性能以及制定營銷策略具有重要意義,下面我們就來看看如何使用Python來實(shí)現(xiàn)一個簡單的網(wǎng)站訪問流量統(tǒng)計(jì)系統(tǒng)吧2025-04-04python中dir()與__dict__屬性的區(qū)別淺析
這篇文章主要給大家介紹了關(guān)于python中dir()與__dict__屬性的區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12python游戲?qū)崙?zhàn)項(xiàng)目之智能五子棋
下五子棋嗎?信不信我讓你幾步你也贏不了?本篇為你帶來用python編寫的五子棋小游戲,文中給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值2021-09-09