第4篇 熊猫烧香逆向分析(中)

仅用于信息防御学习,请勿用于非法用途!!!

目录

一、实验环境

二、函数sub_408024分析

1、函数sub_ 40277C分析

2、函数sub_ 405684分析

3、函数sub_ 403ED4分析

4、函数sub_4057A4分析

5、函数sub_4040CC分析

6、函数sub_4078E0分析

7、函数sub_403C44分析

8、函数sub_403ECC分析


一、实验环境

        实验环境:windows xp sp2
        病毒样本:87551e33d517442424e586d25a9f8522(MD5值)
        软       件:PEiD、OllyDBG、IDA pro

二、函数sub_408024分析

        IDA中进入函数sub_408024,在函数最开始的位置,将0x84赋值给ecx,作为循环的次数。接着是两个push,每个push可以申请32位的栈空间,两个push就可以申请8字节(64位)空间,这样的申请一共进行了0x84次。

1、函数sub_ 40277C分析

        在ollyDbg中,直接跳转到0x40804D处,对该函数进行动态分析。

         可以看到调用了函数GetModuleFileName来获取当前进程已加载模块的文件的完整路径。其中“PathBuffer”的数据所在的地址中会保存文件的完整路径的信息。按F8步过,可见数据窗口会保存文件完整路径信息。

         在IDA中将函数sub_40277C重命名为“GetFilePathAndName”.

2、函数sub_ 405684分析

        在OllyDbg中跳转到0x40805E处,首先查看EAX、EDX中保存的内容。

        进入函数sub_405684,可见又出现了循环,直接来到循环出进行检查。  

        可以看到,将[ebp-4]处的内容赋值给eax,[ebp-4]处的内容就是之前获取的病毒的完整路径。

​         mov al,byte ptr [eax+ebx-1]:

​         注:凡是Delphi所编写的程序,它会在字符串减4的位置保存一个数值,这个数值就是字符串的长度。而ebx保存的正是这个字符串的长度。

         [eax+ebx-1]:计算字符串最后一个字母的位置,即“e”。

        ​ 继续按F8执行,结合IDA分析0x5C、0x2F、0x3A对应的值。

 

        0x5C代表'\'、0x2F代表’/‘、0x3A代表':'。

​         直接跳出循环,单步步过,在调用40412C函数后,数据窗口出现变化。

 

         由此,可以得出,函数sub_405684的作用是获取病毒文件所在路径。在IDA中,将函数sub_405684重命名为”GetFilePath“。

3、函数sub_ 403ED4分析

         可以看到,[ebp-3B4]中保存的值为0x009B0144,而该地址对应的数据如下图所示,即不带文件名的文件路径。

         接着是将0x40862C赋值给edx,地址0x40862C对应的数据如下:

         在IDA中进去函数403ED4进行分析,一眼看不出什么。

         不妨,步过函数,观察数据窗口发生了什么。

        可以看到,刚刚不带文件的路径名后,增加了一个”Desktop.ini“,组成新的字符串。

​        由此,我们可以的得出函数sub_403ED4的功能:拼接字符串。

​        进入IDA,对sub_403ED4进行重命名:StringCat。

4、函数sub_4057A4分析

        在OllyDbg中转到0x408073位置,在数据窗口查看[ebp-3B4]保存的值所在的地址中的数据。

 

         可以看到,是我们之前已经连接好的字符串的首地址。

        ​ F8步过,按F7步入函数4057A4。

         同样,步入函数40573C。按F8执行到函数FindFirstFileA()调用前的位置。

        可以看到,EAX存放的是拼接字符串的首地址。因为函数FindFirstFileA()的功能是查找指定目录的第一个文件或目录并返回它的句柄 。

        ​ 所以,程序调用该函数的目的是:查找“C:\Documents and Settings\Owner\桌面”目录下的"Desktop.ini"文件是否存在。

​         返回IDA,查看函数函数40573C、函数4057A4的执行流程图,可以发现,如果“C:\Documents and Settings\Owner\桌面”目录下的"Desktop.ini"文件存在,函数4057A4基本上只会调用FindFirstFileA()。故,函数4057A4的主要功能:检测文件是否存在。

 

         在IDA中,将函数4057A4重命名为“CheckFileExist”。接下来有:

根据调用函数CheckFileExis的结果,进行跳转,即:

  • 如果当前目录下Desktop_.ini文件不存在,程序直接跳转到408110处;

  • 如果当前目录下Desktop_.ini文件存在,那么就将该文件的文件属性调整为NORMAL ,且停止1ms后,

    将Desktop_.ini文件删除。

    其中有一个未知函数sub_40400CC,对其进行分析。

    注:正常情况下,在病毒没有运行时,是不会存在Desktop_.ini文件的。

5、函数sub_4040CC分析

        在IDA中,进入到函数sub_40400CC。

         其参数[ebp+var_3C4],事实上3C4就是文件的路径 ,可见这个函数用于检测待删除的文件路径是否为空。那么就可以将sub_4040CC重命名为:CheckPath。

6、函数sub_4078E0分析

        在IDA中,进入函数sub_4078E0,可以发现该函数很长,且调用了很多新的函数,很难分析清楚该函数究竟干了些什么。那么可以先不管其具体实现细节,只看函数执行完后,它的参数或者寄存器里保存的地址发生了什么变化。

 步过函数,可以看到:

        该函数利用了很大的一片区域来写入了大量看似无意义的字符。结合右边分析出的ASCII码,发现这些可以理解为是一个暴力破解字典,病毒编写者企图利用暴力破解的方式,来攻破计算机中的某些验证机制。

        ​ 在IDA中,将sub_4078E0函数重命名为:WriteVirusInfoToMem 。

7、函数sub_403C44分析

        在OllyDbg中,跳转到函数附近,并且查看参数。

         F7进入函数sub_403C44。

        首先,将eax中保存的地址的值赋给edx,验证edx是否为空,为空,则将ZF位置1,然后执行跳转命令,函数就结束了。因此,将函数sub_403C44可以理解为标志位的设置。

        ​ 在IDA中,将函数sub_403C44重命名为:SetZeroFlag。

8、函数sub_403ECC分析

        在OD中跳转到函数参数位置。

         查看[ebp-4]保存的地址处的内容,可以看到“MZP”,这里大致是保存了一个PE文件。如果从“MZP”看不出来是PE文件,将数据窗口往下拉,可以看到PE字样,从而确定是将这个PE文件的首地址赋值给这个EAX。

 进入函数sub_403ECC

        使用test命令,可以理解为:验证PE文件是否存在。

        ​ 按F8步过,这里跳转不成立,然后下一条语句:

        ​ mov eax,dword ptr [eax-4]

        ​ 注:由于本病毒程序是使用Delphi编写的,因此字符串的首地址减去4后,所取出的4个字节的内容就是此字符串的长度。

        也就是说,eax中保存的是PE文件的文件长度。

        在IDA中将函数sub_403ECC重命名为:GetFileLen。

猜你喜欢

转载自blog.csdn.net/qq_55202378/article/details/126887707