反汇编,修改和重新组合可执行文件

时间:2017-12-05 11:57:53

标签: c assembly nasm reverse-engineering disassembly

如何使用ndisasm反汇编我的mac上的可执行文件并使用nasm和ld重新组合并链接它? 这就是我尝试过的(我正在运行MacOS X顺便说一句):

libraries:
- name: pycrypto
  version: "2.6.1"

这生成了干净的汇编程序代码,其中包含main.asm中的所有处理器指令

 *ndisasm a.out | cut -c 29- > main.asm*

这会生成一个目标文件main.o,然后我尝试链接

 *nasm -f macho main.asm*

......这就是我被困的地方。我不知道它为什么会产生以下错误:

ld:在__TEXT部分,__ text reloc 0:R_ABS reloc但目标地址文件中没有绝对符号' main.o'推断架构i386。

我也尝试过指定架构(ld -arch x86_64 main.o),但这也没有用。

我的目标是反汇编任何可执行文件,修改它然后重新组装。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

使用普通的汇编语法没有可靠的方法。见How to disassemble, modify and then reassemble a Linux executable?。部分信息通常不会被忠实地反汇编,因此您需要一种特殊的格式,用于修改和重新组合+ 重新链接

此外,当代码仅在使用较长编码填充时才起作用,指令长度是一个问题。 (例如,在计算goto的跳转目标表中)。请参阅Where are GNU assembler instruction suffixes like ".s" in x86 "mov.s" documented?,但请注意,反汇编程序不支持反汇编为该格式。

ndisasm无法理解目标文件格式,因此它会将标头反汇编为机器代码!

为了让它有任何工作的希望,请使用像Agner Fog's objconv这样的反汇编程序,它将输出asm源(NASM,MASM或GAS AT& T)进行汇编。如果任何代码依赖于特定的超过默认编码,它可能实际上不起作用。

我不确定objconv对于发出section .bsssection .rodata以及其他类似的指令是多么忠诚DEFAULT REL将数据放在目标文件中找到它的位置,但那是你需要什么。

Re:绝对重定位:确保将objconv放在文件的顶部。我忘记了ndisasm默认是否这样做。 x86-64 Mach-o仅支持PC相对重定位,因此您必须创建与位置无关的代码(例如,使用RIP相对寻址模式)。

objconv不读取符号表,因此其所有操作数都使用绝对寻址。 SELECT为跳转目标和未出现在符号表中的静态数据组成标签名称。