InlineHook & 原理与实现(3)

作者 | 榴莲

编辑 | 楌橪

 

InlineHook又称为内联Hook,正常的API函数调用流程应该是由调用者(进程)通过函数名去调用已加载动态链接库中的导出函数。那么InlineHook的流程一般是在被调用API的头部,插入插入跳转指令的方式,劫持函数执行流程。
 
下图就是MessageBoxA的函数实现:

那么,我们可以在头部做出如下修改,进而实现HOOK:

上图中的12345678就代指的是我们自己的函数,通过这种方法劫持到我们的流程中执行。下面,我们采用MessageBoxA的Hook作为例子,实际体验一下InlineHook的实现方式。
我这里采用的操作系统是Windows 10 20H2(19042.1288),集成开发环境采用的是Visual Studio 2017。那么我们先来创建一个DLL项目。步骤如下:
1.选择新建项目

2:选择Windows桌面->动态链接库(DLL),点击确定

3:注释#include “pch.h”,添加#include 。删除framework.h、pch.h以及pch.cpp文件。

4:配置
4.1 选择属性

4.2 修改运行库以及Spectre缓解,选择应用

4.3 修改预编译头,选择应用

5.   在每一个分支中,添加break,防止DLL注入失败。

6.   声明三个变量,作用如图

7.   实现HOOK函数,代码如下

8.   实现HOOK卸载函数

9.   实现重新HOOK函数

10.  在MessageBoxA的函数名上F12,就可以看到函数原型
   

11.  然后赋值出来,修改函数名,实现自己的函数,用来劫持后执行

12.  在DLL_PROCESS_ATTACH添加变量的初始化,以及HOOK函数的调用。

13.  在DLL_PROCESS_DETACH中添加卸载HOOK函数

14. 生成文件

15.取出文件到桌面或其他位置

16.  测试HOOK效果
16.1 首先写一个目标程序,代码如下

16.2 使用注入器(自行编写或网上下载,这里我用的是自己写的)将我们生成的模块注入到目标进程中。
正常情况下:

HOOK后:

到了这里,我们就完成了整个InlineHook的代码编写。