12   1  /  2  页   跳转

关于1.exe

关于1.exe

样本来源: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    eax
00401006    64:FF35 0000000>push    dword ptr fs:[0]
0040100D    64:8925 0000000>mov    dword ptr fs:[0], esp
00401014    33C0            xor    eax, eax
00401016    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]                      ; 0044C0B3
0044C09B    8941 01        mov    dword ptr [ecx+1], eax
0044C09E    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 0044C0B3
0044C0A8    83C2 05        add    edx, 5
0044C0AB    2BCA            sub    ecx, edx
0044C0AD    894A FC        mov    dword ptr [edx-4], ecx
0044C0B0    33C0            xor    eax, eax
0044C0B2    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    ebp
0044C0C3    53              push    ebx
0044C0C4    51              push    ecx
0044C0C5    57              push    edi
0044C0C6    56              push    esi
0044C0C7    52              push    edx
0044C0C8    8D98 57120010  lea    ebx, dword ptr [eax+10001257]                      ; 0044C06C
0044C0CE    8B53 18        mov    edx, dword ptr [ebx+18]                            ; 00400000,基址
0044C0D1    52              push    edx
0044C0D2    8BE8            mov    ebp, eax
0044C0D4    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, edx
0044C0E5    8B01            mov    eax, dword ptr [ecx]
0044C0E7    FFD0            call    eax                                                ; kernel32.VirtualAlloc
0044C0E9    5A              pop    edx

取消断点,一直F8单步:

0044C12E    FFD7            call    edi                                                ; 进入新申请的空间中的代码里,进行解密区块数据和填充IAT
0044C130    8985 3F130010  mov    dword ptr [ebp+1000133F], eax
0044C136    8BF0            mov    esi, eax
0044C138    8B4B 14        mov    ecx, dword ptr [ebx+14]
0044C13B    5A              pop    edx
0044C13C    EB 0C          jmp    short 0044C14A
0044C13E    03CA            add    ecx, edx
0044C140    68 00800000    push    8000
0044C145    6A 00          push    0
0044C147    57              push    edi
0044C148    FF11            call    dword ptr [ecx]
0044C14A    8BC6            mov    eax, esi
0044C14C    5A              pop    edx
0044C14D    5E              pop    esi
0044C14E    5F              pop    edi
0044C14F    59              pop    ecx
0044C150    5B              pop    ebx
0044C151    5D              pop    ebp
0044C152  - FFE0            jmp    eax                                                ; 跳到0044A02C,外层壳结束

在这里跳到0044A02C,PECompact的壳结束。这时看到的入口点代码:

0044A02C    F8              clc
0044A02D    EB 05          jmp    short 0044A034
0044A02F    A2 ED4BA1C0    mov    byte ptr [C0A14BED], al
0044A034    60              pushad
0044A035    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              clc
0044A02D    EB 05          jmp    short 0044A034
0044A02F    A2 ED4BA1C0    mov    byte ptr [C0A14BED], al
0044A034    60              pushad                                                    ; 这句之后,ESP突变
0044A035    73 06          jnb    short 0044A03D

一个pushad之后,ESP突变。于是可以尝试ESP定律脱之。在此时ESP值下硬件断点,之后F9运行,来到这里:

0044A0FA    F8              clc
0044A0FB    73 01          jnb    short 0044A0FE

单步两下,到这里:

0044A0FE  ^\E9 11E3FBFF    jmp    00408414

一个跨段的大跳到OEP:

00408414    55              push    ebp
00408415    8BEC            mov    ebp, esp
00408417    6A FF          push    -1
00408419    68 58994000    push    00409958
0040841E    68 9A854000    push    0040859A                                          ; jmp 到 msvcrt._except_handler3
00408423    64:A1 00000000  mov    eax, dword ptr fs:[0]
00408429    50              push    eax
0040842A    64:8925 0000000>mov    dword ptr fs:[0], esp
00408431    83EC 68        sub    esp, 68
00408434    53              push    ebx
00408435    56              push    esi
00408436    57              push    edi
00408437    8965 E8        mov    dword ptr [ebp-18], esp
0040843A    33DB            xor    ebx, ebx
0040843C    895D FC        mov    dword ptr [ebp-4], ebx
0040843F    6A 02          push    2
00408441    FF15 3C924000  call    dword ptr [40923C]                                ; msvcrt.__set_app_type
00408447    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)

附件附件:

您所在的用户组无法下载或查看附件

本帖被评分 1 次
最后编辑轩辕小聪 最后编辑于 2008-05-22 21:03:52
病毒样本请发到可疑文件交流区
分享到:
gototop
 

回复:关于1.exe

不错,辛苦了,不过不懂编程的朋友可能不太看得懂
堕入黑暗里的可怜影子啊!诋毁伤害他人!
充满罪恶的灵魂!想死一次吗?
gototop
 

回复:关于1.exe

看不懂,看来我真的很菜...继续努力学习
gototop
 

回复:关于1.exe

.全是字母,就看懂这些~~~~~
gototop
 

回复:关于1.exe

确实看不懂  编程的 内容。。。。。
gototop
 

回复:关于1.exe

看不懂是什么
gototop
 

回复:关于1.exe

楼主的文件,瑞星直接杀了。
觉得我回答的好,就给我评分吧!
gototop
 

回复:关于1.exe

不用管
只关心查杀办法
这个主要的
gototop
 

回复:关于1.exe

看不懂
gototop
 

回复:关于1.exe

被CAHIPS弄死了



 附件: 您所在的用户组无法下载或查看附件
gototop
 
12   1  /  2  页   跳转
页面顶部
Powered by Discuz!NT