【旧文章搬运】再谈隐藏进程中的DLL模块
原文发表于百度空间,2009-09-17
==========================================================================
相当老的话题,大约一年前就写过这个东西了,不过那时候知识比较有限,也不了解内核,因此实现得很粗浅,现在再写一下,权当是对这个老问题的总结吧。
先谈谈正规DLL的隐藏方法,这里说的正规DLL,是指用LoadLibrary以正常方式加载的DLL。
一、从PEB的Ldr链中消失
这个很简单,看雪上NetRoc有一篇关于这个的文章,从分析原理到编程实现,虽然技术不算高深,但是思路非常精彩。来复习一下吧~~
lkd> dt _PEB 7ffdc000 //当前PEB的地址
nt!_PEB
...
+0x00c Ldr : 0x001a1e90 _PEB_LDR_DATA //这里指向Ldr结构
lkd> dt _PEB_LDR_DATA 0x001a1e90 //这个结构里有三个链表的表头
nt!_PEB_LDR_DATA
+0x000 Length : 0x28
+0x004 Initialized : 0x1 ''
+0x008 SsHandle : (null)
+0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x1a1ec0 - 0x1a34f8 ]
+0x014 InMemoryOrderModuleList : _LIST_ENTRY [ 0x1a1ec8 - 0x1a3500 ]
+0x01c InInitializationOrderModuleList : _LIST_ENTRY [ 0x1a1f28 - 0x1a3508 ]
+0x024 EntryInProgress : (null)
这里看到有三个链表,其实三个链表的内容是一样的,但是链表的顺序不一样,分别按加载顺序、内存顺序、初始化顺序排列
也就是说每一个DLL由一个LDR_DATA_TABLE_ENTRY结构描述,但是第一个结构被链入了三个链表。取一个来看看:
lkd> dt _LDR_DATA_TABLE_ENTRY 0x1a34f8
nt!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY [ 0x1a1e9c - 0x1a3450 ]
+0x008 InMemoryOrderLinks : _LIST_ENTRY [ 0x1a1ea4 - 0x1a3458 ]
+0x010 InInitializationOrderLinks : _LIST_ENTRY [ 0x1a1eac - 0x1a3460 ]
+0x018 DllBase : 0x20000000
+0x01c EntryPoint : (null)
+0x020 SizeOfImage : 0x549000
+0x024 FullDllName : _UNICODE_STRING "C:\WINDOWS\system32\xpsp2res.dll"
+0x02c BaseDllName : _UNICODE_STRING "xpsp2res.dll"
......//省略部分内容
随便取一个链表进行遍历,根据DllBase找到自己的DLL之后,从三个链中RemoveEntryList就可以了,这样所有使用PEB->Ldr结构来枚举DLL链表的就无法找到了。
由于大部分ARK对隐藏DLL的查找并不是很重视(比如RKU,Gmer,XueTr,Atool,NIAP),因此该方法就可以bypass很多ARK了,还是有一定市场的~
但对IceSword是个例外,下面就来说说如何bypass IceSword
二、从VAD树中消失
IceSword在枚举进程模块时使用的是ZwQueryVirtualMemory,查询的InfoClass是MemorySectionName(或者叫MemoryMappedFilenameInformation,值为2)。NtQueryVirtualMemory首先判断Vad->ControlArea->FilePointer是否有效,若有效则调用ObQueryNameString查询此文件对象的名称,最终由文件系统完成此次查询工作。
关于VAD的详细知识,可以参考《JIURL玩玩Win2k内存篇 VAD》,这里不作为重点,知道是平衡二叉树就可以了,树的根结点在EPROCESS中。
lkd> dt _EPROCESS 83f915b8
nt!_EPROCESS
...
+0x11c VadRoot : 0x84079c08
该成员是一个MMVAD类型的结构,而成员LeftChild和RightChild分别是该结点的左子结点和右子结点。
lkd> dt _MMVAD 0x84079c08
nt!_MMVAD
+0x000 StartingVpn : 0x8e0
+0x004 EndingVpn : 0x8e0
+0x008 Parent : (null)
+0x00c LeftChild : 0x843b1128 _MMVAD //左孩子
+0x010 RightChild : 0x840bf4a0 _MMVAD //右孩子
+0x014 u : __unnamed //标志位
+0x018 ControlArea : (null)
+0x01c FirstPrototypePte : (null)
+0x020 LastContiguousPte : (null)
+0x024 u2 : __unnamed
要对目标DLL实施隐藏时,先获取该DLL基址,然后遍历VAD树,根据MMVAD->StartingVpn做匹配(StartingVpn实际上是内存地址的高20位,比如0x7c800000在这里将只显示为0x7c800)找到目标DLL的VAD结构(这里以kernel32.dll为例,其加载地址正为0x7c800000):
lkd> dt _MMVAD 84174a18
nt!_MMVAD
+0x000 StartingVpn : 0x7c800
+0x004 EndingVpn : 0x7c91b
+0x008 Parent : 0x841223a0 _MMVAD
+0x00c LeftChild : 0x84120470 _MMVAD
+0x010 RightChild : 0x841a4790 _MMVAD
+0x014 u : __unnamed
+0x018 ControlArea : 0x876d0b88 _CONTROL_AREA //关键域
+0x01c FirstPrototypePte : 0xe177d6f0 _MMPTE
+0x020 LastContiguousPte : 0xfffffffc _MMPTE
+0x024 u2 : __unnamed
lkd> dt _CONTROL_AREA 0x876d0b88
nt!_CONTROL_AREA
...
+0x024 FilePointer : 0x876d0b10 _FILE_OBJECT外//目标在这里
好了,看到FILE_OBJECT了,这时你应该会想到系统是从这里取到的文件名吧,没错,这儿就是我们要动手脚的地方。根据小伟、Sysnap等人的测试,只要把ControlArea->FilePointer->FileName.Buffer填0就可以实现该DLL的隐藏(根据字符串的特性,实际上只需要把第一个字符填0就可以了),此时ZwQueryVirtualMemory将返回0xC0000039错误,即“指定的路径无效”,自然也就枚举不到了。而且对于那些共享的dll,如系统的ntdll.dll,kernel32.dll或在不同进程中被加载2次或以上的dll,虽然是在不同进程中,但是使用的是同一个共享的ControlArea结构,因此只需要改一个,那么在所有进程中都将实现隐藏,这对于隐藏全局钩子类型的dll显然是非常方便的。
IS是在ZwQueryVirtualMemory查完全无法枚举到DLL时才采用枚举PEB的方法,因此结合前面的Ldr断链法,足以搞定N多ARK了。
我所说的“从VAD树中消失”只是使该VAD的信息从IS的查询结果中消失,而并不是真的摘掉该VAD~~
值得一说的是,Sysnap的Yas Kit在检测隐藏DLL方面也是比较强的,但是对于动了VAD的,似乎也无能为力~
三、抹掉PE特征
有的工具可以直接枚举所有有效内存并检查PE标记来确定是否有隐藏DLL,因此需要把PE特征抹掉来对抗之,方法很简单,把PE头整个填零就可以了。
这种方法主要是作为前两种方法的补充,单独搞是没有意义的。
再来说说非正规方式加载的DLL,怎么个非正规呢?其实就是不用LoadLibrary,自已实现Loader的功能.
实现Loader功能之后,不管你是Load别的DLL,或者DLL自已Load自己(老V的ReloadAndRun同样适用于DLL),在Load完成后,不会出现在PEB->Ldr链中,它的VAD也不会与FILE_OBJECT发生任何关系,然后再抹掉PE特征,隐藏效果与上面的正规隐藏法相当,甚至要更隐蔽一些~~
再极端一点,DLL也可以完全不要,注入具有相同功能的shellcode然后开线程执行就可以了,只是shellcode写起来麻烦一点而已,写Loader也麻烦啊~~
总之只要能把我们的代码跑起来就OK,DLL隐藏就写到这儿~~
这次发代码出来,要代码请到这里
【旧文章搬运】再谈隐藏进程中的DLL模块的更多相关文章
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- 隐藏进程中的模块绕过IceSword的检测
标 题: [原创] 隐藏进程中的模块绕过IceSword的检测 作 者: xPLK 时 间: 2008-06-19,17:59:11 链 接: http://bbs.pediy.com/showthr ...
- C++ Primer 学习笔记_43_STL实践与分析(17)--再谈迭代器【中】
STL实践与分析 --再谈迭代器[中] 二.iostream迭代[续] 3.ostream_iterator对象和ostream_iterator对象的使用 能够使用ostream_iterator对 ...
- Electron结合React,在渲染进程中使用 node 模块
Electron结合React,在渲染进程中使用 node 模块 问题 将create-react-app与electron集成在了一个项目中.但是在React中无法使用electron.当在Reac ...
- 【旧文章搬运】遍历EPROCESS中的ActiveProcessLinks枚举进程
原文发表于百度空间,2008-7-25========================================================================== 前面对PEB ...
- 【旧文章搬运】关于在指定进程调用KeUserModeCallback的问题
原文发表于百度空间,2010-10-07========================================================================== 由于KeU ...
- 【旧文章搬运】为什么win32k.sys在System进程空间无法访问
原文发表于百度空间,2010-01-02========================================================================== 玩过Sha ...
- 再谈SQL Server中日志的的作用
简介 之前我已经写了一个关于SQL Server日志的简单系列文章.本篇文章会进一步挖掘日志背后的一些概念,原理以及作用.如果您没有看过我之前的文章,请参阅: 浅谈SQL Server ...
- 【旧文章搬运】PspCidTable攻与防
原文发表于百度空间,2009-03-29========================================================================== PspCi ...
随机推荐
- IntelliJ IDEA插件-常用插件
IntelliJ IDEA的插件真的很多,最近的新版集成的插件已经基本够用,下面是收集的一些常用插件,根据需要来安装和测试.如果还是没有找到,那么自己来开发一个. 官网:https://plugins ...
- Docker 的CMD与ENTRYPOINT区别
我们在构建一个docker镜像的时候,Dockerfile里面有两个命令会引起我们的注意,它们就是 CMD 和 ENTRYPOINT,看起来很相似,实际上并非如此. 一.CMD 顾名思义就是允许用户指 ...
- Service具体解释(一):什么是Service
< Service具体解释(一):什么是Service> < Service具体解释(二):Service生命周期> <Service具体解释(三):Service的使用 ...
- 使用RPi-Monitor监控、统计Guitar的运行状态
前言 之前发在ickey社区上的一系列文章: 犹抱琵琶半遮面,无人知是荔枝来--unboxing & interview 一.二.三 葡萄美酒夜光杯,巧妇难为无米炊--资料与社区 一支穿云箭, ...
- [poj 2331] Water pipe ID A*迭代加深搜索(dfs)
Water pipe Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 2265 Accepted: 602 Description ...
- html中<li></li>中使用<br>和<li></li>外面使用<br>
</pre><pre> <!DOCTYPE html> <html> <head> <meta http-equiv="Co ...
- 设计模式之命令模式(Command)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 【Android】Android聊天机器人实现
昨天看到一个Android视频教程讲图灵机器人.那个API接口用起来还是挺方便的,就准备自己动手做一个了. 另外自己还使用了高德地图的API接口用于定位(曾经用过高德的接口,比X度方便) 大体流程: ...
- 【健康生活】Google、百度之间的选择
没有什么技术性的分析,仅仅是个人吐槽而已. 一般人遇到问题就会说一句"百度一下",说实话,百度在中国推广的真的非常不错,可谓是家喻户晓,搜索个八卦新闻,小文章,小电影什么的的确非常 ...
- HDOJ--1869--六度分离(用三种算法写的,希望能比較出来他们之间的差别)
六度分离 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...