当把壳加在软件上(或者病毒感染PE文件/补丁加在软件上)时,在壳代码上定义的变量和常量的地址都会无法访问,因为编译器给壳中变量A生成的地址是A,但是把壳段加在软件上时变量A的地址就不在是A了,为了继续能够寻址到壳的变量,需要对代码重新定位
下面是一个壳中用到的重定位代码:
DepackerCode:
pushad
call CallMe
CallMe:
pop ebp
sub ebp,offset CallMe
一个pushad,一个CALL,学过脱壳的都很熟悉吧,不过这不是重点。。
如果这段代码是独立编译的话,看起来好像很奇怪,因为offset CallMe本来就等于ebp的值了啊,相减的话不等于0吗,等于0有什么用?(解释一下pop ebp获取到call下一行的代码)
但是这段程序不是独立编译的,而是放到其他软件上面运行,所以offset CallMe是本来的地址,而ebp中获取到的是现在的地址
看看OD反汇编代码:
00440060 Z> 60 pushad
00440061 E8 00000000 call ZR.00440066
00440066 5D pop ebp
00440067 81ED F31D4000 sub ebp,ZR.00401DF3
两个相减得到壳加在软件身上产生的偏差,得到这个偏差之后,如果以后要访问其他的变量就可以这么做(401E3B是一个编译器生成的常量的地址)
lea edi,[ebp+401E3B]