反汇编程序(或其用户)通常不保留的一件重要的事情是指令编码。一些指令可以用多种不同的方式编码,例如:
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)。
汇编器或链接器可能会做一些不同的事情(例如,在输出文件中对代码/数据进行额外的对齐、名称和顺序(节/段)不同),这通常不是问题,但是,再次,如果原始程序中对这些东西有一些不寻常的依赖关系,那么,重新组装的程序将会以不同的方式工作。