试图组装反汇编程序的输出(例如objdump)

mat*_*boy 3 assembly objdump

可能重复:
反汇编,修改然后重新组装Linux可执行文件

我被告知装配和拆卸不是反转.显然,你不能解组程序,将输出直接放入汇编程序,并期望它能够正确运行,因为信息丢失了.

我的问题是,为什么信息会丢失?还有什么信息丢失了?

Ale*_*nze 7

反汇编程序(或其用户)通常不保留的一个重要事项是指令编码.某些指令可以以多种不同方式编码,例如:

mov rdx, -1 是48,BA,FF,FF,FF,FF,FF,FF,FF,FF(10字节)或48,C7,C2,FF,FF,FF,FF(7字节).

如果程序的其余部分在某种程度上取决于上述指令的长度恰好是10(或7)字节或那些特定的字节值,并且汇编器选择mov rdx, -1与原始程序中的汇编不同,那么在反汇编之后+汇编你会得到一个不同的程序.对于具有模糊编码的指令,汇编器必须不使用指令助记符(mov rdx, -1),而是在原始程序的反汇编中使用其精确编码(例如48,BA,FF,FF,FF,FF,FF,FF,FF,FF).

汇编器或链接器可能有不同的其他方式(例如,在输出文件中对代码/数据进行额外的对齐,命名和排序(部分/段)不同),这通常不是问题,但是,如果在原始程序中对这些事情有一些不寻常的依赖关系,那么重新组装的程序将以不同的方式工作.