动态分析基础技术

动态分析基础技术

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

知识点

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

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

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

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

沙箱的缺点:

  • 有些恶意代码会检测运行环境是否为虚拟环境,如果是虚拟环境,则恶意代码通常不会表现出真正的功能。
  • 恶意代码通常会连接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的模拟网络的免费软件他可以模拟多种服务如HttpHttpsFTPIRCDNSSMTP等,而且可以根据恶意代码的请求做出尽量符合恶意代码要求的返回动作从而帮助我们研究恶意代码。

关于动态分析过程中用的软件,嘶吼上有一篇文章介绍: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 
#
# 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 
#
# 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 
#
# Default: 127.0.0.1
#
service_bind_address	192.168.60.129
  • 打开TCP端口用于连接:
#########################################
# redirect_exclude_port
#
# Connections to  on this port
# are not redirected
#
# Syntax: redirect_exclude_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 
#
# Default: none
#
redirect_external_address	192.168.60.129

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

* 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中的函数:

此程序的导出函数列表:

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

暂无。


本章结束?


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部