首页
社区
课程
招聘
如何快速定位Delphi DLL中用户写的代码
发表于: 2008-8-5 16:56 16819

如何快速定位Delphi DLL中用户写的代码

2008-8-5 16:56
16819

标 题: 如何快速定位Delphi DLL中用户写的代码
作 者: Kangaroo
时 间: 2008-08-05
链 接:http://bbs.pediy.com/showthread.php?t=70057

目前大多数病毒都用Delphi写,并且是动态库的形式,由于Delphi库旁大,分析人员在进行病毒分析时候,无从下手,唯一的一个DLLEntry仅仅看到如下代码(都是Delphi库函数,汗颜):


那病毒的入口函数在哪里呢(我说的是病毒作者自己写的代码)?如何被调用呢?带着一层层疑惑我们把问题解开。

先给出Delphi函数调用层次
InitLib->StartLib->InitUnits

先看样就如下结构(给我感觉有点像COM):

typedef struct tagFunTable
{
    void (* Initialization1)(void);
    void (* Finalization1)(void);
    void (* Initialization2)(void);
    void (* Finalization2)(void);
    ...
    void (* InitializationN)(void);
    void (* FinalizationN)(void);
}FUNTABLE, *PFUNTABLE;  //初始化函数和结束化函数成对出现

typedef struct tagInitTable
{
    DWORD dwNum;  //初始化函数的个数(是初始化,结束化不包括在里面,也就是说只是FunTable元素个素的一半)
    PFUNTABLE pFunTable;
}INITTABLE, *PINITTABLE;

//DELPHI DLL的典型入口代码
push ebp
mov ebp,esp
add esp,-3C
mov eax,address  //address就是InitTable的首地址,等下供InitUnits函数调用FunTable中的每一个初始化函数
call InitLib  //InitLib是Delphi的一个库函数

下面给出了,InitUnits代码,注释里面说的很清楚了,你就知道InitUnits如果遍历FunTable表中的每一个函数,并调用。
CODE:004018A4                   InitUnits       proc near               ; CODE XREF: System::__linkproc__ StartLib(void)+BFp
CODE:004018A4 55                                push    ebp
CODE:004018A5 8B EC                             mov     ebp, esp
CODE:004018A7 53                                push    ebx
CODE:004018A8 56                                push    esi
CODE:004018A9 57                                push    edi
CODE:004018AA A1 FC 65 40 00                    mov     eax, ds:dword_4065FC ; 这个就是InitTable数地址了
CODE:004018AF 85 C0                             test    eax, eax
CODE:004018B1 74 4B                             jz      short loc_4018FE
CODE:004018B3 8B 30                             mov     esi, [eax]      ; 初始化函数个数
CODE:004018B5 33 DB                             xor     ebx, ebx        ; ebx是计数器
CODE:004018B7 8B 78 04                          mov     edi, [eax+4]    ; 指向FunTable
CODE:004018BA 33 D2                             xor     edx, edx
CODE:004018BC 55                                push    ebp             ; 结构化异常处理
CODE:004018BD 68 EA 18 40 00                    push    offset loc_4018EA
CODE:004018C2 64 FF 32                          push    dword ptr fs:[edx]
CODE:004018C5 64 89 22                          mov     fs:[edx], esp
CODE:004018C8 3B F3                             cmp     esi, ebx
CODE:004018CA 7E 14                             jle     short loc_4018E0
CODE:004018CC
CODE:004018CC                   loc_4018CC:                             ; CODE XREF: InitUnits+3Aj
CODE:004018CC 8B 04 DF                          mov     eax, [edi+ebx*8] ; 为什么是加八了,上面结构不是说了,初始化和结束化是成对出现的
CODE:004018CF 43                                inc     ebx             ; 加8就会指向下一个初始化函数
CODE:004018D0 89 1D 00 66 40 00                 mov     ds:dword_406600, ebx
CODE:004018D6 85 C0                             test    eax, eax
CODE:004018D8 74 02                             jz      short loc_4018DC ; 计数器和函数个数进行了比较,如果小远就继续循环
CODE:004018DA FF D0                             call    eax
CODE:004018DC
CODE:004018DC                   loc_4018DC:                             ; CODE XREF: InitUnits+34j
CODE:004018DC 3B F3                             cmp     esi, ebx        ; 计数器和函数个数进行了比较,如果小远就继续循环
CODE:004018DE 7F EC                             jg      short loc_4018CC ; 这个循环就是不断调用,FunTable中的每一个初始化函数
CODE:004018E0
CODE:004018E0                   loc_4018E0:                             ; CODE XREF: InitUnits+26j
CODE:004018E0 33 C0                             xor     eax, eax
CODE:004018E2 5A                                pop     edx
CODE:004018E3 59                                pop     ecx
CODE:004018E4 59                                pop     ecx
CODE:004018E5 64 89 10                          mov     fs:[eax], edx
CODE:004018E8 EB 14                             jmp     short loc_4018FE
CODE:004018EA                   ; ---------------------------------------------------------------------------
CODE:004018EA
CODE:004018EA                   loc_4018EA:                             ; DATA XREF: InitUnits+19o
CODE:004018EA E9 E5 FB FF FF                    jmp     @System@@HandleAnyException$qqrv ; System::__linkproc__ HandleAnyException(void)
CODE:004018EF                   ; ---------------------------------------------------------------------------
CODE:004018EF E8 50 FF FF FF                    call    FinalizeUnits_0
CODE:004018F4 E8 3F FD FF FF                    call    @System@@RaiseAgain$qqrv ; System::__linkproc__ RaiseAgain(void)
CODE:004018F9 E8 8E FD FF FF                    call    @System@@DoneExcept$qqrv ; System::__linkproc__ DoneExcept(void)
CODE:004018FE
CODE:004018FE                   loc_4018FE:                             ; CODE XREF: InitUnits+Dj
CODE:004018FE                                                           ; InitUnits+44j
CODE:004018FE 5F                                pop     edi
CODE:004018FF 5E                                pop     esi
CODE:00401900 5B                                pop     ebx
CODE:00401901 5D                                pop     ebp
CODE:00401902 C3                                retn
CODE:00401902                   InitUnits       endp
       
结束语:分析到这里,我们就知道,我们应该直接找FunTable中的函数,从而找到病毒作者写的代码处,进行快速分析。(FunTable地址在InitaTable中,InitTable地址,就是在调用InitLib函数时入口处的一条mov eax,address指令)


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
  • 1.JPG (35.00kb,961次下载)
  • 2.JPG (73.82kb,959次下载)
  • 3.jpg (27.69kb,950次下载)
收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 264
活跃值: (30)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
2
附上我的idb文件,方便大家查阅,由于是病毒所以动态库文件就不发放!!!
上传的附件:
2008-8-5 17:08
0
雪    币: 609
活跃值: (237)
能力值: ( LV12,RANK:441 )
在线值:
发帖
回帖
粉丝
3
第一个过来支持下……
2008-8-5 17:11
0
雪    币: 372
活跃值: (31)
能力值: ( LV12,RANK:410 )
在线值:
发帖
回帖
粉丝
4
板登支持~~
2008-8-5 18:28
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
5
学习~

2008-8-5 20:41
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这个要学习 THANKS
2008-8-5 21:11
0
雪    币: 1518
活跃值: (909)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
按纽这样找不是也行吗~
2008-8-6 03:10
0
雪    币: 112
活跃值: (16)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
8
好帖啊!必顶!不顶对不起观众!@
2008-8-6 12:54
0
雪    币: 561
活跃值: (124)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不错学习下!!!!
2008-8-6 13:03
0
雪    币: 98745
活跃值: (201039)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
10
support.
2008-8-6 13:07
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不错不错,一直没有关于delphi的分析教程,这篇好东西呵
2008-8-6 15:07
0
雪    币: 253
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
好东西 顶啊
2008-8-27 19:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不错。又长知识了。。。。
2008-8-28 00:15
0
雪    币: 197
活跃值: (52)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
14
呵呵,我照猫画虎,看了看delphi写的exe文件,发现初始化跟dll差不多,我看这个exe程序的FunTable有些大,有0x66个,用IDA看了一下,sub_4E67E4像这样的我想应该是自己写的了(有时候sig文件没加载全也可能是库函数),我想问的是像下面这样的带$qqrv的这些函数有可能包含自己写的代码吗?。。。
.text:004E55E0                 dd offset @Sockets@initialization$qqrv_0
.text:004E55E4                 dd offset sub_44B148
.text:004E55E8                 dd 0Eh dup(0)
.text:004E5620                 dd offset loc_4E63DC
.text:004E5624                 dd offset sub_44036C
.text:004E5628                 dd offset @Extctrls@initialization$qqrv
.text:004E562C                 dd offset sub_444960
.text:004E5630                 dd 6 dup(0)
.text:004E5648                 dd offset @Dialogs@initialization$qqrv
.text:004E564C                 dd offset sub_44A658
.text:004E5650                 dd offset @Clipbrd@initialization$qqrv
.text:004E5654                 dd offset unknown_libname_859 ; Borland Visual Component Library & Packages
.text:004E5658                 align 10h
.text:004E5660                 dd offset @Sitewiz@initialization$qqrv
.text:004E5664                 dd offset sub_479078
.text:004E5668                 align 10h
.text:004E5670                 dd offset @Jpeg@initialization$qqrv
.text:004E5674                 dd offset @Jpeg@Finalization$qqrv
.text:004E5678                 dd offset @Qbuttons@initialization$qqrv
.text:004E567C                 dd offset @Olectnrs@Finalization$qqrv

还有就是exe程序自己写的代码还可能在什么地方出现,有啥规律没?我没学过delphi,不熟悉这些库的调用,请知道的帮说下吧,谢谢了
2008-11-16 10:33
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
没看明白学习中
2008-12-24 15:21
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
正在逆向Delphi~~学习了
2010-1-23 16:34
0
游客
登录 | 注册 方可回帖
返回
//