病毒中的重定位技术
数码时尚
每当我们谈起病毒,很多人都会感到恐惧。当大家对它有所了解后,就会明白病毒也是由一些正常的代码组成的。本文谈到的重定位技术,它作为病毒技术中最基础的知识,同时也是军事和加密软件要用到的基本技术。
一、重定位的原因
都说病毒第一步要重定位,原因是我们写正常程序的时候根本不用去关心变量(常量)的位置,在编译源程序的过程中,它在内存中的位置都被计算好了。当我们需要用到变量(常量)的时候直接用变量名访问它就行了。
二、如何重定位
学过编程的人会知道call是一条函数调用指令,也可以当成跳转指令。
现在让我们总结一下重定位的基本步骤(这里假设下一条指令为I1):
1.用call指令跳转到下一条指令,使I1在内存中的实际地址进栈。
2.用pop或mov exx,[esp]取出栈顶的内容,这样就得到了I1的地址(Base)。
3.其他指令(变量、常量)的实际地址就等于Base+(offset Label - offset vstart)。
三、实例说明
现在,就让我们看一下重定位的具体代码是怎么实现的:
call vstart
vstart:
pop:ebx;定义为I1指令
这里vstart标号的位置就是I1的位置。call vstart跳到vstart,然后用pop ebx把堆栈顶端的内容(即vstart在内存中的地址)放到ebx。以后用到其他变量的时候就可以用ebx+(offset xxx-offset vstart)得到其在内存中的真正偏移地址了。
下面再谈具体一点。譬如我们想取变量abc的内容时,则可先取地址到esi中,然后使用moveax,[esi]指令即可得到abc的内容。
abc dd 0
......
call vstart
vstart: pop ebx
......
lea esi,[ebx+(abc-vstart)]
上面我们提到偏移地址可以通过ebx+(offsetXXX-offset vstart)计算得到。
另外,在实际过程中还会碰到其他重定位方式,并且需要重定位的绝对不仅局限于变量和常量,不过它们的原理都是一样的。