飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2862|回复: 0

Win32 PE病毒原理分析2

[复制链接]
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2010-5-27 17:46:57 | 显示全部楼层 |阅读模式
    本帖最后由 whypro 于 2010-5-27 17:50 编辑

    一、Win32 PE病毒原理
    为了更好地发展反病毒技术,了解病毒的原理是极为必要的。一个Win32 PE病毒基本上需要具有以下几个功能,或者说需要解决如下几个问题:

    1.病毒的重定位
    (1)病毒为什么需要重定位

    都说病毒第一步要重定位,那到底为什么要重定位呢?我们写正常程序的时候根本不用去关心变量(常量)的位置,因为源程序在编译的时候它的内存中的位置都被计算好了。程序装入内存时,系统不会为它重定位。编程时我们需要用到变量(常量)的时候直接用变量名访问(编译后就是通过偏移地址访问)就行了。

    病毒不可避免也要用到变量(常量),当病毒感染HOST程序后,由于其依附到HOST程序中的位置各有不同,病毒随着HOST载入内存后,病毒中的各个变量(常量)在内存中的位置自然也会随着发生变化。
    Snap1.gif


                a)病毒在感染前的Var位置           b)病毒感染HOST后Var的位置

                                        图1 病毒的重定位

    如图1所示,病毒在编译后,变量Var的地址(004010xxh)就已经以二进制代码的形式固定了,当病毒感染HOST程序以后(即病毒相关代码直接依附到HOST程序中),由于病毒体对变量Var的引用还是对内存地址004010xxh的引用(病毒的这段二进制代码并不会发生改变),而004010xxh地址实际上已经不是存放变量Var了(图5.1例子中的该位置是在HOST程序中)。这样,病毒对变量的引用不再准确,势必导致病毒无法正常运行。

    既然如此,病毒就非常有必要对所有病毒代码中的变量进行重新定位。

    (2)病毒如何重定位

    在讲解重定位方法之前,我们有必要复习一下call指令。

    call指令一般用来调用一个子程序或用来进行转跳,当这个语句执行的时候,它会先将返回地址(即紧接着call语句之后的那条语句在内存中的真正地址)压入堆栈,然后将IP置为call语句所指向的地址。当子程序碰到ret命令后,就会将堆栈顶端的地址弹出来,并将该地址存放在IP中,这样,主程序就得以继续执行。

    假如病毒程序中有如下几行代码:

    call delta      ;这条语句执行之后,堆栈顶端为delta在内存中的真正地址

    delta:  pop ebp         ;这条语句将delta在内存中的真正地址存放在ebp寄存器中

            ……

            lea eax,[ebp+(offset var1-offset delta)]

    ;这时eax中存放着var1在内存中的真实地址


    当pop语句执行完之后,ebp中放的是什么值呢?很明显是病毒程序中标号delta处在内存中的真正地址。如果病毒程序中有一个变量var1,那么该变量实际在内存中的地址应该是ebp+(offset var1-offset delta),即参考量delta在内存中的地址+其它变量与参考量之间的距离=其它变量在内存中的真正地址。有时候我们也采用(ebp-offset delta)+offset var1的形式进行变量var1的重定位。当然还有其它重定位的方法,但是它们的原理基本上都是一样的。这里不在叙述。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表