当用较短的指令替换较长的指令时,我们可以用nop
s填充。
如何以相反的方式进行内联替换?
通过 inline 我的意思是不是jmp
到其他一些免费记忆然后再回来。
换句话说,是否有可能插入更多操作?怎么做的?应该以某种方式修改二进制文件的标题吗?所有jmp
操作会发生什么(他们会在理论上的改变之后继续工作吗?)。如果有绝对jmp
s怎么办?那些也应该修改,对吧?还有什么应该做(如果这实际上可行)?
答案 0 :(得分:2)
这里有几个问题:
所有类型的简单跳转,无论是有条件的(je
,jne
等)还是无条件的(jmp
),都有两种形式,短的和近的,前者具有带符号的字节大小的偏移量(范围-128到+127),后者具有带符号的双字大小的偏移量(范围-2147483648到+2147483647)。
更改条件跳转的条件不需要更改跳转大小,但如果所需的目标地址超出范围,则可能会更改跳转的目标地址。
如果您想要实际将跳转目标更改为新位置(当前位于跳转类型范围之外),或者在代码站点插入更多指令,则需要重新定位所需的代码在它之后。
正如您所怀疑的那样,这样做涉及修复跨越代码中新差距的所有相对引用以及跟随差距的任何绝对引用,如果引用的内容也被重新定位,那么之前的绝对引用也是如此差距。
这种操作的难度从适度复杂到不可能,取决于代码的结构如何以及您可以获得哪些信息。
如果有问题的代码是由编译器发出的,并且您有符号信息可用,则可以完成,否则通常非常困难,除非所需的更改非常小。
答案 1 :(得分:1)
如果您有机器说明
A; B; C; D; E;
并且需要用更大的X替换B,然后你可以删除C,D等,以便为跳跃腾出足够的空间。
说C; D;
足够大了。所以你最终得到了
A; jmp freeSpace; back: E
...
<previous end of binary>
freeSpace: X; C; D; jmp back;
如果C和/或D本身是跳跃,则会有所不同。但你总能让它发挥作用。
当天我用这个来修补二进制文件,其中只有纸张装配清单可用。不优雅,但工作正常。如果这就是Ida Pro所做的那样,不会有点惊讶。