如何确定反汇编代码在可执行文件中的位置?

Jer*_*ner 5 assembly executable patch otool

我有一个包含错误的可执行文件(C++,i386,在 MacOS/X Tiger 下编译,如果重要的话)。该错误的修复很简单——代码中有一个地方调用 fork() 而它不应该。因为修复很简单,而且因为此时从头开始重新编译可执行文件会很困难(不要问),我想直接修补可执行文件/二进制文件。

作为迈出的第一步,我在我的可执行文件上运行了“otool -tV MyExecutableName”,瞧,我在反汇编输出中发现了这个:

./MyExecutableName:
(__TEXT,__text) section
[... many lines omitted ...]
0002ce0d        subl    $0x10,%esp
0002ce10        calll   0x0051adac
0002ce15        movzbl  0x14(%ebp),%esi
0002ce19        calll   0x00850ac9      ; symbol stub for: _fork
0002ce1e        cmpl    $0x00,%eax
0002ce21        jll     0x0002cf02
0002ce27        jle     0x0002ce34
[... many more lines omitted ...]
Run Code Online (Sandbox Code Playgroud)

所以我想做的是替换第 0002ce19 行的操作码,这样它就不会调用 _fork,而是无条件地跳转到失败情况(即它应该像 fork() 返回 -1 一样)

不幸的是,我在反汇编/二进制补丁方面是一个完全的新手,所以我不确定如何去做。特别是,我的问题是:

1)我应该将哪些字节写入位置 0002ce19 到 0002xe1d 以获得我想要的?我假设它是“jmp 0x0002cf02”的组装等价物,但我如何弄清楚这些字节是什么?

2) "otool -tV" 打印的偏移量似乎是到可执行文件的 __TEXT 段的偏移量。如何找出打印偏移量和文件顶部之间的字节增量,以便我可以编辑/修补文件中的正确字节?

感谢您提供的任何建议!

Nic*_*kis 3

我对 MacOS/X 不熟悉,但我可以给你一些提示。

修复它的正确方法是使用反汇编程序来修补文件。

0002ce19        calll   0x00850ac9
Run Code Online (Sandbox Code Playgroud)

可以替换为

0002ce19        movl   eax, -1 ; mov eax, 0xFFFFFFFF
Run Code Online (Sandbox Code Playgroud)

您看到的偏移量是相对的,因此您无法在文件中找到它们。
例如,jll 0x0002cf02实际上是jll 0x000000DF

如果我是正确的,下面的代码块

0002ce19        calll   0x00850ac9      ; symbol stub for: _fork
0002ce1e        cmpl    $0x00,%eax
0002ce21        jll     0x0002cf02
0002ce27        jle     0x0002ce34
Run Code Online (Sandbox Code Playgroud)

将具有以下组装形式(20 字节):

0x  E8   AB3C8200
    83F8 00
    0F8C DF000000
    0F84 0B000000
Run Code Online (Sandbox Code Playgroud)

如果该序列在文件中是唯一的,那么如果您无法使用反汇编程序,则可以尝试将 更改E8AB3C8200为。B8FFFFFFFF