【旧文章搬运】对抗RKU的StealthCode检测
原文发表于百度空间,2009-07-02
==========================================================================
快一个月没写东西了,随便写点~~
StealthCode检测似乎是RootkitUnhooker独有的功能,主要是检测那些无主的可执行代码片段。
比如一些放在Pool中的代码,或者驱动中的代码但驱动隐藏了使得RKU无法找到,就认为是StealthCode了。
RKU检测StealthCode的方法似乎是这样的(结合网上一些资料及自己的观察):
InlineHook以下StealthCode中常用的函数
ExAllocPool
ExAllocPoolWithTag
KeDelayExecutionThread
并将调用者的相关信息记录在案
在查找线程时会记录线程(内核线程)的StartAddress,如果StartAddress不在它能找到的模块中,那好,RKU就认为找到了一处StealthCode
对于以上三个函数的Hook,RKU都是5字节的HeadInline,所以可以直接jmp到FunAddr+5跳过它的Hook.比如这样:
//跳过RKU的InlineHook
__declspec( naked ) NTSTATUS
myKeDelayExecutionThread (
KPROCESSOR_MODE WaitMode,
BOOLEAN Alertable,
PLARGE_INTEGER Interval
)
{
_asm
{
push ebp
mov ebp,esp
mov eax,g_AddrKeDelayExecutionThread
add eax,
jmp eax
}
}
然后所有调用KeDelayExecutionThread的地方直接换成myKeDelayExecutionThread就OK了。跳过Hook之后,RKU自然是无法记录到的。
对于StartAddress检测法,也很容易欺骗,只要我们把线程的启动地址给DKOM掉就可以了。
lkd> dt _ETHREAD 821bb5a8
nt!_ETHREAD
....
+0x220 ThreadsProcess : 0x821bb830 _EPROCESS
+0x224 StartAddress : 0x80684528
就是这个东西,改成任意一个已知模块中的有效地址就可以了,比如ntoskrnl中某个函数的地址~~
或者另外一种方法,首先找一个已知模块中的有效地址,更改该处代码,使它跳到我们真正的线程地址处。然后PsCreateSystemThread时把线程的启动地址设为刚才找到的那个有效地址就可以了。启动线程之后,再把刚才改的代码还原回去,了无痕迹.
线程是我们的,但启动地址是别人的,这就叫"嫁祸他人",走自己的路,让别人背黑锅去吧~~(该方法在Ring3也可以用,VirtualAlloc一块内存,写入代码,把启动地址嫁祸到任意一个模块中(比如kernel32.dll中~~),如果有人想检测线程地址的话......)
比如,我改一下KeBugCheckEx(之所以选它,是因为只要系统还正常,就调用不到它)的入口代码,如下:

然后PsCreateSystemThread开启线程,来看一下线程信息:
启动地址是KeBugCheckEx,就是这个效果~~ RKU看到这个地址所在的模块是已知的,就自然不认为是StealthCode了,Over.
【旧文章搬运】对抗RKU的StealthCode检测的更多相关文章
- 【旧文章搬运】再谈隐藏进程中的DLL模块
原文发表于百度空间,2009-09-17========================================================================== 相当老的话 ...
- 【旧文章搬运】Windbg+Vmware驱动调试入门(四)---VirtualKD内核调试加速工具
原文发表于百度空间,2009-01-09========================================================================== 今天又想起 ...
- 【旧文章搬运】遍历EPROCESS中的ActiveProcessLinks枚举进程
原文发表于百度空间,2008-7-25========================================================================== 前面对PEB ...
- 【旧文章搬运】深入分析Win7的对象引用跟踪机制
原文发表于百度空间及看雪论坛,2010-09-12 看雪论坛地址:https://bbs.pediy.com/thread-120296.htm============================ ...
- 【旧文章搬运】分析了一下360安全卫士的HOOK(二)——架构与实现
原文发表于百度空间及看雪论坛,2009-10-14 看雪论坛地址:https://bbs.pediy.com/thread-99460.htm 刚发这篇文章的时候,因为内容涉及360的核心产品,文章被 ...
- 【旧文章搬运】Windows句柄分配算法(一)
原文发表于百度空间,2009-04-04========================================================================== 分析了Wi ...
- 【旧文章搬运】Windows句柄表分配算法分析(一)
原文发表于百度空间,2009-03-30========================================================================== 阅读提示: ...
- 【旧文章搬运】PspCidTable攻与防
原文发表于百度空间,2009-03-29========================================================================== PspCi ...
- 【旧文章搬运】更正一个枚举PspCidTable时的错误
原文发表于百度空间及看雪论坛,2009-02-27 看雪论坛地址:https://bbs.pediy.com/thread-82919.htm============================= ...
随机推荐
- 配置maven从私服上下载构件
maven 本地setting.xml配置 <!--配置maven从私服上下载构件 --> <profiles> <profile> <repositorie ...
- MySql 初始化权限脚本
刚装好MySql后无法用客户端工具连接,通过命令行登录后,运行下面的脚本: GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'y ...
- JS--截取字符串常用方法详细
使用 substring()或者slice() 函数:split() 功能:使用一个指定的分隔符把一个字符串分割存储到数组 例子: str=”jpg|bmp|gif|ico|png”; arr=the ...
- 碰撞检測之OBB-OBB的SweepTest
提要 当物体在运动的时候.普通的每帧进行碰撞检測已经无法满足要求,比方子弹的运动 两帧的位置已经直接将中间的板子穿过了,所以 t 时刻和 t +1 时刻的检測都是失效的.这时候须要用到的就是sweep ...
- 向C#的选项卡中添加自定义窗体
一.自定义窗体的搭建 这个比较简单,添加一个WinForm窗体就行了,设置一个名字EditPanel,然后在窗体上画需要的控件. 二.将自定义窗体添加到选项卡 // 新建窗体加入到选项卡中 EditP ...
- PHP将当前目录列出来
$d=dir("."); echo $d->path; while(false !== ($e = $d->read())) { echo "<a hr ...
- hive:Access denied for user 'root'@'%'
配置hive全分布模式时候,在mysql里面创建用户:create user 'hive' identified by 'hive'; 然后给hive帐号分配全部权限: grant all privi ...
- Ajax的简单实现(Json)
之前写的是一般的Ajax if (request.status === 200) { document.getElementById("createResult").innerHT ...
- LeetCode题解(13)--Roman to Integer
https://leetcode.com/problems/roman-to-integer/ 原题: Given a roman numeral, convert it to an integer. ...
- liberOJ #2033. 「SDOI2016」生成魔咒 后缀数组
#2033. 「SDOI2016」生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1 11.2 22 拼凑起来形成一个魔咒串 [1,2] [1, 2] ...