先用PEID分析一下,Delphi寫的,沒有殼算法
靜態分析
用IDA靜態分析一下shell
字符串
字符串中有一些和註冊表項相關的字符串網絡
Software\\Microsoft\\Windows\\CurrentVersion\\Run相關,應該是用來實現自啓動的,和關閉一些殺毒軟件自啓動的信息框架
SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\Folder\\Hidden\\SHOWALL\\CheckedValue,這個值爲0時不能顯示隱藏文件socket
Mcshield.exe等等不少的進程,這些都是殺毒軟件的名稱,應該是關閉殺毒軟件函數
c:\\test.txt,可能會用到這個文件編碼
desktop.ini,是系統可識別的一個文件,做用是存儲用戶對文件夾的個性設置(用戶更換文件夾圖標等等都會生成desktop.ini)spa
[AutoRun]\r\nOPEN=setup.exe\r\nshellexecute=setup.exe\r\nshell\\Auto\\command=setup.exe\r\n、:\\autorun.inf和:\\setup.exe,系統文件cdvsd.vxd偵測是否有光盤放入光驅,若是有的話就開始尋找光盤目錄下 的AutoRun.inf文件,若是存在則執行inf。AutoRun.inf不只能使光盤自啓還能做用與硬盤線程
cmd.exe /c net share admin$ /del /y,應該是網絡共享相關3d
導入函數
CriticalSection臨界區相關函數
VirtualFree、VirtualAlloc虛擬地址空間頁的分配釋放
LocalAlloc、LocalFree從堆中分配釋放內存
CreateThread,建立線程
CreateFileA、ReadFile、WriteFile建立、讀寫文件,
FindNextFileA,遍歷文件
RegSetValueExA、RegOpenKeyExA等註冊表函數
SetTimer等定時器函數
socket等網絡函數
OpenServiceA等操縱服務等函數
URLDownloadToFileA從遠程下載文件
大體分析可能存在的功能,管理進程,修改註冊表,修改文件,聯網、遠程下載等
動態分析
進程樹
目測只有這一個進程
進程行爲
也可使用火絨劍
應該是新建了spcolsv程序
可是這裏沒有出現網絡訪問的狀況,可能有一些觸發條件沒有達到
逆向分析
主函數梳理
直接IDA反編譯,個人IDA在分析字符串的時候有一些問題,Options->String litera style能夠更改字符串解碼方式,選上c風格,編碼方式使用gb2312就能夠正確顯示出前面幾個字符串了
看主函數
CODE:0040D0A0 push ebp CODE:0040D0A1 mov ebp, esp CODE:0040D0A3 add esp, 0FFFFFFE8h CODE:0040D0A6 push ebx CODE:0040D0A7 xor eax, eax CODE:0040D0A9 mov [ebp+var_18], eax CODE:0040D0AC mov [ebp+var_14], eax CODE:0040D0AF mov eax, offset dword_40CFF0 CODE:0040D0B4 call sub_4049E8 CODE:0040D0B9 mov ebx, offset Msg CODE:0040D0BE xor eax, eax CODE:0040D0C0 push ebp CODE:0040D0C1 push offset loc_40D1B5 CODE:0040D0C6 push dword ptr fs:[eax] CODE:0040D0C9 mov fs:[eax], esp CODE:0040D0CC mov eax, dword_40D1C4 CODE:0040D0D2 mov ds:dword_40F7E0, eax CODE:0040D0D8 mov eax, dword_40D1C8 CODE:0040D0DE mov ds:dword_40F7E4, eax CODE:0040D0E4 mov ax, word_40D1CC CODE:0040D0EB mov ds:word_40F7E8, ax CODE:0040D0F2 mov eax, offset dword_40F7D4 CODE:0040D0F7 mov edx, offset asc_40D1D8 ; "***武*漢*男*生*感*染*下*載*者***" CODE:0040D0FC call sub_403C98 CODE:0040D101 mov eax, offset unk_40F7D8 CODE:0040D106 mov edx, offset aMopery ; "感謝艾瑪,mopery,海色の月,對此木馬的關注!~" CODE:0040D10B call sub_403C98 CODE:0040D110 mov eax, offset unk_40F7DC CODE:0040D115 mov edx, offset sub_40D238 CODE:0040D11A call sub_403C98 CODE:0040D11F lea ecx, [ebp+var_14] CODE:0040D122 mov edx, offset aXboy ; "xboy" CODE:0040D127 mov eax, offset asc_40D270 ; "\"++戊+緩\"叛*聾+肛+刪\"蚊*苜+兆++*" CODE:0040D12C call sub_405360 ; 這裏的三個參數 CODE:0040D131 mov edx, [ebp+var_14] CODE:0040D134 mov eax, ds:dword_40F7D4 CODE:0040D139 call sub_404018 CODE:0040D13E jz short loc_40D149 ; 這個跳轉若是不成功,則程序直接退出了 CODE:0040D140 push 0 ; uExitCode CODE:0040D142 call ExitProcess_0 ; 這裏就退出了 CODE:0040D147 ; --------------------------------------------------------------------------- CODE:0040D147 jmp short loc_40D19A CODE:0040D149 ; --------------------------------------------------------------------------- CODE:0040D149 CODE:0040D149 loc_40D149: ; CODE XREF: start+9E↑j CODE:0040D149 lea ecx, [ebp+var_18] CODE:0040D14C mov edx, offset aWhboy_0 ; "whboy" CODE:0040D151 mov eax, offset aDTqTyldL ; "d}tq;*&tyld|l." CODE:0040D156 call sub_405360 CODE:0040D15B mov edx, [ebp+var_18] CODE:0040D15E mov eax, offset dword_40D2D8 CODE:0040D163 call sub_404018 CODE:0040D168 jz short loc_40D173 CODE:0040D16A push 0 ; uExitCode CODE:0040D16C call ExitProcess_0 CODE:0040D171 ; --------------------------------------------------------------------------- CODE:0040D171 jmp short loc_40D19A CODE:0040D173 ; --------------------------------------------------------------------------- CODE:0040D173 CODE:0040D173 loc_40D173: ; CODE XREF: start+C8↑j CODE:0040D173 call sub_4082F8 ;主要功能實現函數 CODE:0040D178 call sub_40CFB4 CODE:0040D17D call sub_40CED4 CODE:0040D182 jmp short loc_40D18A CODE:0040D184 ; --------------------------------------------------------------------------- CODE:0040D184 CODE:0040D184 loc_40D184: ; CODE XREF: start+F8↓j CODE:0040D184 push ebx ; lpMsg CODE:0040D185 call DispatchMessageA CODE:0040D18A CODE:0040D18A loc_40D18A: ; CODE XREF: start+E2↑j CODE:0040D18A push 0 ; wMsgFilterMax CODE:0040D18C push 0 ; wMsgFilterMin CODE:0040D18E push 0 ; hWnd CODE:0040D190 push ebx ; lpMsg CODE:0040D191 call GetMessageA CODE:0040D196 test eax, eax CODE:0040D198 jnz short loc_40D184 CODE:0040D19A CODE:0040D19A loc_40D19A: ; CODE XREF: start+A7↑j CODE:0040D19A ; start+D1↑j CODE:0040D19A xor eax, eax CODE:0040D19C pop edx CODE:0040D19D pop ecx CODE:0040D19E pop ecx CODE:0040D19F mov fs:[eax], edx CODE:0040D1A2 push offset loc_40D1BC CODE:0040D1A7 CODE:0040D1A7 loc_40D1A7: ; CODE XREF: start+11A↓j CODE:0040D1A7 lea eax, [ebp+var_18] CODE:0040D1AA mov edx, 2 CODE:0040D1AF call sub_403C68 CODE:0040D1B4 retn
很容易分析出函數傳遞參數是使用eax和edx
首先看sub_403C98的幾個調用處,這個函數的參數有兩個,第二個是字符串,第一個參數比較有意思,40F7D四、40F7D8和40F7DC,幾個連續的位置,且在BSS段中,估計是全局變量。
停在第一個sub_403C98的調用處,此時eax指向的位置是0,edx指向字符串"***武*漢*男*生*感*染*下*載*者***"
執行完以後,值變成了009f000c
繼續跟下去,發現此處的值變成了和原edx相同的字符串
暫時猜想sub_403C98多是一個內存分配,並複製字符串的函數,觀測後面函數的行爲也是如此
接着看 sub_405360函數,sub_4053603個參數,第一個是一個很奇怪中的字符串"\"++戊+緩\"叛*聾+肛+刪\"蚊*苜+兆++*",第二個參數是字符串"xboy",第三個參數是局部變量var_14,也是沒有返回值。看後面有對局部變量var_14值的保存,因此這裏的返回值應該是經過局部變量var_14來傳遞
一樣觀測一下這個函數的返回值狀況
函數執行前,局部變量中的值是0,執行完以後變成了009f000c,這個值以前看過,是前面的函數建立的內存
裏面的值就是以前的字符串值
再往下3句
CODE:0040D131 mov edx, [ebp+var_14] ;指向新建的字符串 CODE:0040D134 mov eax, ds:dword_40F7D4 ;這就是以前的固定字符串值 CODE:0040D139 call sub_404018
接着是這個函數的返回值處理
CODE:0040D13E jz short loc_40D149 ; 這個跳轉若是不成功,則程序直接退出了 CODE:0040D140 push 0 ; uExitCode CODE:0040D142 call ExitProcess_0 ; 這裏就退出了
猜想sub_404018應該是字符串比較函數,不等於0則直接退出了?若是正確,往下會執行一段和上面很是相似的函數。只不過傳遞的字符串變化了
CODE:0040D149 loc_40D149: ; CODE XREF: start+9E↑j CODE:0040D149 lea ecx, [ebp+var_18] CODE:0040D14C mov edx, offset aWhboy_0 ; "whboy" CODE:0040D151 mov eax, offset aDTqTyldL ; "d}tq;*&tyld|l." CODE:0040D156 call sub_405360 CODE:0040D15B mov edx, [ebp+var_18] CODE:0040D15E mov eax, offset dword_40D2D8 CODE:0040D163 call sub_404018 CODE:0040D168 jz short loc_40D173 CODE:0040D16A push 0 ; uExitCode CODE:0040D16C call ExitProcess_0
連續調用3個函數,這就是病毒的主要函數
CODE:0040D173 call sub_4082F8 CODE:0040D178 call sub_40CFB4 CODE:0040D17D call sub_40CED4
接下來就是GetMessageA和DispatchMessage,最後再調用了下面的函數,目測這部分就和程序邏輯沒有關係了,屬於語言加上的特定功能
CODE:0040D1A7 lea eax, [ebp+var_18] CODE:0040D1AA mov edx, 2 CODE:0040D1AF call sub_403C68
因此主函數須要關注的地方是sub_4082F八、sub_40CFB4和sub_40CED4這3個函數。另外,sub_405360中關於這兩個字符串的處理功能是幹什麼的也還不太明瞭。
sub_405360字符串解密函數分析
在程序中定義了一些字符串,他們的定義形式都是一個-1(這是用來管理引用的嗎),加上字符串長度,最後再加上字符串,這應該是語言對於字符串的底層定義實現。
回到字符串解析的主函數,代碼詳細註釋以下,最終的解密算法大體是逐次循環取得段字符串中字符,而後除以10的餘數和原字符串相異或
CODE:00405360 push ebp CODE:00405361 mov ebp, esp CODE:00405363 add esp, 0FFFFFFE8h CODE:00405366 push ebx CODE:00405367 push esi CODE:00405368 push edi CODE:00405369 xor ebx, ebx CODE:0040536B mov [ebp+var_18], ebx ; 清空局部變量 CODE:0040536E mov [ebp+var_10], ebx CODE:00405371 mov [ebp+var_14], ebx CODE:00405374 mov [ebp+return_val], ecx ; 這幾個局部變量的值對應函數參數 CODE:00405377 mov [ebp+short_str], edx CODE:0040537A mov [ebp+long_str], eax CODE:0040537D mov eax, [ebp+long_str] CODE:00405380 call sub_4040BC ; 參數個數爲1,經過eax傳遞,爲字符串 CODE:00405380 ; 這裏使用了lock指令,應該是和同步或是計數相關了 CODE:00405385 mov eax, [ebp+short_str] CODE:00405388 call sub_4040BC ; 參數個數爲1,經過eax傳遞,爲字符串 CODE:00405388 ; 這裏使用了lock指令,應該是和同步或是計數相關了 CODE:0040538D xor eax, eax CODE:0040538F push ebp CODE:00405390 push offset loc_40544A CODE:00405395 push dword ptr fs:[eax] ; 下面這兩句應該是和seh相關 CODE:00405398 mov fs:[eax], esp CODE:0040539B cmp [ebp+long_str], 0 CODE:0040539F jnz short loc_4053AB ; 字符串不爲空,因此這裏會跳轉 CODE:004053A1 mov eax, [ebp+return_val] CODE:004053A4 call sub_403C44 CODE:004053A9 jmp short loc_405422 CODE:004053AB ; --------------------------------------------------------------------------- CODE:004053AB CODE:004053AB loc_4053AB: ; CODE XREF: sub_405360+3F↑j CODE:004053AB lea eax, [ebp+var_14] CODE:004053AE mov edx, [ebp+short_str] CODE:004053B1 call sub_403CDC ; 傳入短字符串和一個局部變量的地址,讓var_14指向短字符串 CODE:004053B6 lea eax, [ebp+var_10] CODE:004053B9 call sub_403C44 CODE:004053BE mov eax, [ebp+long_str] CODE:004053C1 call str_length ; 字符串-4的位置存放的是字符串的位置,該函數返回該字符串的長度 CODE:004053C6 mov esi, eax CODE:004053C8 test esi, esi CODE:004053CA jle short loc_405417 CODE:004053CC mov ebx, 1 CODE:004053D1 CODE:004053D1 loc_4053D1: ; CODE XREF: sub_405360+B5↓j CODE:004053D1 mov eax, [ebp+var_14] ; 這是一個循環的開始,var_14應該是循環中使用的變量,esi做爲剩餘循環次數,ebx做爲當前長字串的遍歷位置(從0開始) CODE:004053D4 call str_length ; 字符串-4的位置存放的是字符串的位置,該函數返回該字符串的長度 CODE:004053D9 push eax ; 短字符串長度入棧 CODE:004053DA mov eax, ebx ; eax等於當前長字符串遍歷位置 CODE:004053DC pop edx ; edx指向字符串的長度 CODE:004053DD mov ecx, edx CODE:004053DF cdq ; edx會被清零,eax會被拓展成一個64位的數字 CODE:004053E0 idiv ecx ; 這裏就是使用長字符串的遍歷位置去除以短字符串的長度 CODE:004053E2 mov edi, edx CODE:004053E4 inc edi CODE:004053E5 mov eax, [ebp+var_14] CODE:004053E8 movzx eax, byte ptr [eax+edi-1] ; eax取得短字符串中的字符,第一次取得的是第二個字符而不是第一個 CODE:004053ED mov ecx, 0Ah CODE:004053F2 xor edx, edx CODE:004053F4 div ecx ; 字符串中某個字符除10,下面的代碼中沒有關商,只管了餘數 CODE:004053F6 mov eax, [ebp+long_str] CODE:004053F9 movzx eax, byte ptr [eax+ebx-1] ; eax取得長字符串中某個字符 CODE:004053FE xor edx, eax ; 使用餘數和長字符串中的字符進行異或操做 CODE:00405400 lea eax, [ebp+var_18] CODE:00405403 call sub_403E2C ; 這個函數將異或結果存放到var_18 CODE:00405408 mov edx, [ebp+var_18] CODE:0040540B lea eax, [ebp+var_10] CODE:0040540E call sub_403ED4 ; 這個函數將最終結果存放到局部變量var_10中 CODE:00405413 inc ebx CODE:00405414 dec esi CODE:00405415 jnz short loc_4053D1 ; 這是一個循環的開始,var_14應該是循環中使用的變量,esi做爲剩餘循環次數,ebx做爲當前長字串的遍歷位置(從0開始) CODE:00405417 CODE:00405417 loc_405417: ; CODE XREF: sub_405360+6A↑j CODE:00405417 mov eax, [ebp+return_val] CODE:0040541A mov edx, [ebp+var_10] CODE:0040541D call sub_403C98 ; 前面的循環中最後一個函數將值放入var_10,這裏就是將它做爲返回值,返回被解密的字符串
分析完了解密的字符串,回頭再看主函數中解密函數以後的就比較好理解了,解密處字符串,而後和原字符串進行一個比較,若是不正確則直接退出進程
sub_4082F8主要函數一
在ollydbg中,觀測每一個函數的輸出輸出值,就能大體理順整個函數的框架
這個函數的邏輯中,會檢查文件的末尾一個字符是否是'0',這個多是用來標記文件是否被感染的,後面再看,若是是,後面感染文件確定還會碰到。
而後剩下的功能就是複製本身到system目錄之下,改個名字,再次執行一下,這樣就達到了假裝成正常進程的目的。只有程序在system目錄下執行的時候纔會繼續往下執行,不然執行完這個函數就直接退出了。
將進程停在最後執行WinExec的步驟執行以前,查看這個進程的全部行爲
下面看代碼
CODE:00408300 push 0 CODE:00408302 push 0 ; 一次push是4字節 CODE:00408304 dec ecx ; 這裏至關於分配內存,依次分配8個字節 CODE:00408305 jnz short loc_408300 CODE:00408307 push ecx CODE:00408308 push ebx CODE:00408309 push esi CODE:0040830A push edi CODE:0040830B xor eax, eax CODE:0040830D push ebp CODE:0040830E push offset loc_4088DD CODE:00408313 push dword ptr fs:[eax] CODE:00408316 mov fs:[eax], esp CODE:00408319 lea edx, [ebp+path] CODE:0040831F xor eax, eax CODE:00408321 call get_path ; 參數1爲0,參數2爲局部變量var_3B8,返回值爲可執行文件絕對路徑的地址 CODE:00408326 mov eax, [ebp+path] CODE:0040832C lea edx, [ebp+path_no_exe] CODE:00408332 call sub_405684 ; 該函數執行完後,var_3B4存放路徑字符串的地址,和上面相比,沒有可執行文件的名字 CODE:00408337 lea eax, [ebp+path_no_exe] CODE:0040833D mov edx, offset aDesktopIni ; "Desktop_.ini" CODE:00408342 call sub_403ED4 ; 字符串追加,在路徑後面增長一個Desktop_.ini CODE:00408347 mov eax, [ebp+path_no_exe] CODE:0040834D call sub_4057A4 ; 這是判斷文件是否存在 CODE:00408352 test al, al ; 這裏返回了0 CODE:00408354 jz loc_4083E4 ; 跳轉 CODE:0040835A push 80h ; dwFileAttributes CODE:0040835F lea edx, [ebp+var_3C0] CODE:00408365 xor eax, eax CODE:00408367 call get_path CODE:0040836C mov eax, [ebp+var_3C0] CODE:00408372 lea edx, [ebp+var_3BC] CODE:00408378 call sub_405684 CODE:0040837D lea eax, [ebp+var_3BC] CODE:00408383 mov edx, offset aDesktopIni ; "Desktop_.ini" CODE:00408388 call sub_403ED4 CODE:0040838D mov eax, [ebp+var_3BC] CODE:00408393 call sub_4040CC CODE:00408398 push eax ; lpFileName CODE:00408399 call SetFileAttributesA CODE:0040839E push 1 ; dwMilliseconds CODE:004083A0 call Sleep CODE:004083A5 lea edx, [ebp+var_3C8] CODE:004083AB xor eax, eax CODE:004083AD call get_path CODE:004083B2 mov eax, [ebp+var_3C8] CODE:004083B8 lea edx, [ebp+var_3C4] CODE:004083BE call sub_405684 CODE:004083C3 lea eax, [ebp+var_3C4] CODE:004083C9 mov edx, offset aDesktopIni ; "Desktop_.ini" CODE:004083CE call sub_403ED4 CODE:004083D3 mov eax, [ebp+var_3C4] CODE:004083D9 call sub_4040CC CODE:004083DE push eax ; lpFileName CODE:004083DF call DeleteFileA CODE:004083E4 CODE:004083E4 loc_4083E4: ; CODE XREF: sub_4082F8+5C↑j CODE:004083E4 lea edx, [ebp+ab_path] ; 當前目錄不存在Desktop_.ini文件 CODE:004083EA xor eax, eax CODE:004083EC call get_path ; 而後又有一個局部變量指向了文件絕對路徑 CODE:004083F1 mov eax, [ebp+ab_path] CODE:004083F7 lea edx, [ebp+self_file] CODE:004083FA call sub_407760 ; 這裏好像是讀了整個本身的文件,很大的內存空間,還有頭文件的特殊標識 CODE:004083FF lea eax, [ebp+var_8] CODE:00408402 call sub_403C44 ; var_8的值好像也沒有改變 CODE:00408407 mov eax, [ebp+self_file] CODE:0040840A call str_length ; 字符串-4的位置存放的是字符串的位置,該函數返回該字符串的長度 CODE:0040840F mov ebx, eax ; 在以前的函數中,字符串前面4個字節存放的是字符串大小,這裏多是語言的特性,讀出的值爲f200,也是該內存值前面4字節的數值。 CODE:0040840F ; 這裏應該是返回文件大小,由於文件正好是61952字節 CODE:00408411 jmp short loc_408437 ; 文件長度不爲0 CODE:00408413 ; --------------------------------------------------------------------------- CODE:00408413 CODE:00408413 loc_408413: ; CODE XREF: sub_4082F8+14B↓j CODE:00408413 lea eax, [ebp+var_3D0] CODE:00408419 mov edx, [ebp+self_file] CODE:0040841C mov dl, [edx+ebx-1] CODE:00408420 call sub_403E2C CODE:00408425 mov edx, [ebp+var_3D0] CODE:0040842B lea eax, [ebp+var_8] CODE:0040842E mov ecx, [ebp+var_8] CODE:00408431 call sub_403F18 CODE:00408436 dec ebx CODE:00408437 CODE:00408437 loc_408437: ; CODE XREF: sub_4082F8+119↑j CODE:00408437 test ebx, ebx ; 文件長度不爲0 CODE:00408439 jle short loc_408445 ; 因此不跳轉 CODE:0040843B mov eax, [ebp+self_file] CODE:0040843E cmp byte ptr [eax+ebx-1], 0 ; 這裏比較文件的最後一個字節,看是否是0,病毒自身是爲0的,因此繼續往下走 CODE:00408443 jnz short loc_408413 CODE:00408445 CODE:00408445 loc_408445: ; CODE XREF: sub_4082F8+141↑j CODE:00408445 cmp [ebp+var_8], 0 ; 若是可執行文件的末尾一個字節不是0,則會修改這個局部變量,這裏直接往下走了 CODE:00408449 jnz loc_4085BA ; 若是是第二次啓動,那麼會跳轉到這裏執行 CODE:0040844F lea edx, [ebp+another_path] CODE:00408455 xor eax, eax CODE:00408457 call get_path ; 這個仍是一個獲取路徑的函數 CODE:0040845C mov eax, [ebp+another_path] CODE:00408462 lea edx, [ebp+up_path] CODE:00408468 call sub_40532C ; 將路徑轉化爲大寫字母 CODE:0040846D mov eax, [ebp+up_path] CODE:00408473 push eax CODE:00408474 lea eax, [ebp+system32_path] CODE:0040847A call sub_4054BC ; 獲取路徑"C:\WINDOWS\system32\" CODE:0040847F push [ebp+system32_path] CODE:00408485 push offset aDrivers ; "drivers\\" CODE:0040848A push offset aSpcolsvExe ; "spcolsv.exe" CODE:0040848F lea eax, [ebp+total_path] CODE:00408495 mov edx, 3 CODE:0040849A call sub_403F8C ; 將3個路徑拼接起來,造成字符串"C:\WINDOWS\system32\drivers\spcolsv.exe" CODE:0040849F mov eax, [ebp+total_path] CODE:004084A5 lea edx, [ebp+up_total_path] CODE:004084AB call sub_40532C ; 完整路徑轉換成大寫字母 CODE:004084B0 mov edx, [ebp+up_total_path] CODE:004084B6 pop eax ; eax指向當前文件的大寫路徑 CODE:004084B7 call sub_404018 ; 返回0xf,應該是字符串判斷 CODE:004084BC jz loc_4085BA ; 我將可執行文件放在了桌面,因此這裏是不跳轉 CODE:004084C2 mov eax, offset aSpcolsvExe ; "spcolsv.exe" CODE:004084C7 call sub_4060D4 ; 以這個進程名作了兩次相同的操做,這個函數應該也是沒有返回值的 CODE:004084CC mov eax, offset aSpcolsvExe ; "spcolsv.exe" CODE:004084D1 call sub_4060D4 CODE:004084D6 push 80h CODE:004084DB lea eax, [ebp+system32_path2] CODE:004084E1 call sub_4054BC ; 再一次獲取system路徑 CODE:004084E6 push [ebp+system32_path2] CODE:004084EC push offset aDrivers ; "drivers\\" CODE:004084F1 push offset aSpcolsvExe ; "spcolsv.exe" CODE:004084F6 lea eax, [ebp+total_path2] CODE:004084FC mov edx, 3 CODE:00408501 call sub_403F8C ; 和前面同樣的拼接函數 CODE:00408506 mov eax, [ebp+total_path2] CODE:0040850C call sub_4040CC ; 傳入路徑,沒有返回值 CODE:00408511 push eax ; lpFileName CODE:00408512 call SetFileAttributesA CODE:00408517 push 1 ; dwMilliseconds CODE:00408519 call Sleep CODE:0040851E push 0 CODE:00408520 lea eax, [ebp+system32_path3] CODE:00408526 call sub_4054BC ; 仍是獲取system32路徑 CODE:0040852B push [ebp+system32_path3] CODE:00408531 push offset aDrivers ; "drivers\\" CODE:00408536 push offset aSpcolsvExe ; "spcolsv.exe" CODE:0040853B lea eax, [ebp+var_3F0] CODE:00408541 mov edx, 3 CODE:00408546 call sub_403F8C ; 再次拼接 CODE:0040854B mov eax, [ebp+var_3F0] CODE:00408551 call sub_4040CC CODE:00408556 push eax ; lpNewFileName CODE:00408557 lea edx, [ebp+var_3F8] CODE:0040855D xor eax, eax CODE:0040855F call get_path CODE:00408564 mov eax, [ebp+var_3F8] CODE:0040856A call sub_4040CC CODE:0040856F push eax ; lpExistingFileName CODE:00408570 call CopyFileA ; 將自身文件複製到系統目錄下,假裝成drivers/spcolsv.exe CODE:00408575 push 1 CODE:00408577 lea eax, [ebp+var_400] CODE:0040857D call sub_4054BC ; 而後又獲取system路徑 CODE:00408582 push [ebp+var_400] CODE:00408588 push offset aDrivers ; "drivers\\" CODE:0040858D push offset aSpcolsvExe ; "spcolsv.exe" CODE:00408592 lea eax, [ebp+var_3FC] CODE:00408598 mov edx, 3 CODE:0040859D call sub_403F8C ; 再次拼接 CODE:004085A2 mov eax, [ebp+var_3FC] CODE:004085A8 call sub_4040CC CODE:004085AD push eax ; lpCmdLine CODE:004085AE call WinExec ; 這裏是執行system目錄下的可執行文件了,而後本身就退出了 CODE:004085B3 push 0 ; uExitCode CODE:004085B5 call ExitProcess_0 CODE:004085BA ; --------------------------------------------------------------------------- CODE:004085BA CODE:004085BA loc_4085BA: ; CODE XREF: sub_4082F8+151↑j CODE:004085BA ; sub_4082F8+1C4↑j CODE:004085BA mov eax, [ebp+var_8] ; 若是是第二次啓動,那麼會跳轉到這裏執行 CODE:004085BD call str_length ; 這裏應該返回0,由於仍是自身,var_8沒有改變,仍是0 CODE:004085C2 mov ecx, eax CODE:004085C4 lea eax, [ebp+self_file] CODE:004085C7 mov edx, ebx CODE:004085C9 call sub_40416C ; 參數1爲文件內容,參數二爲文件大小,參數3爲0 CODE:004085CE jmp loc_40889D ; 這裏須要跳轉 CODE:004085D3 ; --------------------------------------------------------------------------- CODE:004085D3 CODE:004085D3 loc_4085D3: ; CODE XREF: sub_4082F8+5B4↓j CODE:004085D3 lea eax, [ebp+var_14] CODE:004085D6 push eax CODE:004085D7 mov edx, [ebp+var_8] CODE:004085DA mov eax, offset dword_408934 CODE:004085DF call sub_4041B4 CODE:004085E4 mov ecx, eax CODE:004085E6 dec ecx CODE:004085E7 mov edx, 1 CODE:004085EC mov eax, [ebp+var_8] CODE:004085EF call sub_40412C CODE:004085F4 lea eax, [ebp+var_14] CODE:004085F7 mov ecx, 5 CODE:004085FC mov edx, 1 CODE:00408601 call sub_40416C CODE:00408606 lea eax, [ebp+var_C] CODE:00408609 push eax CODE:0040860A mov edx, [ebp+var_14] CODE:0040860D mov eax, offset dword_408940 CODE:00408612 call sub_4041B4 CODE:00408617 mov ecx, eax CODE:00408619 dec ecx CODE:0040861A mov edx, 1 CODE:0040861F mov eax, [ebp+var_14] CODE:00408622 call sub_40412C CODE:00408627 mov edx, [ebp+var_14] CODE:0040862A mov eax, offset dword_408940 CODE:0040862F call sub_4041B4 CODE:00408634 mov ecx, eax CODE:00408636 lea eax, [ebp+var_14] CODE:00408639 mov edx, 1 CODE:0040863E call sub_40416C CODE:00408643 mov eax, [ebp+var_14] CODE:00408646 call sub_405870 CODE:0040864B mov [ebp+var_18], eax CODE:0040864E xor eax, eax CODE:00408650 push ebp CODE:00408651 push offset loc_4086D6 CODE:00408656 push dword ptr fs:[eax] CODE:00408659 mov fs:[eax], esp CODE:0040865C mov edx, [ebp+var_C] CODE:0040865F lea eax, [ebp+var_1E4] CODE:00408665 call sub_402AD8 CODE:0040866A mov eax, ds:off_40E2BC CODE:0040866F mov byte ptr [eax], 2 CODE:00408672 lea eax, [ebp+var_1E4] CODE:00408678 call sub_402868 CODE:0040867D call sub_402614 CODE:00408682 lea eax, [ebp+var_404] CODE:00408688 push eax CODE:00408689 mov eax, [ebp+self_file] CODE:0040868C call str_length ; 字符串-4的位置存放的是字符串的位置,該函數返回該字符串的長度 CODE:00408691 mov edx, eax CODE:00408693 sub edx, [ebp+var_18] CODE:00408696 mov ecx, [ebp+var_18] CODE:00408699 mov eax, [ebp+self_file] CODE:0040869C call sub_40412C CODE:004086A1 mov edx, [ebp+var_404] CODE:004086A7 lea eax, [ebp+var_1E4] CODE:004086AD call sub_404260 CODE:004086B2 call sub_402B88 CODE:004086B7 call sub_402614 CODE:004086BC lea eax, [ebp+var_1E4] CODE:004086C2 call sub_402C48 CODE:004086C7 call sub_402614 CODE:004086CC xor eax, eax CODE:004086CE pop edx CODE:004086CF pop ecx CODE:004086D0 pop ecx CODE:004086D1 mov fs:[eax], edx CODE:004086D4 jmp short loc_4086E0 CODE:004086D6 ; --------------------------------------------------------------------------- CODE:004086D6 CODE:004086D6 loc_4086D6: ; DATA XREF: sub_4082F8+359↑o CODE:004086D6 jmp sub_403538 CODE:004086DB ; --------------------------------------------------------------------------- CODE:004086DB call sub_4036F0 CODE:004086E0 CODE:004086E0 loc_4086E0: ; CODE XREF: sub_4082F8+3DC↑j CODE:004086E0 call sub_407C74 CODE:004086E5 mov eax, offset aSpcolsvExe ; "spcolsv.exe" CODE:004086EA call sub_405568 CODE:004086EF test al, al CODE:004086F1 jnz loc_408896 CODE:004086F7 push 80h CODE:004086FC lea eax, [ebp+var_40C] CODE:00408702 call sub_4054BC CODE:00408707 push [ebp+var_40C] CODE:0040870D push offset aDrivers ; "drivers\\" CODE:00408712 push offset aSpcolsvExe ; "spcolsv.exe" CODE:00408717 lea eax, [ebp+var_408] CODE:0040871D mov edx, 3 CODE:00408722 call sub_403F8C CODE:00408727 mov eax, [ebp+var_408] CODE:0040872D call sub_4040CC CODE:00408732 push eax ; lpFileName CODE:00408733 call SetFileAttributesA CODE:00408738 push 1 ; dwMilliseconds CODE:0040873A call Sleep CODE:0040873F lea eax, [ebp+uCmdShow] CODE:00408745 call sub_4054BC CODE:0040874A push [ebp+uCmdShow] ; uCmdShow CODE:00408750 push offset aDrivers ; "drivers\\" CODE:00408755 push offset aSpcolsvExe ; "spcolsv.exe" CODE:0040875A lea eax, [ebp+var_410] CODE:00408760 mov edx, 3 CODE:00408765 call sub_403F8C CODE:0040876A mov eax, [ebp+var_410] CODE:00408770 call sub_4040CC CODE:00408775 push eax ; lpFileName CODE:00408776 call DeleteFileA CODE:0040877B mov eax, [ebp+self_file] CODE:0040877E call str_length ; 字符串-4的位置存放的是字符串的位置,該函數返回該字符串的長度 CODE:00408783 mov edx, eax CODE:00408785 sub edx, [ebp+var_18] CODE:00408788 lea eax, [ebp+self_file] CODE:0040878B mov ecx, [ebp+var_18] CODE:0040878E call sub_40416C CODE:00408793 mov eax, [ebp+self_file] CODE:00408796 call str_length ; 字符串-4的位置存放的是字符串的位置,該函數返回該字符串的長度 CODE:0040879B push eax CODE:0040879C mov eax, [ebp+self_file] CODE:0040879F call str_length ; 字符串-4的位置存放的是字符串的位置,該函數返回該字符串的長度 CODE:004087A4 mov edx, eax CODE:004087A6 lea eax, [ebp+self_file] CODE:004087A9 pop ecx CODE:004087AA call sub_40416C CODE:004087AF lea eax, [ebp+var_10] CODE:004087B2 mov edx, [ebp+self_file] CODE:004087B5 call sub_403CDC ; 這個函數中,若是字符串-8位置的值爲-1,則什麼都不會作,返回了 CODE:004087BA xor eax, eax CODE:004087BC push ebp CODE:004087BD push offset loc_40888C CODE:004087C2 push dword ptr fs:[eax] CODE:004087C5 mov fs:[eax], esp CODE:004087C8 lea eax, [ebp+var_41C] CODE:004087CE call sub_4054BC CODE:004087D3 push [ebp+var_41C] CODE:004087D9 push offset aDrivers ; "drivers\\" CODE:004087DE push offset aSpcolsvExe ; "spcolsv.exe" CODE:004087E3 lea eax, [ebp+var_418] CODE:004087E9 mov edx, 3 CODE:004087EE call sub_403F8C CODE:004087F3 mov edx, [ebp+var_418] CODE:004087F9 lea eax, [ebp+var_3B0] CODE:004087FF call sub_402AD8 CODE:00408804 mov eax, ds:off_40E2BC CODE:00408809 mov byte ptr [eax], 2 CODE:0040880C lea eax, [ebp+var_3B0] CODE:00408812 call sub_402868 CODE:00408817 call sub_402614 CODE:0040881C mov edx, [ebp+var_10] CODE:0040881F lea eax, [ebp+var_3B0] CODE:00408825 call sub_404260 CODE:0040882A call sub_402B88 CODE:0040882F call sub_402614 CODE:00408834 lea eax, [ebp+var_3B0] CODE:0040883A call sub_402C48 CODE:0040883F call sub_402614 CODE:00408844 push 1 CODE:00408846 lea eax, [ebp+var_424] CODE:0040884C call sub_4054BC CODE:00408851 push [ebp+var_424] CODE:00408857 push offset aDrivers ; "drivers\\" CODE:0040885C push offset aSpcolsvExe ; "spcolsv.exe" CODE:00408861 lea eax, [ebp+var_420] CODE:00408867 mov edx, 3 CODE:0040886C call sub_403F8C CODE:00408871 mov eax, [ebp+var_420] CODE:00408877 call sub_4040CC CODE:0040887C push eax ; lpCmdLine CODE:0040887D call WinExec CODE:00408882 xor eax, eax CODE:00408884 pop edx CODE:00408885 pop ecx CODE:00408886 pop ecx CODE:00408887 mov fs:[eax], edx CODE:0040888A jmp short loc_408896 CODE:0040888C ; --------------------------------------------------------------------------- CODE:0040888C CODE:0040888C loc_40888C: ; DATA XREF: sub_4082F8+4C5↑o CODE:0040888C jmp sub_403538 CODE:00408891 ; --------------------------------------------------------------------------- CODE:00408891 call sub_4036F0 CODE:00408896 CODE:00408896 loc_408896: ; CODE XREF: sub_4082F8+3F9↑j CODE:00408896 ; sub_4082F8+592↑j CODE:00408896 push 0 ; uExitCode CODE:00408898 call ExitProcess_0 CODE:0040889D ; --------------------------------------------------------------------------- CODE:0040889D CODE:0040889D loc_40889D: ; CODE XREF: sub_4082F8+2D6↑j CODE:0040889D mov edx, [ebp+var_8] CODE:004088A0 mov eax, offset dword_408934 ; 這裏的值爲1 CODE:004088A5 call sub_4041B4 CODE:004088AA test eax, eax CODE:004088AC jg loc_4085D3 ; 沒跳 CODE:004088B2 xor eax, eax CODE:004088B4 pop edx ; 這段清除了棧上的SEH,下面應該是退出代碼了,應該和程序邏輯沒有什麼關係 CODE:004088B5 pop ecx CODE:004088B6 pop ecx CODE:004088B7 mov fs:[eax], edx CODE:004088BA push offset loc_4088E4 CODE:004088BF
關鍵函數二
要執行到第二個關鍵函數,必須到system目錄下執行新建的spcolsv.exe了,由於原程序在第一個關鍵函數的末尾執行WinExec以後就退出了
這個函數有3個功能,分別對應着3中感染方式
首先看第一個
首先會遍歷全部的驅動器
遍歷驅動器下的目錄,過濾掉特殊目錄,而後新創建Desktop_.ini文件,而後還會刪除.GHO文件
在一個文件遍歷結束以後,會跳到40953f處,從新遍歷文件,當文件類型是文件的時候,則會跳到409DC3去進行文件感染,文件感染的類型也有不少,不一樣類型的感染方式也不同,這裏就不具體分析了。
而後是第二種感染,建立的是定時器
定時器代碼在目錄下生成了autorun.inf和setup.exe文件,用以自動執行,和以前的感染代碼同樣
第3個函數和網絡相關
sub_40BCC8應該就是實際運行的函數
關鍵函數三
關鍵函數3設置4個定時器
設置開機啓動,不能顯示隱藏文件的註冊表更改
後面的以後再分析吧
當第一個sub_403C98函數被調用完以後
而後OD看一下這函數執行完以後的值狀況,函數執行完以後沒有eax的操做,因此函數沒有返回值
看上述解密函數
開始代碼法分析,IDA的Options->String litera style能夠更改字符串解碼方式,能夠解析出edx是指向了字符串,而後調用了403C98,
CODE:0040D0F2 mov eax, offset dword_40F7D4 CODE:0040D0F7 mov edx, offset asc_40D1D8 ; "***武*漢*男*生*感*染*下*載*者***" CODE:0040D0FC call sub_403C98 ; 這個函數的參數有兩個 CODE:0040D0FC ; 一、eax CODE:0040D0FC ; 二、edx在調用處指向字符串
接着看403C98這個位置的函數,
CODE:00403C98 test edx, edx ;edx指向了字符串 CODE:00403C9A jz short loc_403CC0 ; 這裏應該是一個字符串爲空的檢查 CODE:00403C9C mov ecx, [edx-8] ;edx-8的位置值是-1 CODE:00403C9F inc ecx ;加1變爲0,zf標誌位置1 CODE:00403CA0 jg short loc_403CBC ;跳轉條件爲zf爲0,SF=AF,因此這裏不跳轉 CODE:00403CA2 push eax CODE:00403CA3 push edx CODE:00403CA4 mov eax, [edx-4] ;此時eax爲0x20h CODE:00403CA7 call sub_403D08 ; CODE:00403CAC mov edx, eax CODE:00403CAE pop eax CODE:00403CAF push edx CODE:00403CB0 mov ecx, [eax-4] CODE:00403CB3 call sub_402650 CODE:00403CB8 pop edx CODE:00403CB9 pop eax CODE:00403CBA jmp short loc_403CC0 ; 錯誤檢查代碼 CODE:00403CBC ; --------------------------------------------------------------------------- CODE:00403CBC CODE:00403CBC loc_403CBC: ; CODE XREF: sub_403C98+8↑j CODE:00403CBC lock inc dword ptr [edx-8] CODE:00403CC0 CODE:00403CC0 loc_403CC0: ; CODE XREF: sub_403C98+2↑j CODE:00403CC0 ; sub_403C98+22↑j CODE:00403CC0 xchg edx, [eax] ; 錯誤檢查代碼 CODE:00403CC2 test edx, edx CODE:00403CC4 jz short locret_403CDA CODE:00403CC6 mov ecx, [edx-8] CODE:00403CC9 dec ecx CODE:00403CCA jl short locret_403CDA CODE:00403CCC lock dec dword ptr [edx-8] CODE:00403CD0 jnz short locret_403CDA CODE:00403CD2 lea eax, [edx-8] CODE:00403CD5 call sub_402540 CODE:00403CDA CODE:00403CDA locret_403CDA: ; CODE XREF: sub_403C98+2C↑j CODE:00403CDA ; sub_403C98+32↑j ... CODE:00403CDA retn