样本来源:
http://bbs.ikaka.com/showtopic-8506934.aspx分析工具:OllyDbg(看雪论坛修改版OllyICE),LordPE,ImportREC,PEID,IDA,均为看雪工具页面下载
一、脱壳
这个文件应该算是加了两层壳。
PEID查壳显示PECompact 2.x -> Jeremy Collake,这是外层壳。里面还有一层,因为存在里面这一层,可能导致脱壳机无法正确脱壳(包括瑞星的脱壳算法),因此最好用手工脱壳。
先脱外层PECompact壳。
OD载入,忽略所有异常:
00401000 > B8 90C04400
mov eax, 0044C090
00401005 50
push eax00401006 64:FF35 0000000>
push dword ptr fs:[0]
0040100D 64:8925 0000000>
mov dword ptr fs:[0],
esp00401014 33C0
xor eax,
eax00401016 8908
mov dword ptr [
eax],
ecx ; 访问dword ptr [00000000],引发异常一开始就是一个SEH结构,在0044C090处下断,F9运行,断下:
0044C090 B8 15AE44F0
mov eax, F044AE15
0044C095 8D88 9E120010
lea ecx,
dword ptr [
eax+1000129E]
; 0044C0B30044C09B 8941 01
mov dword ptr [
ecx+1],
eax0044C09E 8B5424 04
mov edx,
dword ptr [
esp+4]
0044C0A2 8B52 0C
mov edx,
dword ptr [
edx+C]
0044C0A5 C602 E9
mov byte ptr [
edx], 0E9
; 将导致异常的命令改为jmp 0044C0B30044C0A8 83C2 05
add edx, 5
0044C0AB 2BCA
sub ecx,
edx0044C0AD 894A FC
mov dword ptr [
edx-4],
ecx0044C0B0 33C0
xor eax,
eax0044C0B2 C3
retn修改了导致异常时的
EIP处的代码,这样返回后就执行这条指令,跳到0044C0B3
于是,取消0044C090处断点,在0044C0B3处下断,F9断下:
0044C0B3 B8 15AE44F0
mov eax, F044AE15
0044C0B8 64:8F05 0000000>
pop dword ptr fs:[0]
0044C0BF 83C4 04
add esp, 4
0044C0C2 55
push ebp0044C0C3 53
push ebx0044C0C4 51
push ecx0044C0C5 57
push edi0044C0C6 56
push esi0044C0C7 52
push edx0044C0C8 8D98 57120010
lea ebx,
dword ptr [
eax+10001257]
; 0044C06C0044C0CE 8B53 18
mov edx,
dword ptr [
ebx+18]
; 00400000,基址0044C0D1 52
push edx0044C0D2 8BE8
mov ebp,
eax0044C0D4 6A 40
push 40
0044C0D6 68 00100000
push 1000
0044C0DB FF73 04
push dword ptr [
ebx+4]
0044C0DE 6A 00
push 0
0044C0E0 8B4B 10
mov ecx,
dword ptr [
ebx+10]
0044C0E3 03CA
add ecx,
edx0044C0E5 8B01
mov eax,
dword ptr [
ecx]
0044C0E7 FFD0
call eax ; kernel32.VirtualAlloc0044C0E9 5A
pop edx取消断点,一直F8单步:
0044C12E FFD7
call edi ; 进入新申请的空间中的代码里,进行解密区块数据和填充IAT0044C130 8985 3F130010
mov dword ptr [
ebp+1000133F],
eax0044C136 8BF0
mov esi,
eax0044C138 8B4B 14
mov ecx,
dword ptr [
ebx+14]
0044C13B 5A
pop edx0044C13C EB 0C
jmp short 0044C14A
0044C13E 03CA
add ecx,
edx0044C140 68 00800000
push 8000
0044C145 6A 00
push 0
0044C147 57
push edi0044C148 FF11
call dword ptr [
ecx]
0044C14A 8BC6
mov eax,
esi0044C14C 5A
pop edx0044C14D 5E
pop esi0044C14E 5F
pop edi0044C14F 59
pop ecx0044C150 5B
pop ebx0044C151 5D
pop ebp0044C152 - FFE0
jmp eax ; 跳到0044A02C,外层壳结束在这里跳到0044A02C,PECompact的壳结束。这时看到的入口点代码:
0044A02C F8
clc0044A02D EB 05
jmp short 0044A034
0044A02F A2 ED4BA1C0
mov byte ptr [C0A14BED],
al0044A034 60
pushad0044A035 73 06
jnb short 0044A03D
0044A037 DD93 CE3A0FF1
fst qword ptr [
ebx+F10F3ACE]
0044A03D E8 04000000
call 0044A046
乱七八糟的,显然,还有一层壳。
这时可以选择先dump出来,然后再重新加载dump过的文件,再脱一层壳。
先dump出来的办法:
用LordPE完整转存1.exe的映像文件,再用ImportREC修复输入表。
但是这时用ImportREC无法自动识别原始输入表,必须手工填入输入表偏移(RVA填入00009000,Size填入330)
也可以不用dump出来,继续脱下去。
0044A02C F8
clc0044A02D EB 05
jmp short 0044A034
0044A02F A2 ED4BA1C0
mov byte ptr [C0A14BED],
al0044A034 60
pushad ; 这句之后,ESP突变0044A035 73 06
jnb short 0044A03D
一个
pushad之后,
ESP突变。于是可以尝试
ESP定律脱之。在此时
ESP值下硬件断点,之后F9运行,来到这里:
0044A0FA F8
clc0044A0FB 73 01
jnb short 0044A0FE
单步两下,到这里:
0044A0FE ^\E9 11E3FBFF
jmp 00408414
一个跨段的大跳到OEP:
00408414 55
push ebp00408415 8BEC
mov ebp,
esp00408417 6A FF
push -1
00408419 68 58994000
push 00409958
0040841E 68 9A854000
push 0040859A
; jmp 到 msvcrt._except_handler300408423 64:A1 00000000
mov eax,
dword ptr fs:[0]
00408429 50
push eax0040842A 64:8925 0000000>
mov dword ptr fs:[0],
esp00408431 83EC 68
sub esp, 68
00408434 53
push ebx00408435 56
push esi00408436 57
push edi00408437 8965 E8
mov dword ptr [
ebp-18],
esp0040843A 33DB
xor ebx,
ebx0040843C 895D FC
mov dword ptr [
ebp-4],
ebx0040843F 6A 02
push 2
00408441 FF15 3C924000
call dword ptr [40923C]
; msvcrt.__set_app_type00408447 59
pop ecx一个典型的VC写的程序
这里就可以用LordPE把文件dump出来了,这时ImportREC就可以用IATAutoSearch直接识别到原始IAT。
IATAutoSearch结果最后一项是错误的,指向00401000,显然不是API函数,IAT已经在前面结束了。所以直接把这一项错误的Delete掉。就可以正确修复dump文件。
脱壳和修复完成,打开瑞星监控,瑞星对脱壳后文件报毒:Backdoor.Win32.Ceckno.DL
而脱壳前的文件,瑞星不报毒。显然,就是因为这内层的“壳”,瑞星没有能正确脱壳,从而不能正确识别病毒。
二、脱壳后部分分析
这个具有木马后门性质的病毒文件,具体的行为比较罗嗦,我们只关心它对文件和注册表的修改,以及与外部通信的情况。
主要功能函数为:
.text:00407CA0
.text:00407CA0
; DWORD __stdcall sub_407CA0(LPVOID).text:00407CA0 sub_407CA0
proc near ; DATA XREF: sub_407FB0+4Do.text:00407CA0
push ebx.text:00407CA1
push ebp.text:00407CA2
push esi.text:00407CA3
push edi.text:00407CA4
mov ecx, 14h
.text:00407CA9
xor eax,
eax.text:00407CAB
mov edi,
offset dword_40CAF8
.text:00407CB0
push 0FFFFFFF7h
.text:00407CB2
push offset dword_40CAF8
.text:00407CB7
push offset dword_40B4FC
.text:00407CBC
rep stosd.text:00407CBE
call sub_407C40
.text:00407CBE
.text:00407CC3
add esp, 0Ch
.text:00407CC6
call FileAndRegChange
; 对文件和注册表的修改.text:00407CC6
.text:00407CCB
mov esi, CreateThread
.text:00407CD1
mov ebx, WaitForSingleObject
.text:00407CD7
mov ebp, Sleep
.text:00407CDD
mov edi, 1
.text:00407CDD
.text:00407CE2
.text:00407CE2 loc_407CE2:
; CODE XREF: sub_407CA0+6Aj.text:00407CE2
push 0
; lpThreadId.text:00407CE4
push 0
; dwCreationFlags.text:00407CE6
push 0
; lpParameter.text:00407CE8
push offset ThreadProc
; lpStartAddress.text:00407CED
push 0
; dwStackSize.text:00407CEF
push 0
; lpThreadAttributes.text:00407CF1
mov dword_40B62C,
edi.text:00407CF7
call esi ; CreateThread ; 创建一个线程,与病毒作者设定的服务器通信.text:00407CF9
cmp eax, 0FFFFFFFFh
.text:00407CFC
jz short loc_407D03
.text:00407CFC
.text:00407CFE
push 0FFFFFFFFh
; dwMilliseconds.text:00407D00
push eax ; hHandle.text:00407D01
call ebx ; WaitForSingleObject ; 等待线程退出.text:00407D01
.text:00407D03
.text:00407D03 loc_407D03:
; CODE XREF: sub_407CA0+5Cj.text:00407D03
push 0BB8h
; dwMilliseconds.text:00407D08
call ebp ; Sleep.text:00407D0A
jmp short loc_407CE2
; 每隔3秒重复一次.text:00407D0A
.text:00407D0A sub_407CA0
endp.text:00407D0A
FileAndRegChange:
GetModuelFileNameA得到自身文件名,GetSystemDirectoryA得到系统文件夹路径(%systemroot%\system32),比较自身文件夹路径是否是系统路径,即确定自身是否在系统路径下。
如自身不在系统路径下:
把自身文件拷贝到系统路径下(%systemroot%\system32\1.exe),WinExec运行之,并调用cmd.exe,通过传递命令行参数del,删除自身。自身退出。
如自身在系统路径下:
访问注册表
[HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\winlogon]
得到Userinit键的值
判断键值中是否包括自身文件名,如不包括,把键值后面加入自身文件名,然后写回。
ThreadProc:
连接
hjf29.3322.org,与之通信,传递的信息包括自身系统版本,
IP地址等信息。似乎还有扫描自身局域网拦截数据包的行为,没有细看。
其子函数创建N多个线程与远程服务器连接,按照得到的数据内容进行相应的操作,比如下载文件到本机运行。
因此这个文件看起来的确有木马后门性质的行为。
用户系统信息:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; MAXTHON 2.0)