首页
社区
课程
招聘
[原创]Dll 模块隐藏技术
发表于: 2010-11-6 15:30 60199

[原创]Dll 模块隐藏技术

2010-11-6 15:30
60199

Dll 模块隐藏技术


BY: tj08jx(fengxiaoxi)


;***********************************************************************
其实帖子都是这样看的少,细读的没几个,
如果你细细读完这篇文章,你会学到一下内容:
1.PEB,TEB,LDR_DATA_TABLE_ENTRY等数据结构
2.自己覆盖掉自己执行过的一段代码
3.调试这个Dll你会发现DLL_PROCESS_ATTACH中的代码在OD首次停下即加载停止时已经执行完了!
   多么美妙啊!哈哈,OD不会发现你执行了什么
4.本例最后附件有个 ASM 的控制台程序,用 SDK 编写,你可以学到用汇编写一个基本的控制台程序的格式
5.最后那个控制台源码还包含完整的CreateRemoteThread注入进程的写法
;**************************************************************************


本文主要讲的是怎样隐藏一个dll模块,这里说的隐藏是指,dll被加载后怎样使它 用一般的工具无法检测出来。


为什么要这么做呢?


1.远程线程中的应用


     (1)大家都知道,远程线程注入主要有两种一种是直接copy母体中预注入的代码到目标进程地址空间(WriteProcessMemory),


然后启动注入的代码(CreateRemoteThread),这种远程线程一旦成功实现,那么它只出现在目标进程的内存中,


并没有对应的磁盘文件,堪称进程隐藏中的高招,可是缺点就是,你必须要在注入代码中对所有直接寻址的指令进行修正,


这可是个力气活,用汇编写起来很烦。


     (2)另一种更为常用的方法是注入一个 dll 文件到目标进程,这种方法的实现可以是 以一个 消息Hook 为由进行注入,


或者仍然使用 CreateRemoteThread,这种方法的优点是 Dll 文件自带 重定位 表,也就是说你不必再为修正直接寻址


指令而烦恼了!,dll 自己会重定位!~~~嗯,真是不错的方法 --- 可是我们说它不如上面说的方法牛。为什么?


因为它的致命伤就是 可以用进程管理工具 看见被加载的 dll 文件名、文件路径。这真是太不爽了,因为只要用户看看模块列表


很容易发现可疑模块!,再依据名字,找到路径,定位文件 --- dll文件就这样暴露了.这样也就不是很完美的隐藏进程。


[现在不用怕啦~~ 本文将介绍的方法就是为了上述 不足而存在地~~~,让一般的工具看不到已加载的某个dll]


2.自身文件的需要


   这个说起来比较简单,比如我的一个程序运行了,我不想让用户知道我的EXE使用了某个dll,那么同样的也需要这种隐身技术.



3. 技术实现


  (1).


   说完了这么多,该说说,到底应该怎么实现了.


   熟悉SEH的肯定对 PEB 这个结构并不陌生-- PEB (Process Environment Block)进程环境信息块,这里储存着进程的重要信息


   主要原理就是这个结构,和它的成员相关结构


   首先我们回顾一下如何找到这个结构,常见的代码是这个:



    mov   eax,fs:[30h]                ;就这一句足矣,执行后 eax --> PEB (eax指向PEB结构,即eax中是PEB结构在进程空间中的地址)


  


   熟悉TEB和SEH中反调试知识的童鞋一定对上面这个很熟悉了~~不多说了--(不懂得童鞋去学习一下SEH的相关知识你就会认清 fs 了)


   下面看一下 PEB 结构的定义 :


;=================================================================


    PEB STRUCT                                                                ; sizeof = 1E8h


        InheritedAddressSpace                        BYTE                ?        ; 0000h


        ReadImageFileExecOptions                BYTE                ?        ; 0001h


        BeingDebugged                                BYTE                ?        ; 0002h


        SpareBool                                BYTE                ?        ; 0003h


        Mutant                                        PVOID                ?        ; 0004h


        ImageBaseAddress                        PVOID                ?        ; 0008h


       

Ldr                                        PVOID                ?       

; 000Ch PTR PEB_LDR_DATA


        ProcessParameters                        PVOID                ?        ; 0010h PTR RTL_USER_PROCESS_PARAMETERS


        SubSystemData                                PVOID                ?        ; 0014h


       


        ~~~~~~~~~~~~~~~~~                        ~~~~                ~~        ;PEB 结构以下部分省略


   PEB  ENDS


;==================================================================



由于PEB结构太庞大了,因此本文指截取了开头的一部分,因为我们主要使用的是它的 Ldr 成员,看见了吗? 对!,就是它在结构偏移 0Ch 处


后面已经指出了Ldr成员是一个指向 PEB_LDR_DATA 结构的指针,下面我们就得看看这个结构了:



;==================================================================


PEB_LDR_DATA STRUCT                                                        ; sizeof = 24h


        _Length                                        DWORD                ?        ; original name Length


        Initialized                                BYTE                ?        ; 04h


                                                db         3   dup(?)        ; padding


        SsHandle                                PVOID                ?        ; 08h


        InLoadOrderModuleList                        LIST_ENTRY        <>        ; 0Ch


        InMemoryOrderModuleList                        LIST_ENTRY        <>        ; 14h


        InInitializationOrderModuleList                LIST_ENTRY        <>        ; 1Ch


PEB_LDR_DATA ENDS


;==================================================================


啊哈~~~这里我们看到了想要的东西, Module 这个单词被我们发现了,ModuleList 就是模块 列表嘛~~~


InLoadOrderModuleList 就是按照模块加载顺序描述模块信息的,InMemoryOrderModuleList是按照内存中存储顺序描述,


InInitializationOrderModuleList是按照初始化dll模块的顺序描述的(你可以利用它们之一获得kernel32.dll的基址


这是许多无导入表程序的必做之事)



为了弄清Module信息究竟是怎么储存的,我们又必须知道LIST_ENTRY结构的定义


一个LIST_ENTRY结构描述了一个双链表


;======================================


LIST_ENTRY        STRUCT


        Flink        pLIST_ENTRY               


        Blink        pLIST_ENTRY


LIST_ENTRY        ENDS



pLIST_ENTRY typedef PTR LIST_ENTRY        ;pLIST_ENTRY 表示指向LIST_ENTRY结构的指针


;=====================================




根据图片我们可以看出LIST_ENTRY的用法,它嵌入在一个结构类型内,Flink指向下一个这种结构类型内的LIST_ENTRY


这样由表头,就可以找到所有的data struct结构了!


啊哈~~  MSDN 又说 InMemoryOrderModuleList 指向一个 LDR_DATA_TABLE_ENTRY 结构,也就是说,我们的图片的


data struct 1,2,3  就是指 LDR_DATA_TABLE_ENTRY 结构,再看看 它的 定义:(虽然结构有点绕,别晕啊~~快胜利了)


;===========================================================


LDR_DATA_TABLE_ENTRY STRUCT


        InLoadOrderLinks                        LIST_ENTRY         ;0h


        InMemoryOrderLinks;                        LIST_ENTRY         ;8h


          InInitializationOrderLinks;                LIST_ENTRY        ;10h


        DllBase;                                dword                ;18h                ;DllBase模块基址


        EntryPoint;                                dword                ;1Ch                ;模块入口点


        SizeOfImage;                                dword                ;20h                ;模块的内存映像大小


        FullDllName;                                UNICODE_STRING        ;24h               


        BaseDllName;                                UNICODE_STRING        ;2Ch               


        Flags;                                        dword                ;34h


[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

上传的附件:
收藏
免费 8
支持
分享
最新回复 (52)
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
写的 怎么没人来看呢~~~~
上传的附件:
2010-11-6 16:19
0
雪    币: 81
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
楼主我**。。
2010-11-6 17:19
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
lz忘记抹_LDR_DATA_TABLE_ENTRY中的HashLinks了...
2010-11-6 18:01
0
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
偶? 对这个 HashLink 成员不是很了解 ---

它指向什么呢 -- 、
2010-11-6 21:57
0
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6


这是什么意思呢???
2010-11-6 22:02
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
LZ抹自己信息的那段貌似可以直接改DLL实现,不需要在运行状态动态修改。
隐藏DLL还有一种方法就是把DLL直接FreeLibrary掉,呵呵。
呃,我不是在说笑话,我的意思是把DLL的内容复制下来,再把它FreeLibrary掉。
我在别人帖子里面发过,不过貌似没人看这个,可能大家都有自己觉得好用的方法吧。
http://bbs.pediy.com/showthread.php?t=59932&page=4的50L。
2010-11-7 01:21
0
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
嗯--直接抹掉真的可以呀~~~

那个 FreeLoadLibry 的我知道些 -
2010-11-7 01:51
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
HashLink跟LdrpHashTable有关,谷歌LdrpHashTable
2010-11-7 01:52
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
10
pe头抹掉才可以防止暴力搜索
2010-11-7 13:03
0
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
抹掉PE头 程序执行会出错的 ---

调用某些API的时候 ~~~

现在的这个 dll 就算搜索到了 我觉得也没事儿 --

因为 它还是不知道 我的 dll 的名字 ~~ 找不到 我的磁盘 文件 ~~~
2010-11-7 14:58
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
12
tag: HIDE DLL 隐藏 动态链接库
2010-11-7 15:08
0
雪    币: 306
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
楼主能共享下怎么把dll注入进去不被杀软发现的方法吗
2010-11-7 15:25
0
雪    币: 394
活跃值: (131)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
14
学习了,没看懂,标记下
2010-11-8 09:24
0
雪    币: 2558
活跃值: (4273)
能力值: ( LV13,RANK:540 )
在线值:
发帖
回帖
粉丝
15
汇编,I like it~~
2010-11-8 09:43
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
学习........
2010-11-9 21:18
0
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
白旗~
2010-11-9 23:30
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
我顶.....................

2010-11-10 00:06
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
19


隐藏dll模块过xuetr的路过。。。
2010-11-10 01:34
0
雪    币: 3284
活跃值: (3224)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
也做过类似的方法。。不过对于资源比较复杂的DLL不知道LZ的这个方法兼容好不。复杂点的似乎要先挂起全部线程才合适
2010-11-10 09:27
0
雪    币: 253
活跃值: (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
过不了 xuetr ,啥都能看见。。。。。
2010-11-21 01:10
0
雪    币: 217
活跃值: (3658)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
22
对文件proc函数还是不理解,,我用MSDN都查不到,网上都是Linux下说明,,咋整
2010-11-21 04:14
0
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
23
你是指 这个“DllEntry        proc        _hInstance,_dwReason,_dwReserved”
吗?

这是 dll 文件的 入口函数
2010-11-21 04:21
0
雪    币: 1140
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
暂时水平还不够,看不懂此文章,支持楼主,日后来学习!
2010-11-21 08:13
0
雪    币: 171
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
好像没隐藏成功 查的到
2010-11-22 03:45
0
游客
登录 | 注册 方可回帖
返回