6

我试图找出反编译 python .pyd 文件的最佳方法。我所到的每一个地方都遇到了死胡同。似乎没有任何程序可以做到这一点,除了 Aaron Portnoy 和 Ali Rizvi-Santiago 在 2008 年在这里展示的“防冻剂”。然而,该项目早已丢失和放弃。

我昨天在推特上与该程序的一位开发人员(Aaron Portnoy)进行了交谈。是对话。

所以我的问题是,如何轻松反编译包含冻结 python 对象的 .pyd。

或者

正如 Aaron 指出的那样,我将如何修改其中一个使用 .pyo 和 .pyc 来反编译 .pyd 的反编译器?如果这就是我最终要做的事情,那么最好的选择是哪一个?

或者

如果您有防冻剂或知道从哪里获得它,那将是一个奇迹。即使是开发人员也不知道从哪里获得它。我已经搜索了好几天没有运气。

4

1 回答 1

5

直到现在我才看到这个。不过,我应该注意,我们没有“反编译”它,而只是反汇编了它。幸运的是,知道版本,反编译应该是微不足道的,因为字节码生成大多是 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 发生了显着变化,因此有些事情不再相关。

于 2020-06-05T19:10:59.533 回答