inlineHook

来源:互联网 发布:淘宝多少访客刷一单 编辑:程序博客网 时间:2024/06/17 14:00
简单来说,就是修改函数体实现部分。
但是如何来修改,这样修改的意义又是什么?

我今天一直在寻找一个比较好的方式来说明白如何进行InlineHook,画了几次图,试了好几个工具,最后完成了一个流程,希望大家能看明白。

图片:



说明:

左上的图片
这个结构是我们在代码中写入的一个函数
代码如下:

[cpp] view plain copy print?
  1. __declspec(naked) NTSTATUS NtQueryDirectoryFileHookZone(,...)  
  2. {  
  3.     _asm  
  4.     {  
  5.         _emit 0x90  
  6.         _emit 0x90  
  7.         _emit 0x90  
  8.         _emit 0x90  
  9.         _emit 0x90  
  10.         _emit 0x90  
  11.         _emit 0x90  
  12.         _emit 0x90  
  13.         _emit 0x90  
  14.         _emit 0x90  
  15.         _emit 0x90  
  16.         _emit 0x90  
  17.         _emit 0x90  
  18.         _emit 0x90  
  19.         _emit 0x90  
  20.         _emit 0x90  
  21.         jmp [NtQueryDirectoryFileRet]  
  22.     }  
  23. }  

作用就是:用来保存被我们替换掉的原始函数的前五个字节,实现原始函数的功能。


左下的图片:
绿色部分是要被替换为jmp指令的5个字节,将它们拷贝到左上图片中。

中上的图片:
这是被修改完成的函数,最后的jmp指令,实现跳转回原函数继续执行。

中下的图片:
被修改完成的原始函数的样子,前5个字节被我们替换为了jmp。

右边的图片:
这是我们的Hook函数,在这里面我们设置好相应的参数,然后调用③,获取相应信息,
对信息进行修改,达到了Hook的目的,如用来隐藏文件。

流程:

调用NtQueryDirectoryFile---->jmp到我们自己的Hook函数---->设置参数,调用③--->调用①