转一篇看雪的病毒重定位的帖子

以下是原帖的内容,作者是xfish,谢谢xfish的付出! 

Code

文章无疑是好文章,但是我觉得还是有问题的,即文章里的“call指令是将下一句指令的偏移压入堆栈”,从如果压入的是指令的偏移,那就谈不上重定位了,因为这个偏移值无论是在病毒体中还是在中毒的程序中都是不会变的。关于这点我也用OD打开一个简单的程序看了一下,事实上call指令压入堆栈的内容应该是下条指令的绝对地址,而在以上给出的程序中,标号szText Dels Dels2都是病毒编译时就已经编译好了的绝对地址,这个地址是永远不会变的。

那么,重定位的过程可以这样来过一边:

1、病毒编译的时候将各标号的绝对地址先编译好,无论病毒是否感染,这个地址都是不变的

2、当病毒感染到目标程序以后,标号所对应的代码的地址发生了改变

3、通过调用call指令,压入标号对应的代码的实际地址,然后在子函数中通过pop指令获得这个实际地址(此处应该注意,如果是使用高级程序语言编译的程序应该再将pop出的值再压回堆栈去,因为编译器会在程序中自动加入pop call压入的值的指令)

4、然后通过如下公式就能够得到病毒体中任意变量在被感染程序中的实际地址了:标号A实际地址-标号A原地址=目标实际地址-目标原地址,公式变换一下可以得到:目标实际地址=标号A实际地址-标号A原地址+目标原地址,也就是xfish给出的那个公式了。

posted @ 2009-10-27 20:59  认真做人,认真做事  阅读(822)  评论(0)    收藏  举报