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

  • 25
  • 0
  • 约2.17万字
  • 约 34页
  • 2018-09-04 发布于江苏
  • 举报
自己动手,制inline hook扫描工具

HYPERLINK 雨伞( HYPERLINK )今天来跟大家一起讨论一下关于检测内核中inline hook IAT hook方面的知识如果喜欢请关注 HYPERLINK 广告伞 我们平时常用的工具中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_INF

文档评论(0)

1亿VIP精品文档

相关文档