Pyinstaller打包原理就是把python解释器和代码文件打包进同一个exe中,所以我们可以把代码提取出来。
之所以玩玩这个,是因为最近寝室里都在打 pvz-rouge,通过目录下的 python38.dll 和 exe 的内容容易发现这个游戏是用 pyinstaller 打包的,于是想尝试把源码提取之后魔改一下。
pyinstaller 的解包可以通过 pyinstxtractor.py,项目地址:https://github.com/WithSecureLabs/python-exe-unpacker。把整个项目 pull 下来,然后运行
python pyinstxtractor.py pvz-rouge.exe
就可以提取了。
这个 pvzrouge 文件,就是编译好的字节码 pyc 文件。
不过文件缺失了头部的16个字节(主要是4字节Magic Number,时间戳和其他信息,时间戳和其他信息不重要全部改成0即可),我们可以查询Magic Number补全头部:
Magic Number表:
MAGIC_1_0 = 0x00999902,
MAGIC_1_1 = 0x00999903, /* Also covers 1.2 */
MAGIC_1_3 = 0x0A0D2E89,
MAGIC_1_4 = 0x0A0D1704,
MAGIC_1_5 = 0x0A0D4E99,
MAGIC_1_6 = 0x0A0DC4FC,
MAGIC_2_0 = 0x0A0DC687,
MAGIC_2_1 = 0x0A0DEB2A,
MAGIC_2_2 = 0x0A0DED2D,
MAGIC_2_3 = 0x0A0DF23B,
MAGIC_2_4 = 0x0A0DF26D,
MAGIC_2_5 = 0x0A0DF2B3,
MAGIC_2_6 = 0x0A0DF2D1,
MAGIC_2_7 = 0x0A0DF303,
MAGIC_3_0 = 0x0A0D0C3A,
MAGIC_3_1 = 0x0A0D0C4E,
MAGIC_3_2 = 0x0A0D0C6C,
MAGIC_3_3 = 0x0A0D0C9E,
MAGIC_3_4 = 0x0A0D0CEE,
MAGIC_3_5 = 0x0A0D0D16,
MAGIC_3_5_3 = 0x0A0D0D17,
MAGIC_3_6 = 0x0A0D0D33,
MAGIC_3_7 = 0x0A0D0D42,
MAGIC_3_8 = 0x0A0D0D55,
MAGIC_3_9 = 0x0A0D0D61,
MAGIC_3_10 = 0x0A0D0D6F,
MAGIC_3_11 = 0x0A0D0DA7,
MAGIC_3_12 = 0x0A0D0DCB
根据Python 3.8的Magic Number 0x0A0D0D55,在 pyc 头部添加 55 D0 D0 A0 00 00 00 00 00 00 00 00 00 00 00 00,就可以了。
然后用 pycdc 工具来进行反编译。可惜不知道什么原因,最后只得到了部分的结果,希望有时间来修复一下qwq:
pvz-rouge 由 b 站 up 主 一坨馬 编写,本文仅供学习!