接着继续按下F8调试,发现它将字母“b”赋值给了EAX,我们怀疑它跟“xboy”有关。
接下来的代码分析如下:
- MOV ECX, 0xA
将常量“A”赋值给ECX。通常存在两种可能性,一种可能是ECX作为循环的此时,即可能循环A次;另一种可能是EXC作为一个运算的除数。 - XOR EDX, EDX
异或操作将自身清空。 - DIV ECX
可以发现它是一个除法操作,除数即为ECX。结果显示如下图所示,除法的商EAX为9,余数EDX为8。
通常除法有两种可能,要么获取EAX的商值,要么获取余数EDX的内容。那么这个程序究竟需要哪一个值呢?
- MOVX eax, byte ptr ds:[eax+ebx-0x1]
该语句将值赋给EAX,所以上述程序做除法的目的是获取EDX这个值。
接着我们尝试在下列两个位置增加断点。
- 0x004053E8
- 0x00405408
接着按下F9运行,查看输出的结果,分析如下:
- 将“xboy”的第三个字母“o”取出解密
- 数据窗口新增很多内容,完成字符串拷贝
反复继续按F9调试,发现它依次获取“xboy”中的值,再进行异或操作。
小结:最终解密的值如下图所示,“武汉男生感染下载者”逐渐出现。sub_405360函数我们在IDA中重命名为“DecodeString”,即解密字符串。
(6)sub_404018函数分析
第八步,继续分析sub_404018函数的功能。
记住地址0x0040CBA4,复制到OD中进行调试。
首先取消刚才解密的两个断点,然后跟随表达式“40CBA4”,在该位置按下F2增加断点,然后F9执行过来。
首先看到两条赋值语句,将值赋给EDX和EAX中,由于这个程序是使用Delphi编写,所以在call之前会将参数放到寄存器中,我们首先看看EDX中的内容。
在数据窗口中跟随数值,发现它们都是“武汉男生感染下载者”。注意第一个是我们刚才解密出来的内容。
- 0040CBA4 . 8B55 EC mov edx,dword ptr ss:[ebp-0x14]
- 0040CBA7 . A1 D4E74000 mov eax,dword ptr ds:[0x40E7D4]
接着按下F8执行,再按F7进入Call 0040018函数。大致浏览该函数后,发现又存在一个循环,我们的重点就是分析该循环,按下F2增加断点,再按F9执行过来。
- 0x00404041
在数据窗口中跟随,发现ECX和EBX就是刚才所说的两个参数,一个是原始的“武汉男生感染下载者”,另外一个是解密之后的“武汉男生感染下载者”。再按F8发现这个函数比较两个字符串是否相同的操作。
- CMP ECX, EBX
总结:回到IDA,我们将函数sub_404018重命名为字符串比较函数“CMPString”。
(7)loc_40CBBC功能分析
继续分析发现这里同样存在字符串解密和字符串比较的操作,并且解密字符编程了武汉男孩(whboy),这里不再进行解读。
解密比较成功之后,继续跳转到loc_40CBE6的位置。这里看到了三个call函数,它们又是什么功能呢?这三个call是熊猫烧香病毒最重要的功能,我们下一篇文章继续分析。
四、总结
写到这里,熊猫烧香病毒起始阶段的逆向分析就介绍完毕,简单总结如下:
- 0x0040CB7E call sub_403C98
– 重命名为:AllocStackAndCopyString
– sub_403D08:分配内存空间
– sub_402650:字符串拷贝功能 - 0x0040CB9F call sub_00405360
– 重命名为:DecodeString
– 0x004053CC:循环入口点
– 0x004053E8:获取“xboy”解密字符
– 0x00405408:完成异或解密操作 - 0x0040CBAC call sub_404018
– 重命名为:CMPString
– 0x00404041:循环入口点
– 功能:字符串比较“武汉男生感染下载者” - 0x0040CBCC loc_40CBBC
– 功能:字符串解密和比较操作,解密字符“whboy”
– DecodeString
– CMPString
希望大家可以有所收获!!