如何确定可执行文件中反汇编代码的位置?
-
22-07-2019 - |
题
我有一个包含错误的可执行文件(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 段中的偏移量。如何计算出打印偏移量和文件顶部之间的字节增量,以便我可以编辑/修补文件中的正确字节?
感谢您提供的任何建议!
解决方案
我不熟悉的MacOS / X,但我可以给你一些提示。
要解决这个问题的正确方法,是使用反汇编修补您的文件。
0002ce19 calll 0x00850ac9
可以替换
0002ce19 movl eax, -1 ; mov eax, 0xFFFFFFFF
您看到的偏移量是相对的,所以你不能在文件中找到他们。结果
例如,jll 0x0002cf02
实际上jll 0x000000DF
如果我正确的,下面的代码块
0002ce19 calll 0x00850ac9 ; symbol stub for: _fork
0002ce1e cmpl $0x00,%eax
0002ce21 jll 0x0002cf02
0002ce27 jle 0x0002ce34
将具有该组装形式(20个字节):
0x E8 AB3C8200
83F8 00
0F8C DF000000
0F84 0B000000
如果该序列是在文件中独特的,那么你可以尝试改变E8AB3C8200
到B8FFFFFFFF
,如果你不能使用反汇编。
其他提示