仅用于信息防御学习,请勿用于非法用途!!!
目录
一、实验环境
二、函数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
IDA中进入函数sub_408024,在函数最开始的位置,将0x84赋值给ecx,作为循环的次数。接着是两个push,每个push可以申请32位的栈空间,两个push就可以申请8字节(64位)空间,这样的申请一共进行了0x84次。
在ollyDbg中,直接跳转到0x40804D处,对该函数进行动态分析。
可以看到调用了函数GetModuleFileName来获取当前进程已加载模块的文件的完整路径。其中“PathBuffer”的数据所在的地址中会保存文件的完整路径的信息。按F8步过,可见数据窗口会保存文件完整路径信息。
在IDA中将函数sub_40277C重命名为“GetFilePathAndName”.
在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“。
可以看到,[ebp-3B4]中保存的值为0x009B0144,而该地址对应的数据如下图所示,即不带文件名的文件路径。
接着是将0x40862C赋值给edx,地址0x40862C对应的数据如下:
在IDA中进去函数403ED4进行分析,一眼看不出什么。
不妨,步过函数,观察数据窗口发生了什么。
可以看到,刚刚不带文件的路径名后,增加了一个”Desktop.ini“,组成新的字符串。
由此,我们可以的得出函数sub_403ED4的功能:拼接字符串。
进入IDA,对sub_403ED4进行重命名:StringCat。
在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文件的。
在IDA中,进入到函数sub_40400CC。
其参数[ebp+var_3C4],事实上3C4就是文件的路径 ,可见这个函数用于检测待删除的文件路径是否为空。那么就可以将sub_4040CC重命名为:CheckPath。
在IDA中,进入函数sub_4078E0,可以发现该函数很长,且调用了很多新的函数,很难分析清楚该函数究竟干了些什么。那么可以先不管其具体实现细节,只看函数执行完后,它的参数或者寄存器里保存的地址发生了什么变化。
步过函数,可以看到:
该函数利用了很大的一片区域来写入了大量看似无意义的字符。结合右边分析出的ASCII码,发现这些可以理解为是一个暴力破解字典,病毒编写者企图利用暴力破解的方式,来攻破计算机中的某些验证机制。
在IDA中,将sub_4078E0函数重命名为:WriteVirusInfoToMem 。
在OllyDbg中,跳转到函数附近,并且查看参数。
F7进入函数sub_403C44。
首先,将eax中保存的地址的值赋给edx,验证edx是否为空,为空,则将ZF位置1,然后执行跳转命令,函数就结束了。因此,将函数sub_403C44可以理解为标志位的设置。
在IDA中,将函数sub_403C44重命名为:SetZeroFlag。
在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。