我有一个包含错误的可执行文件(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 ...]
所以我想做的是替换第 0002ce19 行的操作码,而不是调用 _fork,它只是无条件地跳转到失败的情况(即它应该像 fork() 返回 -1 一样)
不幸的是,我是反汇编/二进制补丁的新手,所以我不确定如何去做。特别是,我的问题是:
1) 我应该将哪些字节写入位置 0002ce19 到 0002xe1d 以获得我想要的?我假设它是“jmp 0x0002cf02”的组装等价物,但我如何弄清楚这些字节是什么?
2)“otool -tV”打印的偏移量似乎是可执行文件的__TEXT段的偏移量。如何找出打印的偏移量和文件顶部之间的字节增量,以便我可以编辑/修补文件中的正确字节?
感谢您提供的任何建议!