问题
首先使用PEiD来查看一下程序的导入表:
在导入表的ADVAPI32.dll这个动态链接库中,可以看到CreateServiceA以及OpenSCManagerA这两个API函数,说明这个恶意程序很可能会创建一个服务,来保证它会在系统被重启后运行。
WININET.dll这个动态链接库中的InternetOpenUrlA以及InternetOpenA说明这个程序可能会连接到一个网站。
首先看一下这个恶意程序的main函数:
1 | ; int __cdecl main(int argc, const char **argv, const char **envp) |
这个main函数出现了StartServiceCtrlDispatcherA这个函数,它主要用来实现一个服务。这个函数指定了服务控制管理器所要调用的服务控制函数。这里它所指定的函数就是sub_401040,这个函数会在调用StartServiceCtrlDispatcherA之后被调用。
我们进入sub_401040看看。
1 | sub_401040 proc near |
函数首先调用了OpenMutexA函数,这个函数会试图获取一个名为“HGL345”的互斥量的句柄,如果这个互斥量存在,那么程序就调用ExitProcess来结束程序。如果这个互斥量不存在,那就会执行右边的流程。
1 | push esi |
因为互斥量不存在,所以这里就调用CreateMutexA来创建一个名为HGL345的互斥量。
1 | push 3 ; dwDesiredAccess |
之后通过OpenSCManagerA这个函数打开一个服务控制管理器的句柄,以便这个恶意程序可以添加或修改服务。接下来使用GetCurrentProcess来获取当前进程的伪句柄。然后调用GetModuleFileNameA获取当前所运行程序的完整路径。当获取到完整的路径以后,这个路径就会被CreateServiceA用来创建一个新的服务。
1 | xor edx, edx |
接下来程序使用了SYSTEMTIME的结构体,这是Windows的一个关于时间的结构体。可以看到,程序首先将wYear(年)、wDayOfWeek(星期)、wHour(时)以及wSecond(秒)设置为了零,下面又将wYear(年)设置为了0x834,也就是十进制的2100,这个时间是2100年。之后调用SystemTimeToFileTime来将系统时间转换为文件时间。这里又调用了CreateWaitableTimer、SetWaitableTimer以及WaitForSingleObject。对于我们来说最重要的是SetWaitableTimer的lpDueTime这个参数。它是SystemTimeToFileTime所返回的文件时间,之后利用WaitForSingleObject进入等待,直到2100年1月1日的午夜。 如果等到了2100年1月1日,那么就会执行以下代码:
这段代码会创建14h个线程去执行线程中的代码,我们进入StartAddress中看看。
可以看到,程序首先使用InternetOpenA来初始化一个网络连接,下面在一个循环中调用InternetOpenUrlA。这是一个死循环,它会不断地调用InternetOpenUrlA来访问www.malwareanalysisbook.com这个网页。而且由于CreateThread被调用了20次,所以会有20个线程不断地调用InternetOpenUrlA来访问这个网站。显然这是一个DDoS(分布式拒绝服务)攻击。
1、当计算机重启后,这个程序如何确保它继续运行(达到持久化驻留)?
这个程序会创建一个名为MalService的服务,来保证它会在每次系统启动后运行。
2、为什么这个程序会使用一个互斥量?
保证同一时间只有一份实例在运行。
3、可以用来检测这个程序的基于主机特征是什么?
一个是名为HGL345的互斥量,另一个是名为Malservice的服务。
4、检测这个恶意代码的基于网络特征是什么?
这个恶意程序使用了用户代理Internet Explorer 8.0,以及不断地访问www.malwareanalysisbook.com这个网页。
5、这个程序的目的是什么?
这个程序运行后,会等待到2100年1月1日的半夜,然后发送很多访问请求到www.malwareanalysisbook.com这个网页,以实现对这个网站的DDoS攻击。
6、这个程序什么时候完成执行?
这个程序永远不会完成,程序就会进入一个无限循环。