--- title: pyinstaller 逆向筆記 tags: python, 資安 --- # pyinstaller 逆向筆記 ## 工具 - uncompyle6 - `pip install uncompyle6==2.2.0` - pyinstxtractor.py - https://sourceforge.net/projects/pyinstallerextractor/ - https://github.com/countercept/python-exe-unpacker/blob/master/pyinstxtractor.py ## 第一步 解開exe - 使用`pyinstxtractor` - `pyinstxtractor demo.exe` - 產出資料夾 -  - 版本不對 PYZ-00.pyz_extracted 資料夾會是空的 - 主要檔案名稱:`main_obfuscate.pyc.encrypted` ## 第二部 搜集資料 ### 找到 key - ```python= import dis, marshal a = open("demo.exe_extracted\pyimod00_crypto_key", "rb") a.seek(16) m = marshal.load(a) d = dis.disassemble(m) a.close() print(d) ``` - 或是把`pyimod00_crypto_key`重新命名成 `key.pyc` - `python` - `import key` - `print(key.key)` ### 找到 magic_num & header - 直接拿`pyimod00_crypto_key` 前16byte - py2 可能是`8bytes`不確定 - 每個py版本不同`3.7` vs `3.8` - 小版本相同 `3.8.1` vs `3.8.2` ## 第三部 解開檔案 ```python= from Crypto.Cipher import AES import sys, zlib CRYPT_BLOCK_SIZE = 16 # key obtained from pyimod00_crypto_key key = b"xxxxxxxxxxxxxxxx" inf = open(sys.argv[1], "rb") # encrypted file input outf = open("output.pyc", "wb") # output file # Initialization vector iv = inf.read(CRYPT_BLOCK_SIZE) cipher = AES.new(key, AES.MODE_CFB, iv) # Decrypt and decompress plaintext = zlib.decompress(cipher.decrypt(inf.read())) # Write pyc header(3.8) / copy from pyimod00_crypto_key outf.write(b"\x55\x0D\x0D\x0A\x00\x00\x00\x00\x70\x79\x69\x30\x33\x00\x00\x00") # Write decrypted data outf.write(plaintext) inf.close() outf.close() ``` ## 第四部 decomplier - 版本須正確 - `pip install uncompyle6` - `uncompyle6 -o output.py output.pyc` - 登愣拿到檔案 ## 雷點 - python本版要一樣 - 還敢用 py2 阿 - 請用windows
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.