代码重定位技术一般用于远程线程注入和病毒感染技术当中,当注入和感染的代码使用了全局变量,全局变局的地址就需要进行重定位,否则代码无法正常执行。这是因为,代码注入其他进程空间以后,注入的位置跟原来程序中的位置不一样,而全局变量在汇编层其实就是一个偏移,因此无法再通过原来的偏移找到全局变量了。
既然如此,我们只要找到注入位置的差值,我们就能一直准确定位到我们想要的全局变量了。
所以写入到目标进程的代码一开始就会计算出注入位置的差值,下面的代码就是用来计算差值,然后通过差值就可以找全局变量,一般来说不直接使用全局变量或者标号的偏移量。
下面是重定位的经典代码
dwvar dd ? ;全局变量
call @F
@@:
pop ebx
sub ebx,offset @B
mov eax,[ebx + offset dwvar]
首先调用call @F,@F是指后面最近的@@标号,我们知道call指令其实相当于push eip,jmp xxx,所以下一句pop ebx会使ebx得到eip的值,这个值其实就是代码注入位置。
然后再看sub ebx,offset @B,@B是指前面最近的@@标号,这个@B在注入之前和注入之后都是同一个值,它永远不会变。
offset @B在注入之前的程序中就已经写死,是指@@的偏移量,而ebx此时也是指@@的偏移量,它们不同的是:前者永远不会变,而后者会因为进程的不同而变化。所以执行过sub ebx,offset @B以后ebx中保存的就是注入位置的差值。
既然找到差值了,就可以使用[ebx+offset xxx]的方式使用全局变量了!