天天看點

動态分析基礎技術動态分析基礎技術

動态分析基礎技術

原文連結: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.是否有其他方式來運作這個程式?

暫無。

本章結束?

繼續閱讀