1、loc_408171
第一步 打开IDA Pro和OD载入病毒样本
打开OD转到00408171 按下F2增加断点,运行到这个地方
思考:OD重新打开断点为什么还保留着?
在OllyDbg中,它会把所有与程序后模块相关的信息保存在单独的文件中,以便在模块重新加载时继续使用。这些信息包括标签、注释、断点、监视、分析数据、条件等。
第二步,在OD中分析0x00408171位置。
首先是一个CMP比较操作(Compare),接着查看EBP-0x8的内容。
- 0x00408171 cmp dword ptr ss:[ebp-0x8], 0x0
我们可以看到它内容是0,它的比较对象也是0
第三步,分析JNZ跳转指令。
接着按下F8,可以看到比较后,ZF变成了1。由于二者都为0,所以在比较过后ZF=1,那么接下来的跳转并不执行,继续执行下面的内容。
JNZ 0x004082F0
JNZ(jump if not zero)结果不为零则转移,即z=1时跳转,但是z=1时,zf=0。故JNZ跳转的条件也是零标志位zf=0,由于指令执行的结果为0,此时的ZF值为1,故不执行跳转
CF(进位标志)=1:算术操作最高位产生了进位或借位,=0 最高位无进位或借位 ;
PF(奇偶标志)=1:数据最低8位中1的个数为偶数, =0 数据最低8位中1的个数为奇数;
AF(辅助进位标志)=1:D3→D4位产生了进位或借位, =0 D3→D4位无进位或借位;
ZF(零标志)=1:操作结果为0, =0 结果不为0;
SF(符号标志)=1:结果最高位为1,=0 结果最高位为0;
OF(溢出标志)=1:此次运算发生了溢出, =0 无溢出。
在这里插入图片描述
第四步,分析函数sub_40532C。
在IDA中继续查看代码内容。
C:\Users\14551\Desktop\setup.exe
接下来将EDP-0x3D4赋值给EDX,F8执行并在数据窗口中跟随,发现它此时还是空值。
进入函数
发现该函数的主要功能是API函数CharUpperBuffA。
- CharUpperBuffA函数作用:把缓冲区中指定数目的字符转换成大写字母
总结,重命名及对应功能如下:
- sub_40532C -> CharToUpper
- 功能:缓冲区中指定数目的字符转换成大写字母
第五步,分析函数sub_4054BC。
在IDA中双击查看该函数的内容。可以发现它主要是调用了GetSystemDirectory函数,从而获取系统的路径。
总结,重命名及对应功能如下:
- sub_4054BC -> GetSystemDir
- 功能:获取系统路径
2、sub_403F8C子函数
第一步,我们让OD跳转到0x004081AB的位置。
直接按F8执行下来,在这里可以看到PUSH是将刚才利用GetSystemDirectory函数所获取的系统路径字符串进行压栈。
压栈内容为system32这个目录。
- C:\Windows\system32
第二步,按下F8继续分析,发现它又将drivers压栈,将spoclsv.exe字符串压榨。
- drivers
- spoclsv.exe
注意,上图仅显示了setup.00408658,没有将具体的值显示出来。
思考:OD中如何查看堆栈中的值?
选中ESP堆栈指针寄存器(主要用于存放堆栈内存储单元的偏移量),在“堆栈窗口中跟随”。然后依次选择值“0x00408644”和“0x00408658”,右键在“数据窗口中跟随”,即可查看堆栈中的值。
发现对应的值为“drivers”和“spoclsv.exe”,如下图所示。
写到这里,我们可以推测:下面这个函数的功能是将压入堆栈的字符串进行拼接,成为一个新的路径。
第三步,按下F8执行到这个Call函数进行分析。
按下F8执行过来后,选中EAX在数据窗口中跟随。
EAX是累加器(accumulator),它是很多加法乘法指令的缺省寄存器。
EBX是基地址(base)寄存器, 在内存寻址时存放基地址。
ECX是计数器(counter),是重复(REP)前缀指令和LOOP指令的内定计数器。
EDX则总是被用来放整数除法产生的余数。
在数据窗口中右键“转到”->“表达式”,然后输入值:
- 01C67E28
接着再CALL函数处按下F8,我们需要关注数据窗口中的前后变化情况。我们可以看到它新生成了一个路径字符串。
- C:\Windows\system32\drivers\spoclsv.exe
总结,重命名及对应功能如下:
- sub_403F8C -> TwoStringCat
- 功能:将两个字符串进行连接
3、sub_4060D4子函数
事实上,这段程序的功能如下:
- 首先通过这个函数将字符串连接;
- 再将路径字符串转换为大写字母;
- 然后将这个字符串与这里进行对比。
第一步,我们通过OD来分析下比较功能,在OD中执行到4081E3位置,然后按F9执行过去。
- 0x004081E3 call sub_404018
第二步,分析sub_404018函数。
我们在这里看下它比对的是什么字符串,在数据窗口中跟随值,可以看到两个字符串分别是拼接的字符串和当前OD分析程序的字符串。
C:\USERS\14551\DESKTOP\SETUP.EXE
C:\WINDOWS\SYSTEM32\DRIVERS\SPOCLSV.EXE
很明显,我们分析的熊猫烧香病毒程序在桌面上,而比对的是DRIVERS路径下。
sub_404018函数的目的是分析当前这个程序是不是drivers目录下的这个程序,如果是的话执行一段代码,否则执行另一段代码。
因为目前不是在drivers路径下,因此它执行另一段代码,我们按下F8继续执行。JE跳转不成立,继续出现一个新的CALL。
- 0x004081F3 CALL setup.004060D4
第三步,sub_4060D4函数的参数分析。
该函数存在一个参数存在EAX中,通过数据窗口跟随发现值为:
- spoclsv.exe
我们回到IDA查看该函数的基本组成,双击进入sub_4060D4函数。可以看到这个函数非常长,并且内部包括很多CALL函数,如果说一个个CALL分析,会发现它调用了很多的API函数。通过分析归纳该函数的作用如下:
查找当前内存中指定的进程,即查找当前是否有spoclsv.exe这个进程
总结,重命名及对应功能如下:
- sub_4060D4 -> SearchAndTerminateProcess
- 功能:查找当前内存中的指定进程,若存在,则将其终止
4、CopyFile和WinExe子函数
在CopyFile函数位置我们停下来分析。
- 0x004082A6 call CopyFileA
第一步,我们将OD跳转到文件名0x0040828C的位置,按下F2增加断点。
- 0x0040828C push eax
程序执行过来后,在这里我们跟踪下这个EAX地址。这里可以看到想要拷贝的地址就是刚才我们所连接成的字符串地址。
- C:\Windows\system32\drivers\spoclsv.exe
那么,它所拷贝的内容是什么呢?
第二步,继续分析拷贝文件的内容。
按下F8执行到0x004082A5位置,可以看到它是将当前这个病毒文件复制到drivers目录下,通过CopyFile来实现。
事实上,它是将我们的当前文件改为spoclsv.exe之后,再复制到drivers目录中。
第三步,我们继续往下分析,看到一个WinExec函数。
通过OD来到4082E3位置,我们看看这个参数来判断它想执行什么程序。
第四步,按下F2增加断点,然后F9执行过来,并在数据窗口中跟随EAX值。
可以看到,它实际想执行的就是这个spoclsv.exe程序。也就是说,它在把当前这个病毒样本复制到drivers目录之后,那么这句代码就是将它执行起来。再往下ExitProcess是结束当前正在运行的进程,即熊猫烧香的病毒样本。
注意,当病毒本体将自身复制到“drivers”中并改名后,这里就是对改了名字的病毒程序执行运行的操作,然后主体程序就退出了。如果想继续用OD进行动态分析,要么载入“spoclsv.exe”,要么对之前的一处条件跳转进行修改,令程序以为自己就是“spoclsv.exe”。
第五步,回到跳转位置0x004081E8,对其进行分析。
在OD中跳转到该位置,然后按下F2下一个断点,并执行到断点处。
- 0x0040818 JE 004082F0
正常来说,由于我们当前所分析的程序并不是drivers目录下的那个病毒样本,因此这个跳转是不成立的。这里为了使其成立,可以将JZ修改为JNZ,但是这改变了病毒程序。最好的办法是改变ZF标志位,将原来的0改为1就可以了。
第六步,双击ZF标志位,它会变成1。
双击后可以看到提示“跳转已实现”,现在这个病毒就以为自己是spoclsv.exe。
第七步,按下F8执行到4082F0位置
真正实现病毒功能的也就是“spoclsv.exe”这个程序。
希望大家可以有所收获!!!