SSDT HOOK拦截远线程创建.docVIP

  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文档。上传文档
查看更多
【原创】SSDT HOOK拦截远线程的创建(上)/logshtml 2009-04-12 分类:内核编程 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 /logshtml ????? 注:本文已发表在2009年第3期《黑客防线》,转载请注明来源。 ????? 在ring3的API HOOK中,怎样迫使目标进程调用我们的傀儡DLL是我们非常重视的一个问题。在多数情况下,我们都喜欢使用CreateRemoteThread在目标进程中创建一个远程线程来迫使它加载我们的DLL。 ?因为CreateRemoteThread的使用方法并不复杂,而且与其他方式相比,它可以称得上是一种相当“优雅”的做法。各种因素的汇集就导致了这种方法的泛滥,致使很多具备主动防御或行为监控的安全软件都加强了对这个函数的照顾。 ???? ?最近在自己的毕业设计中也要用到这个功能,阻止一些简单地调用CreateRemoteThread注入到我们要保护的进程中,就对这个问题稍微学习了下。 ???? ?根据我们的思维惯性,很显然我们应该HOOK CreateRemoteProcess函数,这在ring3下非常容易实现,但是如果这样的话我们的保护也太没有强度可言了。正好最近正在学习SSDT HOOK,就使用这个方法吧,算是在实战中磨炼自己,吼吼~~ 第一部分:SSDT HOOK的使用方法 ????? 关于什么是SSDT等基本概念我就不再赘述了,网上有很多文章,而且黑防以前的杂志上也有不少详细介绍,这里我推荐一篇李马的《城里城外看SSDT》,确实不错。我一开始是修改《Rootkits——Windows内核的安全防护》关于SSDT的示例代码,它给出了一个挂钩ZwQuerySystemInformation来隐藏进程的示例。 ???? ?很不幸的是,当我照本宣科地把ZwQuerySystemInformation修改成ZwCreateThread(第二部分会介绍,这里只要知道CreateRemoteThread是最终调用ZwCreateThread)后,编译器报错:“error LNK2019: unresolved external symbol __imp__ZwCreateThread@32 referenced in function _DriverEntry@8”。这个错误令我诧异了很久,在尝试解决问题的过程中,偶然发现了出现问题的原因,原来ZwCreateThread函数没有被ntoskrnl.exe导出(使用depends看看就知道了)。 ????? 与之同时,我们在函数中用到了几个宏,它们的详细定义如下: #define SYSTEMSERVICE(_Function) \ ???? KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_Function+1)] #define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1) #define HOOK_SYSCALL(_Function, _Hook, _Orig ) \ ????????? _Orig = (PVOID) InterlockedExchange( (PLONG) MappedSystemCallTable\ ????????? [SYSCALL_INDEX(_Function)], (LONG) _Hook) #define UNHOOK_SYSCALL(_Function, _Hook, _Orig)? InterlockedExchange((PLONG)\ ???????? MappedSystemCallTable[SYSCALL_INDEX(_Function)], (LONG) _Hook) ???? ?而SYSTEMSERVICE宏是采用由ntoskrnl.exe导出的Zw*函数地址,并返回对应的Nt*函数在SSDT中的地址,SYSCALL_INDEX采用Zw*函数地址并返回它在SSDT中相应的索引号。 ???? ?由于ZwCreateThread没有被ntoskrnl.exe导出,所以这时我们就无法直接使用上述的宏,只能另想他法。 ????? 这时候最常规的方法就是从ntdll中动态获取地址,不过我不想那么麻烦。昨天在群里问了下,iceboy大牛给出了一种猥琐的方法,因为ZwCreateThread在SSDT中的前后两个函数都被导出了,分别是ZwCreateSymbolicLinkObject和ZwCreateTimer。 ????? 这时候我们就可以分别获取这两个函数的索引

文档评论(0)

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

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

1亿VIP精品文档

相关文档