反编译包含冻结Python对象的.pyd文件
我正在寻找解压一个Python的.pyd文件的最佳方法。无论我在哪里查找,似乎都没有找到合适的解决方案。除了2008年由Aaron Portnoy和Ali Rizvi-Santiago演示的“Antifreeze”之外,似乎没有其他程序可以做到这一点,可以在这里查看。不过,这个项目早就失传了,也没人再维护了。
昨天我在推特上和这个程序的开发者之一(Aaron Portnoy)聊过。这是我们的对话。
所以我想问,怎样才能轻松解压一个包含冻结Python对象的.pyd文件呢?
或者
我该如何修改现有的解压工具,让它能处理.pyd文件,就像Aaron提到的那样?如果我真的要这么做,哪个工具比较好呢?
或者
如果你有Antifreeze或者知道哪里能找到,那简直是个奇迹。连开发者都不知道在哪里能找到它。我已经找了好几天都没找到。
1 个回答
我现在才看到这个。不过我得说明一下,我们并没有“反编译”它,而只是进行了反汇编。幸运的是,知道版本后,反编译应该很简单,因为字节码生成基本上是1:1的,除非进行了优化(-O参数)。
我很确定我在外部硬盘上有组成这个的底层组件。虽然,我不太确定那个非常酷的用户界面(是Aaron写的)是否也在里面。
基本上,这个过程是扫描 .pyd
文件,寻找一个靠近(或在)导出部分的表格,然后使用 marshal.loads
将表格中的每个对象解码回原生的Python对象。这个表格存储在 .pyd
文件中,里面包含了经过marshal处理的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
从这里,你可以推断出表格的大小和内容。表格中的每一项都包含一个指向经过marshal处理的Python代码的指针、大小和你需要的命名信息。要进行反marshal,你需要相同版本的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发生了很大的变化,所以有些东西现在已经不再适用了。