Fork me on GitHub

动态分析基础技术


知识点

与静态分析不同,动态分析是将恶意代码加载运行之后观察代码运行状态的一个过程,一般来说,对恶意代码进行分析时先进行静态分析来大致了解软件的功能再进行动态分析以了解恶意代码运行时的更多细节,静态分析与动态分析都有各自的有点以及局限性,本章重点介绍了动态分析的一些手法和技巧。

用沙箱来分析恶意代码:沙箱是一种在安全环境下运行不信任的程序的安全机制,沙箱一般包含一个虚拟的环境,并可以定制虚拟网络等“欺骗”恶意代码让恶意代码认为自己所在的沙箱是一个正常的物理机的各种虚拟功能,但是运行在沙箱中的恶意代码并不会对物理机产生任何威胁,因此沙箱是一个很好的用来动态分析恶意代码的工具。

前一段时间我使用过布谷鸟沙箱(Cuckoo),这一款沙箱的结构是首先开启一个安装有Ubuntu14.04的系统用于安装Cuckoo,然后再向这个虚拟机上安装所有Cuckoo依赖的插件,安装完成后再向Ubuntu中安装一个Vmware虚拟机来安装一个用于运行Windows等系统的虚拟机,整体相当于是一个虚拟机的嵌套结构,布谷鸟对这个在虚拟机中运行的虚拟机的运行状态的存储状态进行记录,并对比运行病毒前后的镜像区别来确定恶意代码对主机做了什么,并会生成一个十分详细的报告,总的来说这种杀向在我们对一个恶意代码进行静态分析遇到困难时还是很有帮助的,但是缺点是此系统十分难于安装,因为很多安装条件会产生冲突,而且此沙箱运行起来也是对电脑性能的极大挑战,除非你有一台安装了Ubuntu14.04的物理主机。

类似于这样的沙箱还有NormanGFIAnubisJoeThreatExpertBitBlazeComodo等沙箱。

沙箱的缺点:

  • 有些恶意代码会检测运行环境是否为虚拟环境,如果是虚拟环境,则恶意代码通常不会表现出真正的功能。
  • 恶意代码通常会连接C2服务器来执行特定的功能,如果恶意代码设定了一个潜伏期,则沙箱就难以探测到长时间以后恶意代码可能发生的行为。
  • 沙箱不能很方便的分析一个DLL恶意代码

运行DLL文件:如果碰到一个DLL恶意代码,Windows不知道如何运行DLL文件,因此我们需要使用rundll32.exe来运行DLL文件,使用命令格式如下:

1
rundll32.exe DLL_name, Export_arguments

Export_arguments必须是DLL文件导出函数的函数名或者是函数序号,使用函数名可以直接将函数名作为Export_arguments参数的值,如果使用函数序号需要写为井号加数字的形式来表示序号如#2

比如使用命令rundll32.exe shell32.dll,RestartDialog可以使计算机弹出重新启动窗口

进程监视器:进程监视器是Windows下一款可以监视系统注册表和文件系统,进程和线程的软件,虽然此程序也可以监控网络流量,但是由于Windows不同版本可能存在不同程度的兼容问题,所以一般不采用进程管理器来监控网络行为。另外,进程监视器是使用内存来记录事件的,因此如果你在虚拟环境下调用此程序,每分钟超过5万次的调用行为可能很快就将内存耗尽,因此我们使用进程监视器来监控程序的系统调用时需要清空之前的调用记录并将监控时间缩短以避免内存空间被耗尽。

可以用进程监视器来分析恶意文档如PDF文档和Word文档,当文档被加载后,可以在进程监视器中看到文档启动的进程并通过Image字段来找到恶意代码在磁盘上的位置。

RegShot:Regshot是一款注册表监视器,可以在运行恶意代码之前对注册表做一次快照,再在运行恶意代码之后做一次快照,然后通过对比运行恶意代码前后注册表内容的不同来得知恶意代码对注册表进行了哪些操作。

网络:以下是几款模拟网络响应或者监视网络事件的好用软件的软件:

  • ApateDNS:此软件是一款免费软件,可以很方便的发现恶意代码进行的DNS请求。
  • WireShark:不必多说,神器。
  • NetCat:瑞士军刀,神器。
  • INetSim:INetSim是一款基于Linux的模拟网络的免费软件他可以模拟多种服务如HttpHttpsFTPIRCDNSSMTP等,而且可以根据恶意代码的请求做出尽量符合恶意代码要求的返回动作从而帮助我们研究恶意代码。

关于动态分析过程中用的软件,嘶吼上有一篇文章介绍:http://www.4hou.com/technology/3022.html

课后练习

Lab3-1

使用动态分析技术来分析在Lab03-01.exe文件中发现的恶意代码

1.找出这个恶意代码的导入函数与字符串列表

这个恶意代码只有一个导入函数函数,因此判断此程序可能是加了壳的

1
00400200		ExitProcess	   kernel32

PEiD查壳发现此程序确实加了壳,壳为PEncrypt 3.1 Final -> junkcode,但此题不需要脱壳。

字符串列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Address	Length	Type	String
.text:0040025A 0000000D C kernel32.dll
.data:00400EF7 00000005 C \b1\a1G
.data:00401087 00000007 C \n6I*h<8
.data:004010A7 00000010 C ^-m-m<|<|<|M\rM\r^
.data:00401247 00000006 C ntdll
.data:0040125E 00000007 C user32
.data:004014F7 00000008 C advpack
.data:00401623 00000008 C StubPath
.data:0040162F 00000029 C SOFTWARE\\Classes\\http\\shell\\open\\commandV
.data:0040165B 00000035 C Software\\Microsoft\\Active Setup\\Installed Components\\
.data:0040169C 00000022 C www.practicalmalwareanalysis.com
.data:004016D4 00000007 C admin\t\r
.data:004016E2 0000000B C VideoDriver
.data:004016F1 00000009 C WinVMX32-
.data:004016FD 0000000D C vmx32to64.exe
.data:00401943 00000008 C AppData

2.这个恶意代码在主机上的感染迹象特征是什么?

此题主要考察的时对应用程序在运行时动态行为的捕捉,打开Procmon捕捉当前所有事件,设置过滤器使得程序显示出与Lab03-01.exe相关的进程活动记录:

这样初步过滤后可以看到恶意代码的事件数量还是很大,我们可以通过其他过滤器来筛选出自己想看到的结果。

运行RegShot进行注册表快照时我发现Win10的注册表项目十分庞大,拍摄快照时会有很多干扰项,因此我尝试下载WindowsXP进行实验,幸运的是,在我使用WindowXP作为病毒分析环境时,很快就用RegShot分析出了病毒对注册表的改动:

3.这个恶意代码是否存在一些有用的网络特征,如果存在,他们是什么?

在分分析恶意代码中包含的字符串的过程中我们就已经发现了一个敏感的字符串www.practicalmalwareanalysis.com,看到这个网址我们八成就能猜出这个恶意代码很可能会与此域名建立连接。

使用ApateDNS,过程中发现此程序无法在我的虚拟机中正常启动,因为虚拟机的53端口被其他进程占用了,查看之后发现使svchost,kill掉此进程后ApateDNS即可正常启动

我们需要运行INetSim来捕捉恶意代码的网络请求

修改如下几处配置

  • 修改service_bind_address为安装了INetSim的虚拟机的IP地址:
1
2
3
4
5
6
7
8
9
10
#########################################
# service_bind_address
#
# IP address to bind services to
#
# Syntax: service_bind_address <IP address>
#
# Default: 127.0.0.1
#
service_bind_address 192.168.60.129
  • 修改dns_default_ip为安装了INetSim的虚拟机的IP地址,以接收DNS请求:
1
2
3
4
5
6
7
8
9
10
#########################################
# service_bind_address
#
# IP address to bind services to
#
# Syntax: service_bind_address <IP address>
#
# Default: 127.0.0.1
#
service_bind_address 192.168.60.129
  • 接着转到接近配置文件末尾的地方,开启重定向:
1
2
3
4
5
6
7
8
9
10
#########################################
# service_bind_address
#
# IP address to bind services to
#
# Syntax: service_bind_address <IP address>
#
# Default: 127.0.0.1
#
service_bind_address 192.168.60.129
  • 打开TCP端口用于连接:
1
2
3
4
5
6
7
8
9
10
11
12
#########################################
# redirect_exclude_port
#
# Connections to <service_bind_address> on this port
# are not redirected
#
# Syntax: redirect_exclude_port <protocol:port>
#
# Default: none
#
redirect_exclude_port tcp:22
#redirect_exclude_port udp:111
  • 重定向外部地址:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#########################################
# redirect_external_address
#
# IP address used as source address if INetSim
# acts as a router for redirecting packets to
# external networks.
# This option only takes effect if static rules
# for redirecting packets to external networks
# are defined (see 'redirect_static_rule' below).
#
# Syntax: redirect_external_address <IP address>
#
# Default: none
#
redirect_external_address 192.168.60.129

修改完以上内容后重新启动INetSim发现如下报错:

1
* redirect - failed! Error: Sorry, this module requires the Perlipq library (IPTables::IPv4::IPQueue)!

后来得知InetSim弃用了这个库所以这个功能暂时无法使用,那么就先不用这个了。

用WireShark抓包看一下发现了一个DNS请求的数据包:

恶意代码每30秒就会发送一次对此域名的DNS解析请求,而且会广播一个长度为256字节的随机数据:

WireShark将此数据包识别为SSL流量,但是看数据包内容可得知这并不是一个SSL数据包,而只是占用了443端口。

Lab3-2

使用动态分析技术来分析在Lab03-02exe文件中发现的恶意代码

1.您怎样才能让这个恶意代码自行安装?

这个恶意代码是一个DLL程序,因此我们需要用rundll32.exe工具来运行此DLL文件中的函数,先用IDA查看一下此DLL中的函数:

此程序的导出函数列表:

1
2
3
4
5
6
7
Name				Address	Ordinal
Install 10004706 1
ServiceMain 10003196 2
UninstallService 10004B18 3
installA 10004B0B 4
uninstallA 10004C2B 5
DllEntryPoint 10004E4D [main entry]

导入函数:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Address	Ordinal	Name	Library
10005000 OpenServiceA ADVAPI32
10005004 DeleteService ADVAPI32
10005008 RegOpenKeyExA ADVAPI32
1000500C RegQueryValueExA ADVAPI32
10005010 RegCloseKey ADVAPI32
10005014 OpenSCManagerA ADVAPI32
10005018 CreateServiceA ADVAPI32
1000501C CloseServiceHandle ADVAPI32
10005020 RegCreateKeyA ADVAPI32
10005024 RegSetValueExA ADVAPI32
10005028 RegisterServiceCtrlHandlerA ADVAPI32
1000502C SetServiceStatus ADVAPI32
10005034 GetStartupInfoA KERNEL32
10005038 CreatePipe KERNEL32
1000503C GetCurrentDirectoryA KERNEL32
10005040 CreateProcessA KERNEL32
10005044 lstrlenA KERNEL32
10005048 SetLastError KERNEL32
1000504C OutputDebugStringA KERNEL32
10005050 CloseHandle KERNEL32
10005054 ReadFile KERNEL32
10005058 GetTempPathA KERNEL32
1000505C GetLongPathNameA KERNEL32
10005060 LoadLibraryA KERNEL32
10005064 GetProcAddress KERNEL32
10005068 CreateThread KERNEL32
1000506C GetSystemTime KERNEL32
10005070 WaitForSingleObject KERNEL32
10005074 TerminateThread KERNEL32
10005078 Sleep KERNEL32
1000507C GetLastError KERNEL32
10005080 GetModuleFileNameA KERNEL32
10005088 _chdir MSVCRT
1000508C _strnicmp MSVCRT
10005090 _adjust_fdiv MSVCRT
10005094 malloc MSVCRT
10005098 _initterm MSVCRT
1000509C free MSVCRT
100050A0 type_info::~type_info(void) MSVCRT
100050A4 _except_handler3 MSVCRT
100050A8 _CxxThrowException MSVCRT
100050AC _stricmp MSVCRT
100050B0 _EH_prolog MSVCRT
100050B4 __CxxFrameHandler MSVCRT
100050B8 strchr MSVCRT
100050BC _itoa MSVCRT
100050C0 strstr MSVCRT
100050C4 strncat MSVCRT
100050C8 strlen MSVCRT
100050CC sscanf MSVCRT
100050D0 atol MSVCRT
100050D4 operator new(uint) MSVCRT
100050D8 memset MSVCRT
100050DC wcstombs MSVCRT
100050E0 strncpy MSVCRT
100050E4 strcat MSVCRT
100050E8 strcpy MSVCRT
100050EC atoi MSVCRT
100050F0 fclose MSVCRT
100050F4 fflush MSVCRT
100050F8 operator delete(void *) MSVCRT
100050FC fwrite MSVCRT
10005100 fopen MSVCRT
10005104 strrchr MSVCRT
1000510C InternetCloseHandle WININET
10005110 InternetOpenA WININET
10005114 InternetConnectA WININET
10005118 HttpOpenRequestA WININET
1000511C HttpSendRequestA WININET
10005120 HttpQueryInfoA WININET
10005124 InternetReadFile WININET
1000512C 11 inet_addr WS2_32
10005130 WSASocketA WS2_32
10005134 3 closesocket WS2_32
10005138 4 connect WS2_32
1000513C 10 ioctlsocket WS2_32
10005140 19 send WS2_32
10005144 18 select WS2_32
10005148 151 __WSAFDIsSet WS2_32
1000514C 16 recv WS2_32
10005150 22 shutdown WS2_32
10005154 115 WSAStartup WS2_32
10005158 57 gethostname WS2_32
1000515C 116 WSACleanup WS2_32
10005160 9 htons WS2_32

程序中的字符串:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Address	Length	Type	String
.rdata:100055C2 0000000D C KERNEL32.dll
.rdata:100056B0 0000000D C ADVAPI32.dll
.rdata:100056CC 0000000B C WS2_32.dll
.rdata:10005760 0000000C C WININET.dll
.rdata:10005886 0000000B C MSVCRT.dll
.rdata:1000595A 0000000D C Lab03-02.dll
.rdata:10005969 00000008 C Install
.rdata:10005978 0000000C C ServiceMain
.rdata:10005984 00000011 C UninstallService
.rdata:10005995 00000009 C installA
.rdata:1000599E 0000000B C uninstallA
.data:10006010 0000000D C Y29ubmVjdA==
.data:10006028 0000001D C practicalmalwareanalysis.com
.data:10006068 0000000B C serve.html
.data:100060B8 0000000D C dW5zdXBwb3J0
.data:100060C8 00000009 C c2xlZXA=
.data:100060D4 00000005 C Y21k
.data:100060DC 00000009 C cXVpdA==
.data:100060EC 00000011 C Windows XP 6.11
.data:10006104 0000000F C CreateProcessA
.data:10006114 0000000D C kernel32.dll
.data:10006128 00000005 C .exe
.data:10006138 00000009 C HTTP/1.1
.data:10006144 00000006 C %s %s
.data:1000614C 00000011 C 1234567890123456
.data:10006164 00000005 C quit
.data:1000616C 00000005 C exit
.data:10006174 00000008 C getfile
.data:1000617C 0000000C C cmd.exe /c
.data:1000618C 00000041 C ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
.data:100061D0 00000005 C --!>
.data:100061D8 00000005 C <!--
.data:100061E8 00000005 C .PAX
.data:10006200 00000010 C DependOnService
.data:10006210 00000006 C RpcSs
.data:10006218 0000000B C ServiceDll
.data:10006224 00000021 C GetModuleFileName() get dll path
.data:10006248 0000000B C Parameters
.data:10006254 00000005 C Type
.data:1000625C 00000006 C Start
.data:10006264 0000000B C ObjectName
.data:10006270 0000000C C LocalSystem
.data:1000627C 0000000D C ErrorControl
.data:1000628C 0000000C C DisplayName
.data:10006298 0000000C C Description
.data:100062A4 0000008B C Depends INA+, Collects and stores network configuration and location information, and notifies applications when this information changes.
.data:10006330 0000000A C ImagePath
.data:1000633C 00000026 C %SystemRoot%\\System32\\svchost.exe -k
.data:10006364 00000023 C SYSTEM\\CurrentControlSet\\Services\\
.data:10006388 0000001B C CreateService(%s) error %d
.data:100063A4 00000022 C Intranet Network Awareness (INA+)
.data:100063C8 0000002D C %SystemRoot%\\System32\\svchost.exe -k netsvcs
.data:100063F8 00000010 C OpenSCManager()
.data:10006408 0000004C C You specify service name not in Svchost//netsvcs, must be one of following:
.data:10006454 00000021 C RegQueryValueEx(Svchost\\netsvcs)
.data:10006478 00000008 C netsvcs
.data:10006480 0000002A C RegOpenKeyEx(%s) KEY_QUERY_VALUE success.
.data:100064AC 00000029 C RegOpenKeyEx(%s) KEY_QUERY_VALUE error .
.data:100064D8 00000035 C SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost
.data:10006510 00000006 C IPRIP
.data:10006518 00000012 C uninstall success
.data:1000652C 00000018 C OpenService(%s) error 2
.data:10006544 00000018 C OpenService(%s) error 1
.data:1000655C 00000016 C uninstall is starting
.data:10006588 00000010 C .?AVtype_info@@

我们能从以上信息中发掘到很多重要的点,通过对程序的静态分析猜测此程序会根据导出函数向Windows中安装一个服务,因此我们试着用rundll32.exe来执行这个安装函数Install,还有一个函数时installA,实际上还是调用的Install,因此我们只需要运行installA函数即可,在运行此函数之前先打开RegShotProcessMonitor以防止漏掉重要信息:

1
rundll32.exe Lab03-02.dll,installA

执行完成后可以在RegShot的对比结果中发现恶意代码对注册表的操作:

1
2
3
新添加键 (6) 快照 B 
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\IPRIP]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IPRIP]

以上信息告诉我们恶意代码创建了一个名为IPRIP的服务,在注册表编辑器中找到相关条目可发现更多与此服务相关的信息:

ImagePath字段中可以得知此DLL会依赖svchost.exe来启动执行,上图中的一些信息可以作为此恶意代码的特殊指纹作为识别依据。

2.在安装之后,如何让这个恶意代码运行起来?

使用如下命令:

1
net strat IPRIP

3.你怎么能找到这个恶意代码是在哪个进程下运行的?

使用Process Explorer并选择查找DLL可以在svchost.exe下找到Lab03-02.dll。

4.你可以在procmon工具中设置什么样的过滤器,才能收集这个恶意代码的信息?

可以设置过滤器的PID为svchost.exe的PID或者进程名为svchost.exe。

5.这个恶意代码在主机上的感染迹象特征是什么?

此恶意代码会在主机上创建一个名为IPRIP的服务,且服务的描述与服务名称等信息也确定。

6.这个恶意代码是否存在一些有用的网络特征吗?

打开WireShark抓包可以发现此程序对www.practicalmalwareanalysis.com的DNS请求,而且程序会对此域名发起一个GET请求用来请求serve.html的文件,请求数据包中的UserAgent虚拟机的名称Windows XP 6.11

Lab3-3

在一个安全的环境下执行Lab03-03.exe文件中发现的恶意代码,同时使用基础的动态行为分析工具监视他的行为。

1.当你使用Process Explorer工具进行监视时,你注意到了什么?

通过对恶意代码的静态分析,程序的导入函数如下:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Address	Ordinal	Name	Library
00404000 CloseHandle KERNEL32
00404004 VirtualFree KERNEL32
00404008 ReadFile KERNEL32
0040400C VirtualAlloc KERNEL32
00404010 GetFileSize KERNEL32
00404014 CreateFileA KERNEL32
00404018 ResumeThread KERNEL32
0040401C SetThreadContext KERNEL32
00404020 WriteProcessMemory KERNEL32
00404024 VirtualAllocEx KERNEL32
00404028 GetProcAddress KERNEL32
0040402C GetModuleHandleA KERNEL32
00404030 ReadProcessMemory KERNEL32
00404034 GetThreadContext KERNEL32
00404038 CreateProcessA KERNEL32
0040403C FreeResource KERNEL32
00404040 SizeofResource KERNEL32
00404044 LockResource KERNEL32
00404048 LoadResource KERNEL32
0040404C FindResourceA KERNEL32
00404050 GetSystemDirectoryA KERNEL32
00404054 Sleep KERNEL32
00404058 GetCommandLineA KERNEL32
0040405C GetVersion KERNEL32
00404060 ExitProcess KERNEL32
00404064 TerminateProcess KERNEL32
00404068 GetCurrentProcess KERNEL32
0040406C UnhandledExceptionFilter KERNEL32
00404070 GetModuleFileNameA KERNEL32
00404074 FreeEnvironmentStringsA KERNEL32
00404078 FreeEnvironmentStringsW KERNEL32
0040407C WideCharToMultiByte KERNEL32
00404080 GetEnvironmentStrings KERNEL32
00404084 GetEnvironmentStringsW KERNEL32
00404088 SetHandleCount KERNEL32
0040408C GetStdHandle KERNEL32
00404090 GetFileType KERNEL32
00404094 GetStartupInfoA KERNEL32
00404098 HeapDestroy KERNEL32
0040409C HeapCreate KERNEL32
004040A0 HeapFree KERNEL32
004040A4 RtlUnwind KERNEL32
004040A8 WriteFile KERNEL32
004040AC HeapAlloc KERNEL32
004040B0 GetCPInfo KERNEL32
004040B4 GetACP KERNEL32
004040B8 GetOEMCP KERNEL32
004040BC HeapReAlloc KERNEL32
004040C0 LoadLibraryA KERNEL32
004040C4 MultiByteToWideChar KERNEL32
004040C8 LCMapStringA KERNEL32
004040CC LCMapStringW KERNEL32
004040D0 GetStringTypeA KERNEL32
004040D4 GetStringTypeW KERNEL32

字符串列表:

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
30
31
Address	Length	Type	String
.rdata:004040EC 0000000F C runtime error
.rdata:00404100 0000000E C TLOSS error\r\n
.rdata:00404110 0000000D C SING error\r\n
.rdata:00404120 0000000F C DOMAIN error\r\n
.rdata:00404130 00000025 C R6028\r\n- unable to initialize heap\r\n
.rdata:00404158 00000035 C R6027\r\n- not enough space for lowio initialization\r\n
.rdata:00404190 00000035 C R6026\r\n- not enough space for stdio initialization\r\n
.rdata:004041C8 00000026 C R6025\r\n- pure virtual function call\r\n
.rdata:004041F0 00000035 C R6024\r\n- not enough space for _onexit/atexit table\r\n
.rdata:00404228 00000029 C R6019\r\n- unable to open console device\r\n
.rdata:00404254 00000021 C R6018\r\n- unexpected heap error\r\n
.rdata:00404278 0000002D C R6017\r\n- unexpected multithread lock error\r\n
.rdata:004042A8 0000002C C R6016\r\n- not enough space for thread data\r\n
.rdata:004042D4 00000021 C \r\nabnormal program termination\r\n
.rdata:004042F8 0000002C C R6009\r\n- not enough space for environment\r\n
.rdata:00404324 0000002A C R6008\r\n- not enough space for arguments\r\n
.rdata:00404350 00000025 C R6002\r\n- floating point not loaded\r\n
.rdata:00404378 00000025 C Microsoft Visual C++ Runtime Library
.rdata:004043A4 0000001A C Runtime Error!\n\nProgram:
.rdata:004043C4 00000017 C <program name unknown>
.rdata:004043DC 00000013 C GetLastActivePopup
.rdata:004043F0 00000010 C GetActiveWindow
.rdata:00404400 0000000C C MessageBoxA
.rdata:0040440C 0000000B C user32.dll
.rdata:004046B8 0000000D C KERNEL32.dll
.data:00405030 0000000D C \\svchost.exe
.data:00405040 00000015 C NtUnmapViewOfSection
.data:00405058 0000000A C ntdll.dll
.data:00405064 00000008 C UNICODE
.data:0040506C 0000000D C LOCALIZATION

可以看到,导入函数中有很多涉及内存、文件、线程的操作,因此在动态分析时可以多多注意这些点的动态变化。

在Process Monitor过滤器中选择进程名称为Lab03-03.exe并选择对应文件的操作,可以看到此恶意代码有对svchost.exe和conime.exe文件的操作,结合之前在导入表中看到的函数猜测恶意代码可能对这些文件进行了内存的修改,打开Process Explorer发现出现了一个svchost.exe作为父进程出现的进程,而正常情况下,svchost.exe通常在Windows中作为子进程出现,因此我们看一下此进程的属性,在字符串页中通过对比发现,此进程的字符串有与Lab03-03.exe的字符串,且内存中的字符串与其他svchost.exe进程的字符串不同,而磁盘映像却与其他正常进程相同,因此可以知道恶意代码确实对程序在内存中的数据进行了修改。

2.你可以找出任何的内存修改行为吗?

程序修改了svchost.exe程序运行时的内存。

3.这个恶意代码在主机上的感染迹象特征是什么?

在Process Monitor中可以看到svchost.exe大量的文件读写操作,目标文件是与Lab03-03.exe文件同一目录下的practicalmalwareanalysis.log

打开此文件可以看到如下内容:

结合在内存中看到的类似于[ENTER][SHIFT]等字符串猜测这个文件用于记录键盘敲击,验证后发现确实如此。

因此创建一个名为practicalmalwareanalysis.log的文件是此恶意代码的感染迹象特征。

4.这个恶意代码的目的是什么?

此程序使用进程替换技术来运行一个键盘记录器。

Lab3-4

使用基础的动态行为分析工具来分析在Lab03-04.exe文件中发现的恶意代码。

(这个程序还会再第九章的实验作业中进一步分析)

1.当你运行这个文件时会发生什么?

双击这个文件后在Process Monitor中发现程序通过调用cmd.exe来执行语句:

1
"C:\WINDOWS\system32\cmd.exe" /c del C:\DOCUME~1\ADMINI~1\桌面\BINARY~1\BINARY~1\CH9F95~1\Lab03-04.exe >> NUL

实现自我删除。

2.是什么原因造成动态分析无法有效实施?

通过静态分析发现,程序似乎对运行参数有一定的要求:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4; // [esp+10h] [ebp-181Ch]
char v5; // [esp+410h] [ebp-141Ch]
char v6; // [esp+810h] [ebp-101Ch]
char v7; // [esp+C10h] [ebp-C1Ch]
CHAR v8; // [esp+1024h] [ebp-808h]
CHAR ServiceName; // [esp+1428h] [ebp-404h]
const char *v10; // [esp+1828h] [ebp-4h]

if ( argc == 1 )
{
if ( !sub_401000() )
sub_402410();
sub_402360();
}
else
{
v10 = argv[argc - 1];
if ( !sub_402510((int)v10) )
sub_402410();
if ( _mbscmp((const unsigned __int8 *)argv[1], &byte_40C170) )
{
if ( _mbscmp((const unsigned __int8 *)argv[1], &byte_40C16C) )
{
if ( _mbscmp((const unsigned __int8 *)argv[1], &byte_40C168) )
{
if ( _mbscmp((const unsigned __int8 *)argv[1], aCc) )
sub_402410();
if ( argc != 3 )
sub_402410();
if ( !sub_401280(&v5, 1024, &v6, 1024, &v4, 1024, &v7) )
sub_402E7E(aKSHSPSPerS, &v5);
}
else
{
if ( argc != 7 )
sub_402410();
sub_401070(argv[2], argv[3], argv[4], argv[5]);
}
}
else if ( argc == 3 )
{
if ( sub_4025B0(&v8) )
return -1;
sub_402900(&v8);
}
else
{
if ( argc != 4 )
sub_402410();
sub_402900(argv[2]);
}
}
else if ( argc == 3 )
{
if ( sub_4025B0(&ServiceName) )
return -1;
sub_402600(&ServiceName);
}
else
{
if ( argc != 4 )
sub_402410();
sub_402600(argv[2]);
}
}
return 0;
}

但是由于本章不涉及静态分析,故本题留在第九章继续分析。

3.是否有其他方式来运行这个程序?

暂无。


本章结束🎊

您的支持是我最大的动力🍉