天天看点

动态分析基础技术动态分析基础技术

动态分析基础技术

原文链接:https://hvnt3r.top/2019/01/动态分析基础技术/

知识点

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

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

前一段时间我使用过布谷鸟沙箱(

Cuckoo

),这一款沙箱的结构是首先开启一个安装有

Ubuntu14.04

的系统用于安装Cuckoo,然后再向这个虚拟机上安装所有

Cuckoo

依赖的插件,安装完成后再向

Ubuntu

中安装一个

Vmware

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

Ubuntu14.04

的物理主机。

类似于这样的沙箱还有

Norman

GFI

Anubis

Joe

ThreatExpert

BitBlaze

Comodo

等沙箱。

沙箱的缺点:

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

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

rundll32.exe DLL_name, Export_arguments
           

Export_arguments

必须是DLL文件导出函数的函数名或者是函数序号,使用函数名可以直接将函数名作为

Export_arguments

参数的值,如果使用函数序号需要写为井号加数字的形式来表示序号如

#2

比如使用命令

rundll32.exe shell32.dll,RestartDialog

可以使计算机弹出重新启动窗口

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

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

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

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

  • ApateDNS:此软件是一款免费软件,可以很方便的发现恶意代码进行的DNS请求。
  • WireShark:不必多说,神器。
  • NetCat:瑞士军刀,神器。
  • INetSim:INetSim是一款基于Linux的模拟网络的免费软件他可以模拟多种服务如

    Http

    Https

    FTP

    IRC

    DNS

    SMTP

    等,而且可以根据恶意代码的请求做出尽量符合恶意代码要求的返回动作从而帮助我们研究恶意代码。

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

课后练习

Lab3-1

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

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

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

00400200		ExitProcess	   kernel32
           

PEiD

查壳发现此程序确实加了壳,壳为

PEncrypt 3.1 Final -> junkcode

,但此题不需要脱壳。

字符串列表:

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地址:
#########################################
# 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请求:
#########################################
# 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
           
  • 接着转到接近配置文件末尾的地方,开启重定向:
#########################################
# 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端口用于连接:
#########################################
# 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
           
  • 重定向外部地址:
#########################################
# 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

发现如下报错:

后来得知

InetSim

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

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

动态分析基础技术动态分析基础技术

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

动态分析基础技术动态分析基础技术

WireShark

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

Lab3-2

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

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

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

此程序的导出函数列表:

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

导入函数:

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
           

程序中的字符串:

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	[email protected]@
           

我们能从以上信息中发掘到很多重要的点,通过对程序的静态分析猜测此程序会根据导出函数向Windows中安装一个服务,因此我们试着用

rundll32.exe

来执行这个安装函数

Install

,还有一个函数时

installA

,实际上还是调用的

Install

,因此我们只需要运行

installA

函数即可,在运行此函数之前先打开

RegShot

ProcessMonitor

以防止漏掉重要信息:

rundll32.exe Lab03-02.dll,installA
           

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

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

以上信息告诉我们恶意代码创建了一个名为

IPRIP

的服务,在注册表编辑器中找到相关条目可发现更多与此服务相关的信息:

动态分析基础技术动态分析基础技术

ImagePath

字段中可以得知此DLL会依赖

svchost.exe

来启动执行,上图中的一些信息可以作为此恶意代码的特殊指纹作为识别依据。

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

使用如下命令:

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工具进行监视时,你注意到了什么?

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

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
           

字符串列表:

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来执行语句:

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

实现自我删除。

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

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

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.是否有其他方式来运行这个程序?

暂无。

本章结束?

继续阅读