恶意代码分析实战笔记(四)
LAB07-01.exe
静态分析
通过IDA分析整个程序的逻辑与疑点,先打开导入函数表,大致浏览程序的功能
发现了一个CreateServiceA
,StartServiceCtrlDispatcherA
,OpenSCManagerA
等等有关于系统服务的函数,说明该程序具有操作系统的操作,InternetOpenUrlA
,InternetOpenA
函数用于打开一个网址,CreateMutexA
,OpenMutexA
用于创建和打开互斥锁。
我们使用IDA分析程序的main
函数
这个main()
函数是用来创建一个服务列表,名字是MalService
,主程序是sub_401040()
,通过StartServiceCtrlDispatcherA
来执行这样的一个函数,我们跟进服务主程序去看看
理清函数功能,首先是打开互斥锁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
函数
发现是打开Internet
版本是Internet Explorer 8.0
,然后打开网址http://www.malwareanalysisbook.com
,字符串参考列表如下
运行完了之后还没完,这个程序会一直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进行静态分析
我们首先看看函数导入表
发现它的函数导入并不多,OleInitialize
用于创建ole
初始化对象,CoCreateInstance
用于创建一个Com
实例,OleUninitialize
用于删除一个ole
对象,上面的SysAllocString
和SysFreeString
用于字符串的操作。
我们再看看字符串列表
看到了一个网址,可能有用来打开这个网址的操作
进入main函数看一看
发现非常简短,不过这个面向对象的操作有点看不懂,大概分析就是首先创建实例,如果创建成功了,那么就运行ppv+44
处函数指针指向的函数,其中v3是分配了一个字符串,跟进去看一看
发现就是网址,我们把这个网址改一下名字,然后查询old函数的操作,发现这个CoCreateInstance
函数的参数如下
参数 | 值 | 功能 |
---|---|---|
rclsid |
0002DF01-0000-0000-C000-000000000046 |
用于标识一个对象 |
pUnkOuter |
0 |
表示是否非聚合式对象 |
dwClsContext |
4 |
组件类别 |
riid |
D30C1661-CDAF-11D0-8A3E-00C04FC9E26E |
接口标识符,用于对象通信 |
ppv |
&ppv |
接收接口指针 |
这两个ID看上去像是uuid
的格式,我们找一下这两个id的功能是什么
看样子这个程序是打开浏览器来访问这样的一个网站的操作
使用标准结构体之后如下
就是打开浏览器导航的一个操作,然后释放变量,关闭对象,结束main
1、 问题:这个程序如何完成持久化驻留
似乎没有进行持久化驻留,打开了之后就关闭了
2、 问题:这个程序的目的是什么?
打开一个网站
3.这个程序什么时候完成执行
网站打开了就结束了
LAB7-3
静态分析LAB07-03.exe
查看导入函数表
发现有CreateFileA
,CreateFileMappingA
,FindNextFileA
,FindFirstFileA
,CopyFileA
这些函数是用来查找和创建,复制文件
查看字符串列表
发现是有两个目录C:\\windows\\system32\\kernel32.dll
,和C:\\windows\\system32\\kerne132.dll
长得非常相似,估计是把自己的kerne132.dll
替换掉系统的kernel32.dll
,这个kerne132.dll
,就来自于Lab07-03.dll
我们进入main
函数分析一下
这个main有点长,我们慢慢逆
首先是检查程序的运行参数,如果是有字符串WARNING_THIS_WILL_DESTROY_YOUR_MACHINE
,就继续,反之就关闭程序,剩下的操作比较魔幻,我们打开与之配套的DLL
看看
进入导入函数列表
发现有大量的套接字通信操作send
,connect
,socket
,WSAStartup
,recv
等等,说明这个程序能够进行网络通信,接着我们看看字符串
发现了一个IP地址,还找到了exec
,sleep
,hello
等关键字符串,我们看看主程序以及这些字符串的调用情况
然后经过逆向分析可发现,这个DLL
的DLLMain
函数是连接一个远程的套接字127.26.152.13:80
,然后尝试发送一个hello
,然后接收消息,如果接收到的是sleep
,那么就调用sleep(0x60000)
,如果接受到的是exec
,那么就打开一个命令行,如果接收到的是q
,那么就退出程序
DLL
分析完了,现在继续分析exe
跳过一堆不明真相的函数之后我们来到下面的closeHandle
发现是将这个dll
复制到这个C:\windows\system32\kerne132.dll
中去,然后我们跟进下main一个调用了C:\*
的函数中
发现是在C盘遍历文件,如果遍历出来的文件结尾是.exe
的话,就执行一个sub_4010A0()
函数,我们跟进去看看
发现是读取这个文件,然后看看通过IsBadReadPtr()
检查进程是否有权限访问指定的内存块。如果成功了就执行一系列操作,从这个程序中提取一个字符串出来,看看是否为kernel32.dll
,如果是的话就将内存中的伪造的kerne132.dll
覆盖进去。
目的是检测所有含有调用了这个dll
的并把所有调用的改为kernel132.dll
来干扰正常程序运行并打开后门程序
静态分析完毕,开始动态分析
动态分析Lab7-3.exe
通过上面的静态分析我们已经知道了这个程序会把根目录下的文件感染,让其无法正常调用kernel32.dll
,我们编译一个hello world
,然后运行这个程序,通过比对我们来看一看这个程序做了什么
这是在Windows10下面使用gcc -m32 helloworld.cpp -o hello.exe
生成的32位简单程序,其中调用到了KERNEL32.dll
,我们使用病毒感染这个文件
为了能够跟上去动态调试,我们使用IDA的调试功能Local Win32 debugger
成功设置后我们进入了单步调试阶段
可以看到下面挨个读取出来的文件,我们下一个断点一次读一个文件来看看,发现第一个找到的是
不是我们想要跟上的,我们继续运行,但是发现太久了,我们就直接跑完好了,到后面我们patch
一下这个让他遍历C盘
运行完了之后我们看看后面的这个文件如何
发现这个程序的kernel32
变成了kerne132
,证实了我们的猜想
用procmon
查看进程信息发现的确如此
我们进入原来的被修改的地方看看
发现新的kerne132.dll
除了包含了原来本身的kernel32.dll
之外还带有网络程序用于远程控制通信,既保证了原来的程序能够正常运行,又把自己也连带运行了起来,是一个非常高明的病毒感染方法。
1、 问题:这个程序如何完成持久化驻留,来确保在计算机重启后它能继续运行?
把C盘的文件感染,让其每次运行的时候都会调用这个被感染之后的kerne132.dll
,同时也把自身藏在C:\windows\system32
下面
2、 问题:这个恶意代码的两个明显的基于主机特征是什么?
在C:\windows\system32
下多了一个kerne132.dll
,在C盘下的程序的导入函数表中的kernel32.dll
被替换为kerne132.dll
还创建了一个互斥SADFHUHF
3、 问题:这个程序的目的是什么?
一个后门程序,可以用来远控
4、 问题:一旦这个恶意代码被安装,你如何移除它?
把之前的kernel132.dll
清除并把C盘的exe
的导入函数还原成kernel132.dll
或者是直接把kerne132.dll
替换成kernel32.dll
的内容就是了,但是这种做法只在本机有效