C 拆解、修改和重新组装可执行文件
如何使用NDISAM在mac上分解可执行文件,并使用nasm和ld重新组装和链接它? 这是我尝试过的(我正在运行MacOS X btw): 这将生成干净的汇编代码,其中包含main.asm中的所有处理器指令C 拆解、修改和重新组装可执行文件,c,assembly,nasm,reverse-engineering,disassembly,C,Assembly,Nasm,Reverse Engineering,Disassembly,如何使用NDISAM在mac上分解可执行文件,并使用nasm和ld重新组装和链接它? 这是我尝试过的(我正在运行MacOS X btw): 这将生成干净的汇编代码,其中包含main.asm中的所有处理器指令 *nasm -f macho main.asm* 这生成了一个对象文件main.o,然后我尝试链接它 *ld main.o* 。。。这就是我被困的地方。我不知道为什么会产生以下错误: ld:在第uuu TEXT节中,uuu TEXT reloc 0:R_ABS reloc,但在推断体
*nasm -f macho main.asm*
这生成了一个对象文件main.o,然后我尝试链接它
*ld main.o*
。。。这就是我被困的地方。我不知道为什么会产生以下错误:
ld:在第uuu TEXT节中,uuu TEXT reloc 0:R_ABS reloc,但在推断体系结构i386的目标地址文件“main.o”处没有绝对符号
我还尝试指定体系结构(ld-arch x86_64 main.o),但也没有成功
我的目标是分解任何可执行文件,对其进行修改,然后重新组装。
我做错了什么?使用正常的汇编程序语法没有可靠的方法来实现这一点。看见节信息通常不会被忠实地分解,因此您需要一种特殊的格式,用于修改和重新组装+重新链接
此外,当代码仅在使用较长编码填充时才起作用时,指令长度也是一个问题。(例如,在计算goto的跳转目标表中)。请参阅,但请注意,反汇编程序不支持反汇编为该格式
ndisam
不理解对象文件格式,所以它将标题反汇编为机器代码
为了使其有任何工作的希望,使用一个像这样的反汇编程序,它将输出组装的asm源(NASM、MASM或气体AT&T)。如果任何代码依赖于比默认编码更长的特定编码,那么它实际上可能不起作用
我不确定objconv
对于发出section.bss
、section.rodata
和其他类似指令将数据放在对象文件中找到的位置有多可靠,但这正是您需要的
回复:绝对重新定位:确保将
默认REL
放在文件顶部。我忘记了默认情况下,objconv
是否执行此操作。x86-64 Mach-o仅支持PC相对重定位,因此您必须创建位置无关的代码(例如,使用RIP相对寻址模式)
ndisam
不读取符号表,因此其所有操作数都使用绝对寻址objconv
为符号表中未出现的跳转目标和静态数据组成标签名。由于装配和链接是由两种不同的工具执行的,因此对文件进行反汇编不足以重新创建原始二进制文件。此外,这还意味着反汇编程序将传递一些“解链接器”应该处理的二进制属性(它们存在吗?)。由于这些原因,人们通常会对二进制文件进行修补或使用Mach-O编辑器对其进行编辑,以移动/增长/收缩部分。它也肯定不适用于任何可执行文件,有些文件可能具有防篡改功能,或者太复杂的代码会被您的修改破坏,重新组装的可执行文件将无法正常工作(正确=与以前一样+仅限您的修改)例如,如果您的可执行文件中有mov edi,0x123
,您如何判断它是否正在中加载数据的内存地址。text
0x123
,或value0x123
?在第一种情况下,值需要修补,如果您的修改不到位,在第二种情况下,值必须保持完整。无法判断EXEP不要在以后破译edi
的目的。再加上这样的工具是非常无用的,最好是从github/等签出原始源代码并修改它(所以不要期望有很多人试图解决同样的问题,很多人都在开发软件)。建议您在中询问有关反向工程的问题。您可以从Hopper
中的可选修改的反汇编中发出二进制文件,我建议您将其签出。
*ld main.o*