Virus 版 (精华区)

发信人: Kernel (好冷), 信区: Virus
标  题: 关于病毒重定向(转载)
发信站: 哈工大紫丁香 (Tue Dec  2 22:57:54 2003), 站内信件


关于病毒重定向
By whale/CVC.GB

以前就写过一篇,后来被我弄丢了。本来就不想写啦。但今天有个朋友问到这个问题索性
再写一篇(主要是N多高手对这个都不屑一顾,唉。。我菜那就我写吧~)。写出来了就等
着大家的批评呢~~~不批评你们才不够意思呢“)对了,特别感谢PKXP,JACK
。。的帮助。没他们我还不知道要想到什么时候呢:)
病毒的生存空间就是宿主程序,而因为宿主程序的不同。所以病毒每次插入到宿主程序中
的位置也不同。那么病毒需要用到的变量的位置就无法确定。所以这就是病毒首先要重定
位的原因。在我们编写程序的时候,所用到的变量的位置都是相对与程序某一个位置的偏
移,正常的程序加载的地址是唯一的,所以它们不需要重定位。而病毒的加载是随机的所
以就有了重定位的过程。虽然加载的位置不一定,但是变量到某一个位置的偏移却是固定
的。所以重定位的基本原理就是找到这个特殊的位置。具体的方法有很多种。这里说几种
常见的。
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到vs
tart的偏移,这样就得到了vstart在内存中的位置了。在确定其它的变量的时候只要用EB
X加上这个这个变量到vstart的偏移就可以了(即 add ebx,offset xxx -offset vstart)
.
以上两中最为常用,再说个要注意的问题,比如:
  call vstart
aa: mov eax,1
      ..
      ..
vastart: pop ebx
  sub ebx,offset vstart
像这样的代码就不能起到重定位的作用,因为pop ebx得到是aa的地址,用aa的地址减去v
start到定位点的偏移得到的是什么呢?谁知道啊,我是不知道"),想让上面的代码起到定
位的作用只要改一下减去的偏移就可以了。
call vstart
aa:mov eax,1
     ..
     ..
vastart:pop ebx
 sub ebx,offset aa
对了,这里是不用理会aa:mov eax,1下面的代码的(当然如果有POP或PUSH那就不行了)还
要唠叨一下,其实重定位就是要找到一个起点,其它的变量都要根据他来找到自己哦,所
以不管你用什么方法只要找到了这个起点就可以实现重定位了。
不对的地方大家就使劲的批评吧。。。。 

其实还有一种不常用但有时会很有用的方法,就是删除宿主的Relocation表,让它无法重
定位,然后在感染时再计算出病毒位置的RVA值,就是病毒的基地址.

--

※ 来源:.哈工大紫丁香 bbs.hit.edu.cn [FROM: 218.108.199.61]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.541毫秒