恶意代码分析实战:Lab07-01

问题

首先使用PEiD来查看一下程序的导入表:
dPl7FI.png
在导入表的ADVAPI32.dll这个动态链接库中,可以看到CreateServiceA以及OpenSCManagerA这两个API函数,说明这个恶意程序很可能会创建一个服务,来保证它会在系统被重启后运行。
dPljOg.png
WININET.dll这个动态链接库中的InternetOpenUrlA以及InternetOpenA说明这个程序可能会连接到一个网站。
首先看一下这个恶意程序的main函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
; int __cdecl main(int argc, const char **argv, const char **envp)
_main proc near

ServiceStartTable= SERVICE_TABLE_ENTRYA ptr -10h
var_8= dword ptr -8
var_4= dword ptr -4
argc= dword ptr 4
argv= dword ptr 8
envp= dword ptr 0Ch

sub esp, 10h
lea eax, [esp+10h+ServiceStartTable]
mov [esp+10h+ServiceStartTable.lpServiceName], offset aMalservice ; "MalService"
push eax ; lpServiceStartTable
mov [esp+14h+ServiceStartTable.lpServiceProc], offset sub_401040
mov [esp+14h+var_8], 0
mov [esp+14h+var_4], 0
call ds:StartServiceCtrlDispatcherA
push 0
push 0
call sub_401040
add esp, 18h
retn
_main endp

这个main函数出现了StartServiceCtrlDispatcherA这个函数,它主要用来实现一个服务。这个函数指定了服务控制管理器所要调用的服务控制函数。这里它所指定的函数就是sub_401040,这个函数会在调用StartServiceCtrlDispatcherA之后被调用。
我们进入sub_401040看看。

1
2
3
4
5
6
7
8
9
10
11
12
13
sub_401040 proc near

SystemTime= SYSTEMTIME ptr -400h
FileTime= _FILETIME ptr -3F0h
Filename= byte ptr -3E8h

sub esp, 400h
push offset Name ; "HGL345"
push 0 ; bInheritHandle
push 1F0001h ; dwDesiredAccess
call ds:OpenMutexA
test eax, eax
jz short loc_401064

函数首先调用了OpenMutexA函数,这个函数会试图获取一个名为“HGL345”的互斥量的句柄,如果这个互斥量存在,那么程序就调用ExitProcess来结束程序。如果这个互斥量不存在,那就会执行右边的流程。

1
2
3
4
5
push    esi
push offset Name ; "HGL345"
push 0 ; bInitialOwner
push 0 ; lpMutexAttributes
call ds:CreateMutexA

因为互斥量不存在,所以这里就调用CreateMutexA来创建一个名为HGL345的互斥量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
push    3               ; dwDesiredAccess
push 0 ; lpDatabaseName
push 0 ; lpMachineName
call ds:OpenSCManagerA
mov esi, eax
call ds:GetCurrentProcess
lea eax, [esp+404h+Filename]
push 3E8h ; nSize
push eax ; lpFilename
push 0 ; hModule
call ds:GetModuleFileNameA
push 0 ; lpPassword
push 0 ; lpServiceStartName
push 0 ; lpDependencies
push 0 ; lpdwTagId
lea ecx, [esp+414h+Filename]
push 0 ; lpLoadOrderGroup
push ecx ; lpBinaryPathName
push 0 ; dwErrorControl
push 2 ; dwStartType
push 10h ; dwServiceType
push 2 ; dwDesiredAccess
push offset DisplayName ; "Malservice"
push offset DisplayName ; "Malservice"
push esi ; hSCManager
call ds:CreateServiceA

之后通过OpenSCManagerA这个函数打开一个服务控制管理器的句柄,以便这个恶意程序可以添加或修改服务。接下来使用GetCurrentProcess来获取当前进程的伪句柄。然后调用GetModuleFileNameA获取当前所运行程序的完整路径。当获取到完整的路径以后,这个路径就会被CreateServiceA用来创建一个新的服务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
xor     edx, edx
lea eax, [esp+404h+FileTime]
mov dword ptr [esp+404h+SystemTime.wYear], edx
lea ecx, [esp+404h+SystemTime]
mov dword ptr [esp+404h+SystemTime.wDayOfWeek], edx
push eax ; lpFileTime
mov dword ptr [esp+408h+SystemTime.wHour], edx
push ecx ; lpSystemTime
mov dword ptr [esp+40Ch+SystemTime.wSecond], edx
mov [esp+40Ch+SystemTime.wYear], 2100
call ds:SystemTimeToFileTime
push 0 ; lpTimerName
push 0 ; bManualReset
push 0 ; lpTimerAttributes
call ds:CreateWaitableTimerA
push 0 ; fResume
push 0 ; lpArgToCompletionRoutine
push 0 ; pfnCompletionRoutine
lea edx, [esp+410h+FileTime]
mov esi, eax
push 0 ; lPeriod
push edx ; lpDueTime
push esi ; hTimer
call ds:SetWaitableTimer
push 0FFFFFFFFh ; dwMilliseconds
push esi ; hHandle
call ds:WaitForSingleObject
test eax, eax
jnz short loc_40113B

接下来程序使用了SYSTEMTIME的结构体,这是Windows的一个关于时间的结构体。可以看到,程序首先将wYear(年)、wDayOfWeek(星期)、wHour(时)以及wSecond(秒)设置为了零,下面又将wYear(年)设置为了0x834,也就是十进制的2100,这个时间是2100年。之后调用SystemTimeToFileTime来将系统时间转换为文件时间。这里又调用了CreateWaitableTimer、SetWaitableTimer以及WaitForSingleObject。对于我们来说最重要的是SetWaitableTimer的lpDueTime这个参数。它是SystemTimeToFileTime所返回的文件时间,之后利用WaitForSingleObject进入等待,直到2100年1月1日的午夜。 如果等到了2100年1月1日,那么就会执行以下代码:
dPJ8PA.png
这段代码会创建14h个线程去执行线程中的代码,我们进入StartAddress中看看。
dPJ2rT.png
可以看到,程序首先使用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、这个程序什么时候完成执行?

这个程序永远不会完成,程序就会进入一个无限循环。