7.sub_403C44子函数
继续在OD中分析sub_403C44子函数。
第一步,查看[EBP-8]地址对应的值。
在数据窗口中,可以看到eax的值为ebp+var_8的地址,通过OD可以知道,这个地址中保存的是0,可以理解为没有数据。
- 00 00 00 00
第二步,我们按下F7进入这个call,查看具体内容。
- 0x0040812E call 00403C44
可以看到,它首先是将EAX的内容赋值给EDX,我们按下F8可以看到EDX也变成了0值。
- mov edx, dword ptr ds:[eax]
步过mov edx, dword ptr ds:[eax],寄存器的值是下图:
之后的test运算,使得ZF变为1,满足跳转条件,直接跳转至retn,那么本段函数也就结束了。
刚才我们通过test edx, edx发现ZeroFlag标志位变成了1。这个标志位变为1,说明这个值是一个0,这段函数似乎并没有实现什么特别清晰具体的功能,那么不妨将这个操作理解为某种标志的设置。
总结,重命名及对应功能如下:
- sub_403C44 -> SetZeroFlag
- 功能:设置零标志位重设,将其设置为0
8.sub_403ECC子函数
回到OD,我们分析sub_403ECC子函数。
第一步,查看并分析[EBP-4]保存的内容。
- mov eax, dword ptr ss:[ebp-0x4]
在数据窗口中跟随,可以看到“MZP”,这里大致是保存了一个PE文件,事实上就是将这个PE文件的首地址赋值给这个EAX,接着看看这个call。
第二步,分析call 403ECC函数。
按下F7进入这个call函数,首先调用“TEST EAX, EAX”验证PE文件是否存在。
按下F8继续,这里是跳转不成立,然后出现在EAX-4位置,我们在数据窗口中跟随内容。
mov eax, dword ptr ds:[eax-0x4] 小技巧 这里需要特别强调的是,由于本病毒程序是使用Delphi编写的,因此字符串的首地址减去4后,所取出的4个字节的内容就是此字符串的长度。
换句话说,这段代码中的[eax-4]就是eax所指向的文件长度,字符串长度就是EC00,这条语句就是将EC00保存在寄存器里面。于是可以将sub_403ECC重命名。
字符串长度:EC00 现在EAX保存的就是字符串的长度,即PE文件的长度
总结,重命名及对应功能如下:
- sub_403ECC -> GetFileLen
- 功能:获取PE文件的长度
之前这个文件的长度是保存在EAX里面,这里又将文件长度赋值给EBX。
接下来,在获取文件长度后,程序会跳转到loc_408163处执行。首先它会验证EBX是否为零(文件长度是否为0),正常来说文件长度是不为0的,也就是这个文件是真实存在的,所以接下来的跳转不成立,会继续往下执行。
test ebx, ebx jle short loc_408171 mov eax, [ebp+var_4]
接着我们尝试用OD进行分析,跳转到0x00408163的位置。按下F2增加断点,再按F9让它执行过来。
按下F8继续执行,这里是将 [EAX+EBX-1],由于EAX指向的是文件起始地址,而EBX是文件的长度,减一是获取整个PE文件最后一个字符它是什么。事实上,CMP语句就是验证这个文件最后一个数据它是否为零,如果为0,则接下来的跳转不成立。
cmp byte ptr [eax+ebx-0x1], 0x0
经过OD的动态分析发现,因为这里显示跳转未实现,故文件尾端的值为0,所以不执行跳转,继续向下执行。
9.总结
写到这里,该部分关于sub_408024核心函数的部分功能就介绍完毕
0x0040804D call sub_40277C
– 重命名为:GetFilePathAndName
– 功能:获取文件的完整路径及文件名称
0x0040805E call sub_405684
– 重命名为:GetFilePath
– 功能:获取去除病毒文件名后的路径
– IDA位置:0x0040805E
– 技巧:循环将病毒的完整路径从后往前检索,直到遇到斜杠(\)、反斜杠(/)、冒号(:)结束,从而提取病毒的路径或病毒的文件名(如setup.exe)
0x0040806E call sub_403ED4
– 重命名:StringCat
– 功能:拼接字符串,包含“Desktop_.ini”后缀
0x00408079 call sub_4057A4
– CheckFileExist
– 功能:检测文件“Desktop_.ini”是否存在
0x00408105 call sub_4040CC
– CheckPathIsExist
– 功能:检测文件的路径是否存在
0x00408126 call sub_4078E0
– WriteVirusInfoToMem
– 功能:写入病毒信息到内存中,病毒作者企图利用暴力P解的方式,来攻破计算机中的某些验证机制
0x0040812E call sub_403C44
– SetZeroFlag
– 功能:设置零标志位,将其设置为0
0x00408136 call sub_403ECC
– GetFileLen
– 功能:获取PE文件的长度
CMP语句就是验证PE文件最后一个数据是否为零
希望大家可以有所收获!!!