反编译包含冻结的python对象的.pyd

gun*_*ons 5 python pyd

我正在尝试找出反编译python .pyd文件的最佳方法。我到处看起来都死胡同。除了Aaron Portnoy和Ali Rizvi-Santiago在2008年展示的“ Antifreeze”外,似乎没有任何程序可以做到这一点。但是,该项目早已丢失并被放弃。

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

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

要么

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

要么

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

Ali*_*ago 5

直到现在我才看到这个。不过,我应该注意,我们没有“反编译”它,只是反汇编了它。幸运的是,知道版本,反编译应该是微不足道的,因为除非经过优化(-O 参数),否则字节码生成大多是 1:1 的。

我很确定我在外部硬盘驱动器上有组成它的低级组件。虽然,我不确定 Aaron 写的真正他妈的很棒的 UI(包装它们)。

但是,本质上,它包括扫描.pyd靠近(或在)导出的表,然后使用marshal.loads将表中的每个对象解码回本机 Python 对象。有一个表存储在 .pyd 中,它由 marshal'd 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
Run Code Online (Sandbox Code Playgroud)

由此,您可以推断出尺寸和表格本身。表中的每个条目都包含一个指向编组的 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
Run Code Online (Sandbox Code Playgroud)

无论如何,一旦你有了对象,你就可以使用模块中的dis.disassemble函数来反汇编它们dis。但是,我在 github.com/arizvisa 的 GitHub 上的一个项目中仍然有原始的汇编器/反汇编器,只需搜索 antifreeze。

要将您的对象重新插入表中,您可以使用marshal.dumps并将其写回文件,尽管您可能需要移动表等。

此外,从那时起,Python 发生了重大变化,因此有些事情不再相关。