该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
病毒的生存空间就是宿主程序,而因为宿主程序的不同。所以病毒每次插入到宿主程序中的位置也不同。
那么病毒需要用到的变量的位置就无法确定。所以这就是病毒首先要重定位的原因。在我们编写程序的时候,
所用到的变量的位置都是相对与程序某一个位置的偏移,正常的程序加载的地址是唯一的,所以它们不需要
重定位。而病毒的加载是随机的所以就有了重定位的过程。虽然加载的位置不一定,但是变量到某一个位置
的偏移却是固定的。所以重定位的基本原理就是找到这个特殊的位置。具体的方法有很多种。这里说几种常见的。
1。call vstart
vstart: pop ebx
sub ebx,offset vstart
这种是最简单的。首先得到vstart在内存中的实际地址。offset vstart得到了vstart到这个特殊位置的偏
移,(下文用定位点代替)那么用vstart的在内存中的实际地址减去它到定位点的偏移就可以等到定位点在内
存中的地址了。在确定其它的变量的时候就可以用这个定位点加上变量的偏移了(即 add ebx,offset xxx).
2。vstart:
call getvs
getvs:
call getvs_01
getvs_01:pop ebx
sub ebx,offset getvs_01 - offset vstart
这种方法在原理上是一样的,只是把定位点具体成为vstart了,上面的代码就为是为了找到vstart在内存中的具
体位置。首先得到getvs_01在内存中的位置,然后减去get_01到vstart的偏移,这样就得到了vstart在内存中
的位置了。在确定其它的变量的时候只要用EBX加上这个这个变量到vstart的偏移就可以了
(即 add ebx,offset xxx -offset vstart).
以上两中最为常用,再说个要注意的问题,比如:
call vstart
aa: mov eax,1
..
..
vastart: pop ebx
sub ebx,offset vstart
像这样的代码就不能起到重定位的作用,因为pop ebx得到是aa的地址,用aa的地址减去vstart到定位点的偏移
得到的是什么呢?谁知道啊,我是不知道"),想让上面的代码起到定位的作用只要改一下减去的偏移就可以了。
call vstart
aa:mov eax,1
..
..
vastart:pop ebx
sub ebx,offset aa
对了,这里是不用理会aa:mov eax,1下面的代码的(当然如果有POP或PUSH那就不行了)还要唠叨一下,其实重
定位就是要找到一个起点,其它的变量都要根据他来找到自己哦,所以不管你用什么方法只要找到了这个起点就可以
实现重定位了。