Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 拆解、修改和重新组装可执行文件_C_Assembly_Nasm_Reverse Engineering_Disassembly - Fatal编程技术网

C 拆解、修改和重新组装可执行文件

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,但在推断体

如何使用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,但在推断体系结构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
,或value
0x123
?在第一种情况下,值需要修补,如果您的修改不到位,在第二种情况下,值必须保持完整。无法判断EXEP不要在以后破译
edi
的目的。再加上这样的工具是非常无用的,最好是从github/等签出原始源代码并修改它(所以不要期望有很多人试图解决同样的问题,很多人都在开发软件)。建议您在中询问有关反向工程的问题。您可以从
Hopper
中的可选修改的反汇编中发出二进制文件,我建议您将其签出。
 *ld main.o*