熊猫烧香病毒分析
一,查壳
无壳
采用Delphi Borland Delphi 6.0-7.0编写
Delphi编译器倾向于使用寄存器传递前几个参数,寄存器传递可以比堆栈传递更快。
而C++的参数传递方式是在进行函数调用之前,会使用PUSH指令将参数按顺序推入堆栈,然后通过CALL指令调用函数。函数执行完毕后,通过调整堆栈指针来清理堆栈。
二,病毒样本分析
自校验
打开od,载入病毒样本,查看程序入口点
第一个函数00404E8
,步入查看
通过调用GetModuleHandleA()
获得程序基地址(及程序实例句柄)
接下来第二个函数004049E8
,这个函数被连续调用了两次,每次调用之前都传递了两个参数
在内存窗口中看到传递的为字符串
进入函数查看,
内部又调用了三个函数,发现第二个调用的函数的功能为字符串的复制
在内存中查看
这是调用一次这个函数,复制了一部分字符串,总共调用了两次,全部调用完后是这样的(ps:重新启动了一下,存储地址发生变化了)
继续往下看,发现两端相似的代码,但是传递的参数不同,调用的函数相同
先分析405360
两个参数分别指向两个字符串
连个字符串经过如下算法加密后得到一个字符串为
存储地跟在前面存的地址的后面(别问为啥地址又改了,问就是ctrl+f2了)
可以在0040268c
处打断点,然后再内存窗口中查看字符串加密过程,最后变为这个样子
接下来看404018
此时传递的两个参数
一个是最开始存进去的,一个是刚刚加密后生成的,猜测是比较两个字符串,
跑一遍,果然
这个循环遍历两个位置存的字符串,然后进行比较。
故函数405360
是一个加密函数,而函数404018
是一个字符串比较函数。从而判断源文件是否被修改。
下一段相似的代码也一样,检测的字符串发生变化
这两次自校验过程后,继续向下,找到3个连续的调用函数
主要功能函数
程序再调用这三个函数时会进入消息循环,所以可以得知,这三个函数为这个病毒的主要功能
病毒备份
进入第一个函数00408024
一堆函数,这里进入查看就不展示了,都做了注释
先调用GetMoudleFileNameA( )
函数获得程序完整路径,然后在完整路径的基础上去掉程序名得到一个字符串后与Desktep.ini
连接。并通过FindFirstFile( )
函数寻找此文件。如果找到了则删除此文件,否则跳过继续执行。
je setup.00408110
如果没有找到文件就跳转
继续往下
调用ReadFile()
把自己读到内存中,然后调用GetFileSize()
获得文件的大小接着其会判断文件的最后一个字节是不是等于1,意思是等与1就证明其被感染文件随之去执行上方一部分代码块,否则则继续执行。
往下分析,程序会会获取系统路径并与drivers/
和spcolsv.exe
连接成路径并于程序自身路径比较看是否相等,相等则会跳转。
因为程序路径与此路径不匹配,所以其不会跳转。
接下来程序会利用OpenProcrss()函数来提成程序的权限,然后会调用CopyFile()函数把自身复制一份到系统路径的drivers文件夹下,并命名为spcolsv.exe. 创建完之后程序会调用WinExec( )运行此程序,并结束进程。
panda.exe主要是为了在系统目录的driver文件夹下创建病毒的副本spcolsv.exe文件并运行它。这样其在上方判断路径是否相等时就会成立,从而是程序继续往下执行。
再次分析病毒样本,运行来到路径判断处时把ZF取反即可让程序认为自己就时系统目录drivers文件夹下的spcolsv.exe程序了
这里是判断
修改zf的值,就可以继续往下分析
完全感染
来到第二个函数
进来之后也是有三个函数调用,一个一个去分析
第一个进来,调用了CreateThread( )
创建了一个线程。线程函数为0040A180
,我们可以在此函数入口处下断点
这里涉及到多线程调试,在创建的线程入口处下一个断点,在运行完此函数返回后直接跳过后两个函数,这样第二个功能函数返回后,也不执行第三个功能函数,直接让程序进入消息循环。这样当程序返回消息循环后F9运行程序,这是那个新创建的线程已经启动,并且程序断在了我们设置的线程函数入口断点处。
这里又调用了俩函数,反汇编查看00407834
其调用了GetDriveType( ),跟着跑一编,发现会循环遍历A到Z盘,把存在的盘符保存到01F8025C
及以后
接着会把存在的盘符与“:\”连接在一起。
接着会调用004091DC
函数,本想着直接跳过的,可是程序停止运行了,进去看看
把刚才找到存在的盘符与“*_*”连接后,调用FindFirstFileA()
寻找任意文件,如果找不到文件就跳转结束。
这里有文件,不会跳转
全盘感染
接下来是一堆相似的代码
大概功能是对寻找到的文件,获得其扩展名,与对应的字符串进行比较,
这里特殊一点,如果后缀等于GHO
的文件调用DeleteFile()
删除,(GHO
文件时系统备份文件,其是防止系统恢复)
如果是html,asp,php,jsp,aspx
的后缀,跳转到00407AF4
如果是exe,scr,pif,com
的后缀,跳转到004040CC
继续往下
先在已存在得盘得根目录下寻找setup.exe文件与autorun.inf文件。然后如果没有寻找到此文件就跳转。
修改zf的值,跟着跳转,把正在运行得病毒文件复制为setup.exe
接下来继续运行,回到了刚刚的跳转,这次不修改,进去
创建c:\autorun.inf
文件,往文件中写入一下内容后,将setup.exe
与autorun.inf
的属性设为隐藏。
这个函数就差不多了
局域网传播
接下来看第二个函数的最后一个函数
进入此函数,发现其会创建线程,而且是循环创建10次。为了便于对此线程回调函数得分析,在其执行一次创建后就让其返回到消息循环中。
并在线程回调函数处下断点,运行程序将会断在此断点处。
程序停到此线程回调函数入口点后,继续分析
发现此函数会通过端口139和端口445进行区域网传播
这样此函数就分析完了,到此为止我们把前两个功能函数已经分析完了,
设置注册表与关闭杀软
接下来看第三个函数,重新加载程序,修改eip到第三个函数那里,进入函数
发现设置了4个计时器,通过4个计时器的回调函数来完成具体功能
在其计时器回调函数处下断点后我们运行完一个计时器设置函数后直接来到消息循环处。但是我们要注意其有的计时器设置得时间周期较长,我们可以在调用时把时间周期参数该小点。
在第一个调用函数入口点打一个断点,运行到断点处,我们发现其共有3种操作
一是遍历杀毒软件并关闭
二是设置特权
三是关闭任务管理器等一些程序
回到主线程
调用RegCreatekeyExA()---->RegSetValaueExA---->RegCloseKey()
来设置两个启动项,第一个是用来在开机时自动启动病毒。另一个是设置使用户无法查看隐藏文件
接下来看第二个计时器
调用第二个计时器设置函数时把其时间周期参数该小点,改为1000(1s)。然后在分析运行程序。
继续运行,一样的设置回调函数,再创建的线程中下断点,运行程序
调用00403CDC
函数将一段密文与“xboy”进行一定得运算,算法和文件自效验时用的一样。最后得到一个网址。
接下来回从刚才产生得那个网址上试图从网站读取到网页源代码并且运行代码
第三个计时器回调函数‘
这里面又创建了两个回调函数
反汇编查看第二个线程得回调函数发现其利用cmd命令删除了共享文件
第四个回调函数
一样,进下一个线程
主要是删除一些服务和杀毒软件得启动项
好嘞,到这里熊猫烧香就分析的差不多了,第一次分析病毒,有什么不对的地方还请师傅们多多指教。