Dll 模块隐藏技术
;***********************************************************************
其实帖子都是这样看的少,细读的没几个,
如果你细细读完这篇文章,你会学到一下内容:
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 |