動态分析基礎技術
原文連結: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
的虛拟機的IP位址:INetSim
#########################################
# 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
的虛拟機的IP位址,以接收DNS請求:INetSim
#########################################
# 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.是否有其他方式來運作這個程式?
暫無。