惡意代碼分析實戰六:熊貓燒香病毒樣本分析
熊貓燒香行為分析
查殼
因為程序肯定是病毒,我就不上傳殺毒網去查殺了。正常我們在分析一個未知惡意程序的時候,流程都是要先上傳殺毒網看看。
用PEID進行查殼,顯示未加殼,程序采用Delphi語言開發。

補充下Dephi開發的程序和C++開發的程序的一些區別。
區別:
1.Delphi在函數調用時參數的傳遞不完全用棧,主要用寄存器。
2.而C++程序函數調用前會使用push語句將參數入棧,然后再進行call。
3.Delphi一般將第一個參數放入eax寄存器,第二個參數放入edx,第三個參數放入ecx寄存器,其余參數按照與VC程序類似的方式壓棧。
4.總之,Delphi編譯器默認以register方式傳遞函數參數。這一點與VC編譯的程序完全不同。
5.提示:棧上給局部變量分配空間的時候,棧是向下增長的,而棧上的數組、字符串、結構體等卻是向上增長的。理解這一點可以幫助識別棧上的變量。
簡單靜態分析
用Strings和Dependency分別對熊貓燒香的字符串和導出表進行分析。
首先來看Strings分析出的字符串,這里面顯示出了很多弱口令密碼,猜測應該是會爆破內網的135端口弱口令,來入侵內網機器傳播病毒的一個方式。還可以看到程序可能會自動感染U盤。導出表中分析出URLDownload函數,此函數多為下載者惡意程序。
弱口令內網135端口爆破
感染U盤
下載者功能
135弱口令爆破密碼。

U盤感染字符串關鍵字。

惡意下載者函數。

行為分析
進程樹監控
這里我們還是用Process Monitor來監控病毒行為,打開Process Monitor,在篩選條件中將“樣本.exe”加入到篩選器的“Process Name”中,然后運行病毒,首先可以查看一下進程樹:

在進程樹中可以發現,“樣本.exe”衍生出了”spoclsv.exe”。衍生出的進程又打開了兩次“cmd.exe”。
“cmd.exe /c net share C$ /del /y”
“cmd.exe /c net share admin$ /del /y”
第一條命令,它的意思是在命令行模式下刪除C盤的網絡共享,執行完后關閉cmd.exe。因為我的虛擬機里面只有一個C盤,所以我們有理由相信,這個病毒應該是會關閉系統中所有磁盤的網絡共享。
第二條命令是取消系統根目錄的共享。
注冊表監控
將RegSetValue添加到篩選器的“Operation”中,可以看到注冊表的行為:

注冊表的這個位置主要是用來隨機數種子的生成,僅僅靠這條信息是無法推測出病毒的行為的,所以這里我們認為“樣本.exe”對于注冊表是沒有實質的影響。
文件監控
將CreateFile添加到篩選器的“Operation”中,可以看到文件操作的行為:

可以在標紅處位置看見,“樣本.exe”在C:\Windows\system32\drivers目錄創建了文件”spoclsv.exe”,之后就沒有什么可疑的文件操作了,所以我們可以判斷,這個惡意百度真正的破壞部分是由”spoclsv.exe”實現的,那么我們接下來就是專門來監控這個進程即可。
spoclsv.exe注冊表監控
這里我們需要將進程spoclsv.exe的進程加入篩選器進行分析。一般來說,病毒所產生的操作會比較多,所以我們這里為了便于討論研究,我們就只列出比較常用的操作選項來顯示,我們先來看看RegCreateKey和RegSetValue:

可見,惡意程序創建了一個啟動項svcshare,使spoclsv.exe每次重啟后可繼續運行。接著還可以看到Hidden關鍵字,對注冊表的這個位置進行設置,能夠實現文件的隱藏。此處進行設置后,即便在”文件夾選項”中選擇”顯示所有文件和文件夾”,也無法顯示隱藏文件。
接著我們來看看RegDeleteValue:

可見惡意程序會將當時幾乎所有的安全類工具的啟動項都給刪除。
spoclsv.exe文件監控
對于文件的監控,主要是看病毒是否將自己復制到其他目錄,或者是創建輸出了哪些文件等,監控如下:


惡意程序會在C:\Windows\system32\drivers創建spoclsv.exe這個文件,然后會在C盤根目錄創建setup.exe和autorun.inf,并且還會在一些目錄生成Desktop_.ini文件。因為創建了這些文件之后就對注冊表中的SHOWALL項進行了設置,使得隱藏文件無法顯示,因此這些所創建出來的文件屬性都是隱藏的。
spoclsv.exe網絡監控分析
在Process Monitor工具欄中只選擇Show NetWork Activity,見如下圖:

圖中,192.168.200.x是我虛擬機的內網網段,可見惡意程序會不斷的嘗試連接我內網中的其他計算機,而且還會向47.74.46.59訪問http發送和接受數據。
行為總結
熊貓燒香逆向分析
在這里我們利用逆向界的倚天劍和屠龍刀,IDA和OD來對熊貓燒香進行逆向分析,對其內部實現的原理有個了解,因為篇幅關系不會對整個程序徹底分析,而是挑揀一些重要內容進行分析。
main入口函數
用“倚天劍”IDA Pro載入樣本后可以看到如下圖:
圖1是樣本的main函數入口最開始的匯編代碼,我們不從第一行匯編代碼開始看,因為大部分內容都是Delphi自動生成的,我們只找關鍵位置來看。

圖2是和圖1連在一起的,因為圖片太長我就分兩次截圖了,我們這次任務就是分析這兩張圖中的細節。

sub_403C98(AllocStrCpy)
Part1:
我們在圖1中可以看到有兩個sub_403C98的函數,因為之前說過上面代碼都是Delphi自動生成的,所以這里就不分析,我們最開始的地方應當是標紅這位置開始分析:

在圖中我們可以看到兩處地方都有個edx寄存器賦值,我們之前說過Delphi程序用寄存器來傳參數,所以這里的eax和edx都是call的參數,我們下面來仔細看看是什么數據給了edx。
Part2:
雙擊dword_40CC40處,IDA會跳轉到如下地方:

其實這些都是中文數據,只不過IDA Pro沒有自動識別出來,我們可以按alt+a出現如下界面后選C-style,就可以在圖中看到IDA Pro把數據識別成了***武*漢*男*生*感*染*下*載*者***的中文。


Part3:
我們再來看看是什么數據給了eax寄存器,同樣雙擊dword_40E7D4處,IDA Pro跳轉如下:

可見IDA Pro跳轉到了BSS段,我們可以猜測dword_40E7D4是一個未初始化的全局變量,接著我們來用屠龍刀OD 來驗證下,call函數過后會把什么數據放入這個全局變量。
Part4:
載入程序后,在0x0040CB7E地址處進行下斷,然后F9運行到此位置:

接著我們鼠標右鍵數據窗口中跟隨eax寄存器,此時在內存數據窗口中跳轉到了eax寄存器的地址處,并且可以從如下圖中看到0x0040E7D4處的內容是0,因為全局變量未初始化時候,編譯器默認會將數據初始為0

這時候我們F8單步步過Call后,可見有數據被寫入到地址中了。

因為寫入的是一個地址數據,所以我們要在內存窗口中右鍵長型->地址,來使得數據更加可視化。

其地址的內容就是Call函數傳入的第2個參數字符串,***武*漢*男*生*感*染*下*載*者***。
另外一個感謝艾瑪,mopery對此木馬的關注!~的Call也是用同樣方式進行分析,作者不再贅述,至此我們分析出了sub_403C98函數的功能,并把他重命名為AllocStrCpy拷貝字符串到全局變量中。

sub_405360(Decode)
接著繼續分析第一張圖的如下圖的地方,從圖中可見call sub_405360,有兩個參數:(1)xboy,(2)一段看似加密的字符串。

可見,經過Call后在ecx寄存器中得到了解密后的字符串***武*漢*男*生*感*染*下*載*者***。

接著,我們進入Call內部詳細分析解密算法,首先:如下圖有一個循環的地方值得我們注意,位置在0x4053D1。

之后借助OD的單步調試并且觀察寄存器和堆棧信息,逐一對這個循環中的內容進行詳細分析:

我用C++代碼還原了此匯編的加密算法,運行后得到的結果是一致的。

Delphi逆向小技巧
其實Delphi有專門的反編譯器,其效果不比IDA Pro差,甚至更勝一籌,其中值得比較推薦的一款就是IDR。
IDR能分析出IDA Pro無法識別的符號,而且對中文字符串的顯示效果也很不錯,點擊SRC按鈕還能反編譯成Delphi偽代碼。


它可以將符號表(Map)文件導出,便于我們在OD中載入符號表進行調試。



顯示出了Delphi的符號,便于分析和調試。

sub_404018(strcmp)
我們用了上面介紹的小技巧后,分析起來就輕松多了,這里直接分析出了sub_404018是一個strcmp字符串比較函數,用來比較解密后的字符串是否等同于全局變量。

這作者好像個智障有沒有覺得,他直接把明文寫在代碼里面用來和解密后的字符串進行比較?那你還加密啥呢?別人不逆你這Decode也能知道解密后的字符串是什么了,真是無語這種寫法。

① sub_00408024(偽裝)
接下來就是逆向分析這3個Call了,首先我們來分析第一個Call:拷貝自身到系統目錄進行偽裝,并且設置為隱藏屬性,接著用Winexec函數打開系統目錄下偽裝的程序,并且退出當前進程。

Part1:
ParamStr函數功能是根據索引返回命令行程序的參數,傳入的是0返回結果是命令行程序的路徑。

傳入ParamStr返回來的絕對路徑,Call過后返回來程序的目錄路徑,即C:\Users\Administrator\Desktop,所以sub_00405684可以將其重命名為SubExePath。


Part2:
接著會用strcat函數拼接成如下字符串
C:\Users\Administrator\Desktop\Desktop_.ini:

傳入字符串:C:\Users\Administrator\Desktop\Desktop_.ini,Call0x004057A4,用IDR進入這個函數分析后有明顯的API函數,可以猜測此函數是將Desktop_.ini這個文件的最后寫入時間轉換成DOS時間。

斷點的數據。


DOS時間。

這里面截圖截錯了,應該是前4個字節對應時間的數據,首先0x531E ,其中0x1E代表的年月日里面的日,其余數據對應的根據MSDN上的文檔進行轉換。
part3:
我們part2分析的函數重命名為GetFileTime2DosTime,然后繼續分析下面這一段代碼。
他會根據上面Part2的函數返回值進行判斷,如果返回值為0就跳轉也就是不存在Desktop_.ini文件就跳轉,如果有存在Desktop_.ini文件存在則顯示將屬性設置為正常,然后再刪除此文件。

part4:
接著執行完流程后到達00408110位置處繼續分析,一開始便是先獲取了自身路徑然后傳入一個call,之后堆棧里面有個下載者相關的字符串信息這個先不管感覺沒什么用,然后就是一些字符串的處理一路向下,最后到了紅色標記方塊處,從OD動態調試分析中可以看出他獲取了系統目錄然后拼接了成了字符串C:\Windows\system32\drivers\spoclsv.exe,不知道各位大佬還記不記得我們在行為分析的時候,就有分析出樣本.exe會把自身拷貝到這個目錄,達到偽裝隱蔽的效果。

part5:
猜測這下面應該就是用代碼來實現拷貝自身到系統目錄了,動靜態分析后確實發現是將自身程序拷貝到系統目錄改名為系統文件名進行偽裝,并且設置屬性為隱藏屬性。

接著程序就會運行在系統目錄下的自身程序,并且退出當前的進程,當用OD call這個ExitProcess 程序就會退出跑飛。

② sub_0040CA5C
第二個Call: 創建一個線程,設置定時器,創建隨機數,線程函數內網135端口批量爆破。
進入Call后分別有3個Call,第一個是創建線程。


第二個Call是設置一個Timer計時器。

第三個Call有創建隨機數,然后調用線程函數運行sub_0040B76C。


③ sub_0040C97C
第3個Call:終止定時器,設置4個新的計時器

學習總結
終于到此熊貓燒香都分析完了,從行為分析開始然后過渡到IDR軟件靜態分析,x32dbg動態調試分析,分析每個Call的用途,結合動靜態進行驗證猜測還原代碼,希望各位能通過此篇文章學習到一些基礎和技巧,個人水平有限文章內如有錯誤請指正謝謝。
有興趣的可加QQ群:1145528880 (一起學習 逆向、PWN二進制安全、Web信息安全、IoT安全、游戲逆向分析原理交流)
