我正在尝试找出反编译python .pyd文件的最佳方法。我到处看起来都死胡同。除了Aaron Portnoy和Ali Rizvi-Santiago在2008年展示的“ Antifreeze”外,似乎没有任何程序可以做到这一点。但是,该项目早已丢失并被放弃。
我昨天在推特(Aaron Portnoy)上与该程序的一位开发人员进行了交谈。这是对话。
所以我的问题是,如何轻松地反编译包含冻结的python对象的.pyd。
要么
如Aaron所指出的,我将如何使用.pyo和.pyc修改其中的一个反编译器来反编译.pyd?如果这是我最终要做的事情,那么哪一个最好呢?
要么
如果您有防冻剂或知道从何处获得防冻剂,那将是一个奇迹。甚至开发人员也不知道从哪里获得。我已经搜索了好几天没有运气了。
直到现在我才看到这个。不过,我应该注意,我们没有“反编译”它,只是反汇编了它。幸运的是,知道版本,反编译应该是微不足道的,因为除非经过优化(-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 发生了重大变化,因此有些事情不再相关。
| 归档时间: |
|
| 查看次数: |
2662 次 |
| 最近记录: |