2020-2021 惡意程式碼 20181230實驗五——動靜態聯合除錯
2020-2021 惡意程式碼 20181230實驗五——動靜態聯合除錯
目錄實踐目標:
部分一:
1.將樣例程式碼上傳到線上防毒中心進行分析並檢視報告,從報告可以看出什麼資訊?
2.這個檔案是否加殼了?如果加殼了,請進行脫殼;
3.有沒有匯入函式能夠暗示出這個程式的功能?如果有,你認為是哪些函式,從這些函式你可以得到什麼資訊?
4.有沒有什麼線索可以被用來在被感染主機上進行該惡意程式碼的查詢?
5.這個檔案的作用可能是什麼?
部分二:
1.當計算機重啟後,這個程式如何確保它繼續執行;
2.為什麼這個程式會一直使用一個互斥量;
3.可以用來檢測這個程式的基於主機特徵是什麼;
4.檢測這個惡意程式碼的基於網路特徵是什麼;
5、這個程式的目的是什麼;
6、這個程式什麼時候完成;
實踐過程:
部分一:Lab01-02.exe
將Lab01-02.exe檔案上傳至http://www.VirusTotal.com/進行分析並檢視報告。檔案匹配到了已有的反病毒軟體特徵嗎?
分析報告如下
69家機構有50個顯示存在惡意程式碼,並且顯示進行了upx加殼。
下面是該病毒的一些特徵:
由上圖可以得出該病毒具有一下特徵:
Trojan/Win32.StartPage.C26214 修改瀏覽器主頁
Trojan Clicker 木馬點選病毒
Trojan Generic:擁有與特洛伊木馬病毒疑似功能的程式碼;
TR/Downloader.Gen 有下載功能
malware.gen 記錄鍵盤輸入,並傳出
問題二:
是否有這個檔案被加殼或混淆的任何跡象?如何是這樣,這些跡象是什麼?如果該檔案被加殼,請進行脫殼,如果可能的話。
通過PEiD
的檢測,檢測結果為Nothing Found
。即沒有找到殼,這種情況可能有兩種原因:1.該程式沒有加殼;2.該程式加殼了,但該殼比較新,該軟體檢測不出來。
但注意到了EP Section
中的標識為UPX1
,說明這個exe檔案很可能用了一個UPX技術的變種,所以PEiD才會識別不出來.
然後我們用Dependency Walker
,我們就會發現這個程式碼的匯入表KERNEL32.DLL
中有兩個函式LoadLibraryA
,GetProcAddress
.這兩個函式都是加殼的跡象,因為加殼的程式執行時候脫殼是必須要這兩個函式的。
下面再使用PE viewer進一步檢測:
首先該程式的節部分很奇怪,顯示的是UPX0,UPX1,UPX2.
而不是常見的.text .data .rdata .rsrc
,很明顯這是UPX加殼後的表現.下面通過虛擬大小與原始資料大小的對比就能發現端倪。
分節 | 虛擬大小 | 原始資料大小 |
---|---|---|
UPX0 | 00004000 | 00000000 |
UPX1 | 00001000 | 00000600 |
UPX2 | 00001000 | 00000200 |
在IMAGE_SECTION_HEADER UPX0
中可得出Virtual Size
為00004000
Size of Raw Data
為00000000
, 所以Virtual Size
比Size of Raw Data
大
且IMAGE_SECTION_HEADER UPX1
和IMAGE_SECTION_HEADER UPX2
中的也是Virtual Size
比Size of Raw Data
大,所以可以確定該程式被加殼了.
並通過查資料該程式可能是UPX加殼,所以我們嘗試一下脫殼:
使用UPX.exe進行脫殼,過程如下:
將Lab01-02.exe
複製到upx
所在資料夾下
命令列執行upx.exe
執行命令:upx -d Lab01-02.exe
進行脫殼,顯示成功。
再把已脫殼的檔案放到http://www.VirusTotal.com/進行分析並檢視報告,可以發現檔案以及脫殼了。
問題三:
有沒有任何匯入函式能夠暗示這個程式的功能?如果有,是哪些匯入函式,它們會告訴你什麼?
現在我們繼續對脫殼後的程式分析,使用Dependency Walker
對該程式進行分析:
由上圖可以看見該程式共有四個動態連結庫:
KERNEL32.DLL ADVAPI32.DLL MSVCRT.DLL WININE.DLL
KERNEL32.DLL
SystemTimeToFileTime 是一個程序,即系統時間本地時間。
GetModuleFileNameA 獲取當前程序已載入模組的檔案的完整路徑,該模組必須由當前程序載入。
CreatWaitableTimerA 建立計時器物件
ExitProcess 退出程式
OpenMutex 開啟互斥
SetWaitableTimer 啟動一個可等待計時器
WaitForSingleObject
CreatMutex 建立一個互斥體
CreatThread 建立一個執行緒
ADVAPI32.DLL
Advapi32.dll,使用了登錄檔,提醒我們注意程式中象登錄檔鍵值的字串,還有服務管理.可能會惡意關閉一些服務是某些程式不能執行,或者自動開啟一些服務。
CreateServiceA 建立一個服務物件,並將其新增到指定的服務控制管理器資料庫
StartServiceCtrlDispatcherA 呼叫服務程式
OpenSCManagerA 建立一個連線到服務控制管理器並開啟它的資料庫
WININET.DLL
WININE.DLL使用了網路服務,InternetOpenUrl,可以訪問網站,這裡值得警惕,該惡意木馬可能會通過訪問網路下載更多病毒,或者實時監控該主機,InternetOpenA 初始化一個應用程式
問題四:
有沒有什麼線索可以被用來在被感染主機上進行該惡意程式碼的查詢?
使用Strings.exe檢視脫殼的程式,內容如下:
出現可疑的URL: www.malwareanalysisbook.com 還有IE8.0 推測應該是使用IE開啟該網站
猜測可以通過檢視瀏覽器瀏覽記錄來推測是否有感染的可能。
問題五:
這個檔案的作用可能是什麼?訪問一個非法網站
部分二:Lab07-01.exe
利用PEID分析目標程式匯入函式:
ADVAPI32.dll:
兩個API函式:
CreateServiceA
OpenSCMangerA
推測是建立一個服務來保證系統啟動後也能繼續執行——問題1。
WININET.dll:
InternetOpenUrlA
InternetOpenA
推測程式會連線一個網站
利用IDApro進行分析
main函式:
API 函式:
StarServiceCtrIDispatcherA
:用於實現服務,決定服務控制管理器所呼叫的服務控制函式(這裡是sub_401040
),sub_401040
在StarServiceCtrIDispatcherA
被呼叫完後再被呼叫。
雙擊開啟sub_401040
首先呼叫OpenMutexA
函式,該函式會嘗試獲取名為HGL345
互斥量的控制代碼,如果互斥量存在則呼叫ExitProcess
結束程式,如果不存在則按照右邊的流程繼續執行程式。
如果互斥量不存在則在該流程中會先呼叫CreateMutexA
建立名為HGL345
的互斥量,該互斥量是該惡意程式的一個本地特徵,通過該互斥量以及這些函式通過圖中的編碼方式是為了保證在任意時刻在夕惕若只有一個該程式執行。
OpenSCManagerA
函式用於開啟一個服務控制管理器,以便於該程式可以新增和修改服務,接著呼叫GetCurrentProcess
來獲取當前程序的偽控制代碼(可以被複制,但不能被繼承,而且在程式最後不需要呼叫closehandle來關閉控制代碼)
GetModuleFileNameA
:獲取當前所執行程式的完整路徑。獲取之後呼叫CreateServiceA
,用來建立一個新的服務。
三個特別重要的引數:
lPBinaryPathName
:用於儲存獲取的當前所執行程式的完整路徑,用於服務的安裝。
dwStartType
:服務的啟動選項,這裡是2,對應ServiceAutoStart
,意思是服務會系統啟動時自動執行。
dwserviceType
:服務的型別,這裡是10h,表明該服務運行於獨立程序的服務程式。
服務名稱為:Malservice
綜上所述:該程式會建立一個名為Malservice
的服務來保證在每次系統啟動後可以自動執行,從而到達持久化的駐留。
edx
先自我異或以到達置零的效果,方便後續賦值操作。
SystemTime
:windows一個關於時間的結構體。wYear
,wDayOfWeek
,wHour
,wSecond
分別是年,星期,小時,秒,將這四個變數設定為0(edx),之後將年賦值為834h,換10進製為2100,即2100年。這些賦值下來意思為2100年1月1日的0點0分0秒。之後呼叫SysTimeToFileTime
將系統的時間轉換為檔案的時間。
三個API函式:
CreateWaitableTimerA
,SetWaitableTimer
,WaitForSingleObject
。
而SetWaitableTimer
存在一個IpDuetime
引數,為SysTimeToFileTime
返回的FileTime(檔案的時間),即需等待到的時間。然後呼叫WaitForSingleObject
函式,進入等待,一直等待到上面所設定的2100年1月1日的0點0分0秒才繼續執行。
到達時間繼續執行後,存在一個名為esi
的計數器,將14h(十進位制20)賦值給esi。並且迴圈最後esi
會自減(dec esi),即迴圈執行20次。
在迴圈里程序呼叫CreateThread
建立執行緒函式,其中lpstartaddress
引數會顯示那些函式會線上程建立後得到執行。
雙擊開啟lpstartaddress
程式首先呼叫InternetOpenA
來初始化一個網路連線,接著執行迴圈,在迴圈中呼叫InternetOpenUrlA
,迴圈最後有一個無條件跳轉jmp
跳轉到loc_40116D
即該迴圈的起始位置,進行無限迴圈,不會終止,即一直不停的呼叫InternetOpenUrlA
函式來訪問圖中的網址。並且是啟用20個執行緒不斷訪問該網址。
綜上所述這是一個典型的DDoS攻擊(分散式拒絕服務攻擊)。