自己动手,制作inline hook扫描工具.docVIP

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

雨伞( )今天来跟大家一起讨论一下关于检测内核中inline hook IAT hook方面的知识如果喜欢请关注广告伞 我们平时常用的工具中xuetr和kd都提供了这个功能,比较方便地可以让我们看出来是谁在我们的电脑中做了什么手脚 不过现在有很多软件或者游戏不希望我们看到它们做的种种坏事,纷纷封杀掉这些工具, 更有甚者检测到这类工具启动立马给我来个蓝脸或者重启 这也太霸道了,这到底成了谁的电脑了? 于是本着维护对于拥有无可争辩所有权的个人电脑的完全的信息知情权的目的,我山寨了一下检测内核inline / IAT hook功能 说完废话,开进主题 网上没有搜索到详细的检测方法,可能是大家觉得比较没啥技术含量没必要写出来吧 说白了其实真的挺简单,就是将内核中待检测的数据拷贝到RING3层,RING3层做一份原文件的副本镜像映射,然后做各种处理,最后比较一下 在讨论具体代码之前先用文字介绍一下我的检测流程,便于大家理解具体PE知识就不做科普了: 因为大部分实际执行代码在驱动中存在于.text和PAGE两个节区,所以我用RING3层指定,由驱动部分拷贝回这两个节区; 为了减少驱动中的处理,由RING3层计算出需要拷贝的起始终结地址范围包含对应的节区,这样驱动要做的仅仅是读取指定地址范围的数据; 本来上面这两步通过RING3层一个ZwQuerySystemInformation得到内核驱动的加载基址之后,就可以定位到要拷贝的节区的地址信息, 但是我是通过驱动层读取PsLoadedModuleList链来得到的模块信息,具体原因后面再解释 这样我们就得到了待检测的数据节区. 然后我们需要映射一份原驱动文件的映像,以作为对比的源. 因为已经加载的驱动已经被重定向过,所以我们映射的驱动镜像也需要重定向修复一下; 另外要做的一个修复就是对于输入表的处理,这里简单说下. 我们知道输入表结构中的OriginalFirstThunk和FirstThunk在文件未被装载映射时是指向导入的函数名称的或者序号, 而当它被装载完之后PE装载器会重写FirstThunk部分,将之改写为导入的函数的真实地址. 这样问题就出来了:如果输入表FirstThunk位于.text节区或者PAGE节区,我们就需要对它就行相应的处理,否则在进行比对时会出现错误.因为驱动中的输入表FirstThunk数据已经被改写而我们映射的文件的FirstThunk还是原始值 我是这样处理的,在检测inline hook之前首先检测IAT hook,检测完之后将驱动拷贝回的数据中的FirstThunk和我们映射的文件的FirstThunk部分都清空, 如果FirstThunk位于我们正在检测的节区当中的话 这样就不会对我们接下去的处理产生影响了. 所以接续上面的流程应当是重定向修复-IAT hook 检测-IAT修复-inline hook检测 下面我们具体看一下代码: 忘了说一点,因为考虑到检测内核hook及应用层hook,一些结构及函数是共用的,这里只介绍内核hook 代码: function CheckKernelInlineHook(parameter:Pointer):DWORD;stdcall; var hDevice : THandle; i : DWORD; pModuleListBuf : Pointer; dwBufSize : DWORD; dw : DWORD; tempStrStr : string; begin Result:=0; // 打开驱动层的设备对象 hDevice:=OpenDevice(DEVICE_SYMBOLIC_NAMR); if hDevice = 0 then Exit; i:=0; pModuleListBuf:=nil; // 获得模块信息列表 while True do begin dwBufSize:=(200 + i*5) * SizeOf(TLdrDataTableEntry); pModuleListBuf:=AllocMem(dwBufSize); if pModuleListBuf = nil then begin CloseHandle(hDevice); Exit; end; if not DeviceIoControl(hDevice, IOCTL_GET_MODULE_LIST_INFO, nil, 0, pModuleListBuf, dwBufSize,

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档