MJ0011内核研究所——绕过现代AntiRookit工具的内核模块扫描.docVIP

MJ0011内核研究所——绕过现代AntiRookit工具的内核模块扫描.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MJ0011内核研究所——绕过现代AntiRookit工具的内核模块扫描

创建时间:2007-10-24 更新时间:2007-10-25 文章属性:原创 文章提交:MJ0011?(tyjaaa_at_163.com) 绕过现代Anti-Rookit工具的内核模块扫描 (Bypass modern anti-rootkit toolss 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); ????//cop

文档评论(0)

hello118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档