【问题标题】:Decompiling a .pyd that contains frozen python objects反编译包含冻结 python 对象的 .pyd
【发布时间】:2014-10-19 02:38:12
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: python pyd


【解决方案1】:

直到现在我才看到这个。不过,我应该注意,我们并没有“反编译”它,而只是反汇编了它。幸运的是,知道版本,反编译应该是微不足道的,因为字节码生成大多是 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 模块中的dis.disassemble 函数来反汇编它们。但是,我在 GitHub 上 github.com/arizvisa 的一个项目中仍然有原始的汇编器/反汇编器,只需搜索 antifreeze。

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

此外,自那时以来,Python 发生了显着变化,因此有些事情不再相关。

【讨论】:

  • 您能否进一步解释一下“扫描”和“解码每个对象”的含义?如果你能提供一个简单的例子,或者你在你的 github 中引用的代码,那就太好了。
  • 根据您的建议对其进行了更新。
猜你喜欢
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多