首页
社区
课程
招聘
[原创]Hook技术:Ring3层下的Inline Hook详解【附源码】
发表于: 2020-5-2 22:53 14437

[原创]Hook技术:Ring3层下的Inline Hook详解【附源码】

2020-5-2 22:53
14437

Ring3层下的Inline Hook是最常用的Hook手段之一,是一种通过修改机器码的方式来实现hook的技术。


我们知道正常函数的执行流程是call 0xxxxxxxx,然后跳转到调用的函数去执行。

0x1000地址的call指令执行后跳转到0x3000地址处执行,执行完毕后再返回执行call指令的下一条指令。

我们以MessageBox为例

正常调用如下:

首先是call MessageBox

可以看到MessageBox的地址为77101370

跳转到Message的程序开头。

我们在hook的时候,可能会读取或者修改call指令执行之前所压入栈的内容。

那么,我们可以将call指令替换成jmp指令,jmp到我们自己编写的函数,在函数里call原来的函数,函数结束后再jmp回到原先call指令的下一条指令。如图:

实现思路比较简单,主要思想:

1、构造跳转指令。

2、在内存中找到欲HOOK函数地址,并保存欲HOOK位置处的前5个字节。(但其实并不一定就是5个字节,像是MessageBox就是6个字节)

3、将构造的跳转指令写入需HOOK的位置处。

4、当被HOOK位置被执行时会转到我们的流程执行。

5、如果要执行原来的流程,那么恢复HOOK,也就是还原被修改的字节。

6、执行函数原来的流程。



在这过程中,主要涉及到几个问题:

1、如何定位自己要hook的地址?

2、如何处理函数开头要替换的字节?

3、如何跳转以及跳转地址如何计算?

4、自己的函数执行完成后,如何跳转回来?


那么带着这几个问题,我们开始尝试实现Inline hook。

我们还是以MessageBox为例子,来探究一下上面的问题。


这里我们使用近距离地址跳转的jmp指令,它的机器码为E9,这种类型的jmp指令需要一个地址参数,为当前jmp指令地址距离目标函数地址的字节数。

一、正常的跳转计算公式如下所示”:

计算公式:jmp跳转的地址=自己实现的函数地址-(jmp所在的地址+5) (这里的5是 jmp xxxxxxxx的五个字节。)

也就是:

、mov eax xxxxxxxx;

jmp eax



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-5-5 09:24 被大碗宽面编辑 ,原因: 图片挂了
上传的附件:
收藏
免费 6
支持
分享
最新回复 (36)
雪    币: 14653
活跃值: (17749)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
2
mark,图挂了。。。
2020-5-3 03:02
0
雪    币: 378
活跃值: (159)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
老哥 很遗憾 一个图也看不到-.- .......  
2020-5-3 06:35
0
雪    币: 3496
活跃值: (749)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错,顶顶
2020-5-3 08:15
0
雪    币: 12520
活跃值: (5263)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5

提示附件是空的哟
2020-5-3 09:47
0
雪    币: 181
活跃值: (636)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
LONG __cdecl InterlockedExchange(
  __inout  LONG volatile* Target,
  __in     LONG Value
);
2020-5-3 09:50
0
雪    币: 73
活跃值: (923)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
最近这种文章很多呀
2020-5-3 15:00
0
雪    币: 259
活跃值: (283)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
图片挂了
2020-5-3 16:41
0
雪    币: 1861
活跃值: (1173)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不知道图片为什么老挂,上传好几次了
2020-5-3 22:00
0
雪    币: 1861
活跃值: (1173)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
图片已经搞定
2020-5-4 13:24
0
雪    币: 29182
活跃值: (63621)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
11
Qz王大碗 图片已经搞定
还有几张图片挂了。
2020-5-4 19:41
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
牛,看看学习
2020-5-4 22:04
0
雪    币: 2677
活跃值: (5410)
能力值: ( LV10,RANK:177 )
在线值:
发帖
回帖
粉丝
13
师傅,在messageBox里修改开头的7个字节,之后跳转到自己定义的函数,执行完成后,再回到原来的执行流程,是不是要在自定义函数结束时,再把之前修改的指令还原,再跳转过去原来的的7个字节
2020-5-5 10:44
0
雪    币: 1861
活跃值: (1173)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
YenKoc 师傅,在messageBox里修改开头的7个字节,之后跳转到自己定义的函数,执行完成后,再回到原来的执行流程,是不是要在自定义函数结束时,再把之前修改的指令还原,再跳转过去原来的的7个字节
对的,要不然原函数开头的7个字节还是跳转指令。
//恢复API头7个字节
    WriteProcessMemory(INVALID_HANDLE_VALUE, (void*)__MessageBoxAddress,
        (void*)__OldCode, 7, NULL);
 
2020-5-5 10:49
0
雪    币: 2677
活跃值: (5410)
能力值: ( LV10,RANK:177 )
在线值:
发帖
回帖
粉丝
15
秒啊,好厉害,全是硬编码来改,那些api都没见过,是靠硬背吗,2333
2020-5-5 11:05
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
很厉害,学习中
2020-5-5 21:41
0
雪    币: 210
活跃值: (1847)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
其实inline hook 函数头这是一个老生常谈的问题了,但是存在一种情况,假定Safengine这种shell会去偷函数前五个字节或者函数前一段代码在jmp回去这就有问题了,因为你在api上挂钩根本就不走,那题主有没有想设计过一个任意地址hook呢
2020-5-6 15:53
0
雪    币: 174
活跃值: (181)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
可以的,后面你会遇到 什么是热HOOK 为什么会有这种HOOK .为什么x86 使用JMP改跳转方式来进行HOOK. 原子交换HOOK,保证线程同步. HOOK简单,但是主义的问题很多. 多线程问题,HOOK位置的指令长度. 如何写通用的HOOK.  x64下的inlineHOOK.  x64下的HOOK 可否适用于x86  HOOK的原理是啥(让EIP跳走, push + ret, jmp rip方式 mov rax/eax,jmp rax 都可以)
2020-5-6 16:53
0
雪    币: 1861
活跃值: (1173)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
IBinary 可以的,后面你会遇到 什么是热HOOK 为什么会有这种HOOK .为什么x86 使用JMP改跳转方式来进行HOOK. 原子交换HOOK,保证线程同步. HOOK简单,但是主义的问题很多. 多线程问题, ...
谢谢大佬指点,之后会对这些内容进行研究学的
2020-5-6 20:37
0
雪    币: 2694
活跃值: (3805)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
20
好像有两张是我画的图
2020-5-7 16:05
0
雪    币: 1861
活跃值: (1173)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
p1和p7是我借鉴的,看到的时候觉得很好,大佬不好意思,没有备注出处
2020-5-7 16:58
0
雪    币: 1861
活跃值: (1173)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
落叶似秋 [em_39]好像有两张是我画的图
p1和p7看到的时候觉得画的很好,大佬不好意思,没有备注出处,现备注出处:https://www.cnblogs.com/luoyesiqiu/p/12306336.html
2020-5-7 17:02
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
23
顶顶顶顶顶顶!!!!!!
2020-5-7 17:05
0
雪    币: 789
活跃值: (577)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
Bw
24
大佬 强啊     !!!!!!!!!!!!!
2020-5-7 17:06
0
雪    币: 2694
活跃值: (3805)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
25
Qz王大碗 p1和p7看到的时候觉得画的很好,大佬不好意思,没有备注出处[em_85],现备注出处:https://www.cnblogs.com/luoyesiqiu/p/12306336.html
看到用自己画的图还挺开心的
2020-5-7 18:02
0
游客
登录 | 注册 方可回帖
返回
//