Dll 模块隐藏技术

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 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

db3dup(?);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结构的指针

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

50692

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

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

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

data struct1,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

相关文档
最新文档