直到现在我才看到这个。不过,我应该注意,我们没有“反编译”它,而只是反汇编了它。幸运的是,知道版本,反编译应该是微不足道的,因为字节码生成大多是 1:1,除非它被优化(-O 参数)。
我很确定我有在外部硬盘驱动器上组成它的较低级别的组件。虽然,我不确定 Aaron 编写的真正令人敬畏的 UI(包装它们)。
但是,本质上,它包括扫描在.pyd
导出附近(或内部)的表,然后使用marshal.loads
将表中的每个对象解码回本地 Python 对象。.pyd 中存储有一个表,其中包含编组的 python 代码。
在 .pyd 的入口点有一个如下所示的副本:
.text:1000102F 014 8B 15 30 20 00 10 mov edx, ds:PyImport_FrozenModules
.text:10001035 014 8B F8 mov edi, eax
.text:10001037 014 B9 82 11 00 00 mov ecx, 1182h
.text:1000103C 014 BE 88 55 44 11 mov esi, offset off_11445588 ; "Pmw"
.text:10001041 014 F3 A5 rep movsd
由此,您可以推断出大小和表格本身。表中的每个条目都包含一个指向编组 Python 的指针、大小和您要查找的命名信息。要解组它,您需要相同版本的 Python,您可以使用marshal.loads.
.data:114456B4 28 EF 00 10 dd offset str.directcontrolsObserverWalker ; "direct.controls.ObserverWalker"
.data:114456B8 68 69 03 10 dd offset unk_10036968
.data:114456BC 9C 0B 00 00 dd 0B9Ch
无论如何,一旦你有了对象,你就可以使用模块中的dis.disassemble
函数来反汇编它们dis
。但是,我在 GitHub 上的 github.com/arizvisa 上的一个项目中仍然有原始的汇编器/反汇编器,只需搜索 antifreeze。
要将对象重新插入表中,您可以使用marshal.dumps
并将其写回文件中,尽管您可能需要移动表等。
此外,自那时以来,Python 发生了显着变化,因此有些事情不再相关。