今天写个关于病毒的,其实我所写的东西所是想到什么写什么,或者今天收获什么就写什么。很乱。
病毒一般不独立存在,而是附在宿主中,很像生物病毒。关于病毒的特性有很多资料,我这里不多说。
在病毒编写的时候是独立编译,而附在宿主时候成了某个程序的“附属物”。
什么叫重定位,我也不能确切的说,但是我给出个例子,就能明白了。
比如病毒代码里存在变量a,b。这个变量在编译后实际上拥有固定的“编译地址”,也就是程序独立存在的时候这些变量的空间,逻辑关系应该都是不变的(因为编译后就成了一堆死的二进制代码),但是当病毒附在宿主后整体的逻辑,空间地址就会发生变化,起码它必须以宿主为参照物,当然还有其他变化。这样(附体)以后,实际地址和“编译地址”就不一样了,也就是此事根据实际地址访问的不再是以前的变量a,b了。为了纠正程序的地址改变,必须使用重定位。(自己都感觉很啰嗦)
简单的重定位可用几句汇编代码实现:
call begin //程序转到begin,并且将begin地址压入堆栈
begin:
pop eax //将begin地址存到eax
sub eax offset begin //得到两者之间的差值
我们实现重定位(也就是就计算实际地址)时,只要将这个差值加上就可以了,即:实际地址=编译地址+差值。
似乎有点含糊。。。