如何使用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),但这也没有用。
我的目标是反汇编任何可执行文件,修改它然后重新组装。
我做错了什么?
答案 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 .bss
,section .rodata
以及其他类似的指令是多么忠诚DEFAULT REL
将数据放在目标文件中找到它的位置,但那是你需要什么。
Re:绝对重定位:确保将objconv
放在文件的顶部。我忘记了ndisasm
默认是否这样做。 x86-64 Mach-o仅支持PC相对重定位,因此您必须创建与位置无关的代码(例如,使用RIP相对寻址模式)。
objconv
不读取符号表,因此其所有操作数都使用绝对寻址。 SELECT
为跳转目标和未出现在符号表中的静态数据组成标签名称。