JMP指令和call指令大同小异

    我们写正常程序的时候根本不用关心变量(常量)的位置,因为源程序在编译的时候,变量(常量)在内存中的位置都计算好了。程序装入内存时,系统不会为它重定位。编程时需要用到变量(常量)的时候直接用变量(常量)名访问,编译后就通过偏移(指针)地址访问。这与JMP或者CALL指令的段内转移不同,因为段内转移的指令在编译的时候使用位移计算。虽然代码在内存中的实际地址无法确定,但是在程序中所有代码之间相互的偏移量是固定不变的。因此,无论病毒程序被插入到宿主程序哪里,段内转移都会正确执行。

     实现方法如下:

内存地址重定位-LMLPHP

     执行call GetActualAddr后,栈顶的值即指令pop  ebp的地址,注意栈中的地址是程序在内存中的实际地址。执行pop ebp之后,ebp中的值就成了这个实际地址。标号GetActualAddr是一个常量,即由编译器计算好的地址常量,我们暂且称其为原地址。两者的差就是我们要得到的最终值,即所有原地址和实际地址的“位移”。我们在程序中,所有使用到这类常量的时候,都应该加上这个“位移”值。 

内存地址重定位-LMLPHP
09-22 07:10