恶意代码分析实战笔记(四)

LAB07-01.exe

静态分析

通过IDA分析整个程序的逻辑与疑点,先打开导入函数表,大致浏览程序的功能

image-20191223220040221.png

发现了一个CreateServiceAStartServiceCtrlDispatcherAOpenSCManagerA 等等有关于系统服务的函数,说明该程序具有操作系统的操作,InternetOpenUrlAInternetOpenA函数用于打开一个网址,CreateMutexAOpenMutexA用于创建和打开互斥锁。

我们使用IDA分析程序的main函数

image-20191223220603411.png

这个main()函数是用来创建一个服务列表,名字是MalService,主程序是sub_401040(),通过StartServiceCtrlDispatcherA来执行这样的一个函数,我们跟进服务主程序去看看

image-20191223221008103.png

理清函数功能,首先是打开互斥锁HGL345,如果打开成功就创建这样的互斥锁,如果不成功就退出程序,是保证程序只有一个程序运行

然后打开服务管理器,获取当前进程,找到当前进程的名字和文件目录Filename,创建基于这个随机获取到的文件目录来创建自己的服务,参数解释如下

参数 含义
hSCManager SCManagerHandle 服务控制管理器的句柄
IpServiceName DisplayName= Malservice 安装该服务的名称
IpDisplayName DisplayName = Malservice 用户界面显示出的名称
dwDesiredAccess 2u 进程的访问令牌
dwServiceType 0x10u 服务类型,这里是独立进程的服务程序
dwStartType 2u 服务启动选项,这里是开机自启
dwErrorContorl 0 服务启动失败的措施,这里是忽略错误继续执行
IpBinaryPathName &Filename 服务程序的二进制文件路径

看到这里就大概明白了,这个程序注册一个自己的服务开机运行,潜伏在程序运行时的当前目录的二进制文件中。

继续向下分析,发现是设定一个时间2100/0/0 00:00:00,然后获取系统时间,如果到了这个时间,那么就船舰20个线程,每个线程都是从StartAddress开始执行,我们进入这个StartAddress函数

image-20191223223257410.png

发现是打开Internet版本是Internet Explorer 8.0,然后打开网址http://www.malwareanalysisbook.com,字符串参考列表如下

image-20191223223350956.png

运行完了之后还没完,这个程序会一直Sleep的方式驻留在服务中

1、 问题:当计算机重启后,这个程序如何确保它继续运行? (即持久化驻留)

​ 程序将自己写进了开机自启动中

2、 问题:为什么这个程序会使用一个互斥量?

​ 保证同一时间只有一个自己的程序运行

3、 问题:可以用来检测这个程序的基于主机特征是什么?

​ 互斥锁HGL345

​ 服务MalService

4、 问题:检测这个恶意代码的基于网络特征是什么?

​ 打开Internet Explorer 8.0和网址http://www.malwareanalysisbook.com

5、 这个程序的目的是什么?

​ 到了一个指定的时间之后,打开20个线程同时访问该网站,估计是将病毒植入抓到的肉鸡中,然后指定一个时间进行DDOS攻击

6、这个程序什么时候完成执行?

​ 在2100/01/01 00:00:00开始执行,执行完了之后还会一直潜伏在电脑里面

LAB07-02.exe

使用IDA进行静态分析

我们首先看看函数导入表

image-20191224130550304.png

发现它的函数导入并不多,OleInitialize用于创建ole初始化对象,CoCreateInstance用于创建一个Com实例,OleUninitialize用于删除一个ole对象,上面的SysAllocStringSysFreeString用于字符串的操作。

我们再看看字符串列表

image-20191224130757083.png

image-20191224130907842.png

看到了一个网址,可能有用来打开这个网址的操作

进入main函数看一看

image-20191224131042462.png

发现非常简短,不过这个面向对象的操作有点看不懂,大概分析就是首先创建实例,如果创建成功了,那么就运行ppv+44处函数指针指向的函数,其中v3是分配了一个字符串,跟进去看一看

image-20191224131202003.png

发现就是网址,我们把这个网址改一下名字,然后查询old函数的操作,发现这个CoCreateInstance函数的参数如下

参数 功能
rclsid 0002DF01-0000-0000-C000-000000000046 用于标识一个对象
pUnkOuter 0 表示是否非聚合式对象
dwClsContext 4 组件类别
riid D30C1661-CDAF-11D0-8A3E-00C04FC9E26E 接口标识符,用于对象通信
ppv &ppv 接收接口指针

这两个ID看上去像是uuid的格式,我们找一下这两个id的功能是什么

image-20191224134213628.png

image-20191224134245470.png

看样子这个程序是打开浏览器来访问这样的一个网站的操作

使用标准结构体之后如下

image-20191224134700424.png

就是打开浏览器导航的一个操作,然后释放变量,关闭对象,结束main

1、 问题:这个程序如何完成持久化驻留

似乎没有进行持久化驻留,打开了之后就关闭了

2、 问题:这个程序的目的是什么?

打开一个网站

3.这个程序什么时候完成执行

网站打开了就结束了

LAB7-3

静态分析LAB07-03.exe

查看导入函数表

image-20191224141845795.png

发现有CreateFileACreateFileMappingAFindNextFileAFindFirstFileACopyFileA这些函数是用来查找和创建,复制文件

查看字符串列表

image-20191224162158101.png

发现是有两个目录C:\\windows\\system32\\kernel32.dll,和C:\\windows\\system32\\kerne132.dll

长得非常相似,估计是把自己的kerne132.dll替换掉系统的kernel32.dll,这个kerne132.dll,就来自于Lab07-03.dll

我们进入main函数分析一下

image-20191224163753430.png

这个main有点长,我们慢慢逆

首先是检查程序的运行参数,如果是有字符串WARNING_THIS_WILL_DESTROY_YOUR_MACHINE,就继续,反之就关闭程序,剩下的操作比较魔幻,我们打开与之配套的DLL看看

进入导入函数列表

image-20191224171253226.png

发现有大量的套接字通信操作sendconnectsocketWSAStartuprecv等等,说明这个程序能够进行网络通信,接着我们看看字符串

image-20191224171359651.png

发现了一个IP地址,还找到了execsleephello等关键字符串,我们看看主程序以及这些字符串的调用情况

image-20191224172400232.png

然后经过逆向分析可发现,这个DLLDLLMain函数是连接一个远程的套接字127.26.152.13:80,然后尝试发送一个hello,然后接收消息,如果接收到的是sleep,那么就调用sleep(0x60000),如果接受到的是exec,那么就打开一个命令行,如果接收到的是q,那么就退出程序

DLL分析完了,现在继续分析exe

image-20191224210044783.png

跳过一堆不明真相的函数之后我们来到下面的closeHandle

image-20191224211248722.png

发现是将这个dll复制到这个C:\windows\system32\kerne132.dll中去,然后我们跟进下main一个调用了C:\*的函数中

image-20191224211542279.png

发现是在C盘遍历文件,如果遍历出来的文件结尾是.exe的话,就执行一个sub_4010A0()函数,我们跟进去看看

image-20191224212332825.png

发现是读取这个文件,然后看看通过IsBadReadPtr()检查进程是否有权限访问指定的内存块。如果成功了就执行一系列操作,从这个程序中提取一个字符串出来,看看是否为kernel32.dll,如果是的话就将内存中的伪造的kerne132.dll覆盖进去。

目的是检测所有含有调用了这个dll的并把所有调用的改为kernel132.dll来干扰正常程序运行并打开后门程序

静态分析完毕,开始动态分析

动态分析Lab7-3.exe

通过上面的静态分析我们已经知道了这个程序会把根目录下的文件感染,让其无法正常调用kernel32.dll,我们编译一个hello world,然后运行这个程序,通过比对我们来看一看这个程序做了什么

image-20191224213644141.png

这是在Windows10下面使用gcc -m32 helloworld.cpp -o hello.exe生成的32位简单程序,其中调用到了KERNEL32.dll,我们使用病毒感染这个文件

为了能够跟上去动态调试,我们使用IDA的调试功能Local Win32 debugger

image-20191224214706559.png

image-20191224214650312.png

成功设置后我们进入了单步调试阶段

image-20191224215335016.png

可以看到下面挨个读取出来的文件,我们下一个断点一次读一个文件来看看,发现第一个找到的是

image-20191224215606090.png

不是我们想要跟上的,我们继续运行,但是发现太久了,我们就直接跑完好了,到后面我们patch一下这个让他遍历C盘

运行完了之后我们看看后面的这个文件如何

image-20191224220400836.png

发现这个程序的kernel32变成了kerne132,证实了我们的猜想

image-20191224220323285.png

procmon查看进程信息发现的确如此

我们进入原来的被修改的地方看看

image-20191224220743147.png

发现新的kerne132.dll除了包含了原来本身的kernel32.dll之外还带有网络程序用于远程控制通信,既保证了原来的程序能够正常运行,又把自己也连带运行了起来,是一个非常高明的病毒感染方法。

1、 问题:这个程序如何完成持久化驻留,来确保在计算机重启后它能继续运行?

​ 把C盘的文件感染,让其每次运行的时候都会调用这个被感染之后的kerne132.dll,同时也把自身藏在C:\windows\system32下面

2、 问题:这个恶意代码的两个明显的基于主机特征是什么?

​ 在C:\windows\system32下多了一个kerne132.dll,在C盘下的程序的导入函数表中的kernel32.dll被替换为kerne132.dll

还创建了一个互斥SADFHUHF

image-20191224221550703.png

3、 问题:这个程序的目的是什么?

​ 一个后门程序,可以用来远控

4、 问题:一旦这个恶意代码被安装,你如何移除它?

​ 把之前的kernel132.dll清除并把C盘的exe的导入函数还原成kernel132.dll

​ 或者是直接把kerne132.dll替换成kernel32.dll的内容就是了,但是这种做法只在本机有效