转储 i386 汇编代码并重新编译为 PPC?

Dumped i386 assembly code and recompile as PPC?

我使用带有“-Vvtd”开关的 Apple 内置 "otool" 命令来转储 Mach-O i386 二进制文件,重定向到 .s 文件。我曾尝试使用 nasm 和 GAS 汇编器在 PPC 机器上重新编译代码("as"-binary 在 gcc/darwin 的 i386 目录和 "as"-binary 在ppc 目录)。输出内容如下:

some_topmost_label:
(__TEXT,__text) section
_default_pager:
00112000    pushl   %ebp
00112001    movl    %esp,%ebp
00112003    pushl   %edi
00112004    pushl   %esi
00112005    pushl   %ebx
00112006    subl    [=10=]x3c,%esp
00112009    movl    _default_pager_internal_count,%ebx
0011200f    addl    _default_pager_external_count,%ebx
00112015    leal    0x00000004(,%ebx,4),%ebx

还有一个数据部分,如下所示:

...

(__DATA,__data) section
00421000    02 00 00 00 04 00 00 00 00 40 00 00 28 64 65 66

...

00449bc0    50 00 3d 00 00 00 00 00 00 00 00 00 00 00 00 00 
00449bd0    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

...

我打算在 PPC 上 运行 在 Mac 中安装二进制文件,因此需要重新编译;我尝试删除最左边一列中的地址以使语法更像 "AT&T" 风格,保留它们等。我不想对现有代码结构进行任何编辑(这不完全是逆向工程努力本身,只是一些定制)。但是,如果我必须进行任何编辑,我非常希望它严格用于为 i386 运行 制作现有的、纯正的代码,就像在 PPC 上一样。

非常感谢您的帮助。

此致

在汇编语言中,每条"statement"都是处理器可以执行的一条指令。这些指令以人类可读的文本格式表示(如果您是正确的人),但每个指令名称(例如 movl)和寄存器(例如 %esp)和内存引用(例如0x00000004(,%ebx,4))存在于汇编中直接对应处理器的一个实现细节

所以每个处理器都有自己的汇编语言。倾倒和重新组装不会让你到任何地方。甚至在一组相关的处理器中也不行——如果你使用一些启用了 SSE3 优化的 32 位 x86 代码并将其转储,你将获得带有 SSE3 指令的汇编代码。重新组装它不会让你得到一个可以在稍旧的 x86-32 处理器上 运行 的程序。

如果您的可执行文件足够旧,它可能是一个 "fat binary". During the period when PPC and x86 Macs were both supported by Apple, they would pack the compiled PPC and x86 code together in a single file. Judging by this answer 您可以使用 file 命令检测胖二进制文件。

但是您可能需要做比预期更多的工作。

PPC 没有 movl 指令(或任何其他类型的 mov - 它单独处理加载和存储)。它没有像 %esp 这样的专用堆栈寄存器,尽管 r1 是一个安全的选择。它没有任何类似于 0x00000004(,%ebx,4) 中的寻址模式——这是一个寄存器乘以 4,然后加上常量 4——在 PPC 中,你必须用一条指令将常量加载到不同的寄存器中,然后在另一条指令中移位 (*4 = <<2) 寄存器,然后在第三条指令中将这些中间结果加在一起。这与指令是写成"source form"还是"binary form"无关。这是原始代码中的说明问题 PPC 上根本不存在

反编译器可以生成 C 文件(正如我所尝试的),这些文件可用于在不同的体系结构(我也尝试过)上从源代码进行编译。这种体验充其量是冒险的。我仍在努力,可能还会持续一段时间。

作为替代方案,可以对 运行 a binary/executable for i386 on ppc 实施仿真。这是一种快速但可能不太有效的途径。

此外,我觉得它证实了汇编到汇编将是最痛苦的路线,而不是使用 C 编程语言作为中间(通过将 i386 二进制文件反编译为 C 并在目标上重新编译 C建筑学)。

在反编译的情况下:如果它产生了 25 万行代码怎么办?您可能需要一个团队:)