一,查壳

image-20240307200721943

无壳

采用Delphi Borland Delphi 6.0-7.0编写

Delphi编译器倾向于使用寄存器传递前几个参数,寄存器传递可以比堆栈传递更快。

而C++的参数传递方式是在进行函数调用之前,会使用PUSH指令将参数按顺序推入堆栈,然后通过CALL指令调用函数。函数执行完毕后,通过调整堆栈指针来清理堆栈。

二,病毒样本分析

自校验

打开od,载入病毒样本,查看程序入口点

image-20240307205445686

第一个函数00404E8,步入查看

image-20240308163810820

通过调用GetModuleHandleA()获得程序基地址(及程序实例句柄)

接下来第二个函数004049E8,这个函数被连续调用了两次,每次调用之前都传递了两个参数

在内存窗口中看到传递的为字符串

image-20240308164202849

进入函数查看,image-20240308172402899

内部又调用了三个函数,发现第二个调用的函数的功能为字符串的复制

image-20240308173456349

在内存中查看

image-20240308173858186

这是调用一次这个函数,复制了一部分字符串,总共调用了两次,全部调用完后是这样的(ps:重新启动了一下,存储地址发生变化了)

image-20240308174606279

继续往下看,发现两端相似的代码,但是传递的参数不同,调用的函数相同

image-20240308174824973

先分析405360

image-20240308175816339

两个参数分别指向两个字符串

image-20240308175846311

连个字符串经过如下算法加密后得到一个字符串为

image-20240308175718734

存储地跟在前面存的地址的后面(别问为啥地址又改了,问就是ctrl+f2了)

image-20240308180425135

可以在0040268c处打断点,然后再内存窗口中查看字符串加密过程,最后变为这个样子

image-20240308180806773

接下来看404018

image-20240308180928974

此时传递的两个参数

image-20240308181012038

一个是最开始存进去的,一个是刚刚加密后生成的,猜测是比较两个字符串,

跑一遍,果然

image-20240308191658811

这个循环遍历两个位置存的字符串,然后进行比较。

故函数405360是一个加密函数,而函数404018是一个字符串比较函数。从而判断源文件是否被修改。

下一段相似的代码也一样,检测的字符串发生变化

image-20240308192300541

这两次自校验过程后,继续向下,找到3个连续的调用函数

主要功能函数

image-20240308193722838

程序再调用这三个函数时会进入消息循环,所以可以得知,这三个函数为这个病毒的主要功能

病毒备份

进入第一个函数00408024

image-20240308194644081

一堆函数,这里进入查看就不展示了,都做了注释

先调用GetMoudleFileNameA( )函数获得程序完整路径,然后在完整路径的基础上去掉程序名得到一个字符串后与Desktep.ini连接。并通过FindFirstFile( )函数寻找此文件。如果找到了则删除此文件,否则跳过继续执行。

je setup.00408110如果没有找到文件就跳转

继续往下

image-20240308200942272

调用ReadFile()把自己读到内存中,然后调用GetFileSize()获得文件的大小接着其会判断文件的最后一个字节是不是等于1,意思是等与1就证明其被感染文件随之去执行上方一部分代码块,否则则继续执行。

image-20240308202042166

往下分析,程序会会获取系统路径并与drivers/spcolsv.exe连接成路径并于程序自身路径比较看是否相等,相等则会跳转。

因为程序路径与此路径不匹配,所以其不会跳转。

接下来程序会利用OpenProcrss()函数来提成程序的权限,然后会调用CopyFile()函数把自身复制一份到系统路径的drivers文件夹下,并命名为spcolsv.exe. 创建完之后程序会调用WinExec( )运行此程序,并结束进程。

image-20240309103020380

image-20240309103054763

panda.exe主要是为了在系统目录的driver文件夹下创建病毒的副本spcolsv.exe文件并运行它。这样其在上方判断路径是否相等时就会成立,从而是程序继续往下执行。

再次分析病毒样本,运行来到路径判断处时把ZF取反即可让程序认为自己就时系统目录drivers文件夹下的spcolsv.exe程序了

image-20240309103326369

这里是判断

image-20240309103420720

修改zf的值,就可以继续往下分析

image-20240309103508595

完全感染

来到第二个函数

image-20240309103639935

进来之后也是有三个函数调用,一个一个去分析

image-20240309103830654

第一个进来,调用了CreateThread( )创建了一个线程。线程函数为0040A180,我们可以在此函数入口处下断点

image-20240309104207972

这里涉及到多线程调试,在创建的线程入口处下一个断点,在运行完此函数返回后直接跳过后两个函数,这样第二个功能函数返回后,也不执行第三个功能函数,直接让程序进入消息循环。这样当程序返回消息循环后F9运行程序,这是那个新创建的线程已经启动,并且程序断在了我们设置的线程函数入口断点处。

这里又调用了俩函数,反汇编查看00407834

image-20240309105304009

其调用了GetDriveType( ),跟着跑一编,发现会循环遍历A到Z盘,把存在的盘符保存到01F8025C及以后

image-20240309105504878

接着会把存在的盘符与“:\”连接在一起。

image-20240309110305606

接着会调用004091DC函数,本想着直接跳过的,可是程序停止运行了,进去看看

image-20240309130553640

把刚才找到存在的盘符与“*_*”连接后,调用FindFirstFileA()寻找任意文件,如果找不到文件就跳转结束。

这里有文件,不会跳转

全盘感染

接下来是一堆相似的代码

image-20240309150203367

大概功能是对寻找到的文件,获得其扩展名,与对应的字符串进行比较,image-20240309150832440

这里特殊一点,如果后缀等于GHO的文件调用DeleteFile()删除,(GHO文件时系统备份文件,其是防止系统恢复)

image-20240309173854494

如果是html,asp,php,jsp,aspx的后缀,跳转到00407AF4

如果是exe,scr,pif,com的后缀,跳转到004040CC

继续往下

image-20240309175321896

先在已存在得盘得根目录下寻找setup.exe文件与autorun.inf文件。然后如果没有寻找到此文件就跳转。

image-20240309175508143

修改zf的值,跟着跳转,把正在运行得病毒文件复制为setup.exe

接下来继续运行,回到了刚刚的跳转,这次不修改,进去

image-20240309180211139

创建c:\autorun.inf文件,往文件中写入一下内容后,将setup.exeautorun.inf的属性设为隐藏。

image-20240309180317378

这个函数就差不多了

局域网传播

接下来看第二个函数的最后一个函数

image-20240309180513296

进入此函数,发现其会创建线程,而且是循环创建10次。为了便于对此线程回调函数得分析,在其执行一次创建后就让其返回到消息循环中。

并在线程回调函数处下断点,运行程序将会断在此断点处。

image-20240309180950887

程序停到此线程回调函数入口点后,继续分析

image-20240309181227361

image-20240309181405328

发现此函数会通过端口139和端口445进行区域网传播

这样此函数就分析完了,到此为止我们把前两个功能函数已经分析完了,

设置注册表与关闭杀软

接下来看第三个函数,重新加载程序,修改eip到第三个函数那里,进入函数

image-20240310162731030

发现设置了4个计时器,通过4个计时器的回调函数来完成具体功能

在其计时器回调函数处下断点后我们运行完一个计时器设置函数后直接来到消息循环处。但是我们要注意其有的计时器设置得时间周期较长,我们可以在调用时把时间周期参数该小点。

在第一个调用函数入口点打一个断点,运行到断点处,我们发现其共有3种操作

一是遍历杀毒软件并关闭

image-20240310202538028

image-20240310202556982

二是设置特权

image-20240310203215302

三是关闭任务管理器等一些程序

image-20240310203333906

回到主线程

image-20240310203942540

image-20240310204236164

调用RegCreatekeyExA()---->RegSetValaueExA---->RegCloseKey()来设置两个启动项,第一个是用来在开机时自动启动病毒。另一个是设置使用户无法查看隐藏文件

接下来看第二个计时器

调用第二个计时器设置函数时把其时间周期参数该小点,改为1000(1s)。然后在分析运行程序。

image-20240310205107741

继续运行,一样的设置回调函数,再创建的线程中下断点,运行程序

image-20240310205307137

调用00403CDC函数将一段密文与“xboy”进行一定得运算,算法和文件自效验时用的一样。最后得到一个网址。

image-20240310210204721

接下来回从刚才产生得那个网址上试图从网站读取到网页源代码并且运行代码

第三个计时器回调函数‘

image-20240310210422224

这里面又创建了两个回调函数

反汇编查看第二个线程得回调函数发现其利用cmd命令删除了共享文件

image-20240310210821427

第四个回调函数

image-20240310211349913

一样,进下一个线程

image-20240310211711864

主要是删除一些服务和杀毒软件得启动项

好嘞,到这里熊猫烧香就分析的差不多了,第一次分析病毒,有什么不对的地方还请师傅们多多指教。