首页
社区
课程
招聘
[原创]基于页面异常的Hook:原理与实现
发表于: 2022-6-5 09:36 12267

[原创]基于页面异常的Hook:原理与实现

2022-6-5 09:36
12267

基于异常的Hook

基于异常的hook自然也有许多方法,如DR Hook(基于调试寄存器),int3 Hook等,只要了解异常机制,很容易就能联想到这些。

  • 本篇文章中,各类Hook的学名是我个人所取,因为已有的学名我感觉不是很合适,什么硬件hook啥的,你们叫什么都可以,只要了解在本文中它们是什么意思即可

DR Hook

通过修改进程中所有线程的DR寄存器,实现Hook

  • 缺陷
    • 存在数量限制,处理较繁琐(需要接管创建线程才能使新线程也受影响)

int3 Hook

通过在被Hook处修改指令为int3,实现Hook

  • 缺陷
    • 会破坏原有指令

Page Hook

比起上述提起的异常hook,Page Hook更为隐蔽,缺陷更少

原理

修改指令处所属页面的属性为可读可写(不可执行)
使得此页面被执行时发生异常,接管此异常即可。

编写代码需注意的一些细节

  • 修改页属性,会使得整个页内的任意指令被执行时都会发生异常,需要做一下处理。

实现

  • 实际写出一个通用的框架也有些繁琐,不过我这里已经写好了一份,可以直接使用
  • https://github.com/yuyuaqwq/YPage-Hook

    使用注意事项

    • vs会接管页异常,断下时可直接放行
    • 不知道如何使用,参考下图

应用:不修改任何指令实现爆破

图片描述

结尾

  • 仅供学习交流使用,请勿用于非法用途!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2022-12-20 19:41 被yuyuaqwq编辑 ,原因: 完善框架,修复已知的一些问题
收藏
免费 3
支持
分享
最新回复 (32)
雪    币: 6300
活跃值: (3832)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
能用在64位进程里面吗?
2022-6-5 11:02
0
雪    币: 263
活跃值: (1979)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
大鲤鱼 能用在64位进程里面吗?
可以的
2022-6-5 11:51
0
雪    币: 14728
活跃值: (4020)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主把demo程序也传上来呀
2022-6-5 13:02
0
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
5
缺陷主要是过于影响性能,并且怕查页面属性
2022-6-5 13:54
0
雪    币: 263
活跃值: (1979)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
email123 楼主把demo程序也传上来呀[em_67]
可以参考一下我的截图来使用,挺简单的,就两个接口
2022-6-5 16:10
0
雪    币: 263
活跃值: (1979)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7

...没引用到

最后于 2022-6-5 16:13 被yuyuaqwq编辑 ,原因:
2022-6-5 16:12
0
雪    币: 263
活跃值: (1979)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
はつゆき 缺陷主要是过于影响性能,并且怕查页面属性
是的,性能确实有些影响
2022-6-5 16:14
0
雪    币: 14728
活跃值: (4020)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9


我怎么执行不下去呢

2022-6-5 21:09
0
雪    币: 405
活跃值: (2126)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
10
局限性有点大,如果同一个页面存在多个hook点,或者你的函数要调用原先hook的位置,直接傻了
2022-6-5 21:24
0
雪    币: 263
活跃值: (1979)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
email123 我怎么执行不下去呢
不要在vs中调试,vs会接管页异常,用release编译出来测试
2022-6-6 00:22
0
雪    币: 263
活跃值: (1979)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
劫局丶 局限性有点大,如果同一个页面存在多个hook点,或者你的函数要调用原先hook的位置,直接傻了
同一个页面的多个hook点是可以处理的,我写的时候是有思路的,不过偷了个懒。

调用原先hook的位置会出问题,这个我不是太明白你的意思,线程执行到这里的时候走异常,调用回调,然后恢复执行,并没有什么问题吧
2022-6-6 00:25
0
雪    币: 263
活跃值: (1979)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
email123 我怎么执行不下去呢
另外不要删掉代码段的预处理,不然就可能将异常处理例程这些东西和被hook的函数链接到同一个页面
2022-6-6 00:28
0
雪    币: 263
活跃值: (1979)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
劫局丶 局限性有点大,如果同一个页面存在多个hook点,或者你的函数要调用原先hook的位置,直接傻了
我大概明白你的意思了,是指我的函数和被hook的函数链接到了同一个页面对吧?这个其实可以通过指定段来解决的
2022-6-6 00:29
0
雪    币: 14728
活跃值: (4020)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
hook.install(func,1, hookCallBack);
你github中intall函数只有两个参数,图片中有3个,1是代表啥意义呢
2022-6-6 09:06
0
雪    币: 263
活跃值: (1979)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
email123 hook.install(func,1, hookCallBack); 你github中intall函数只有两个参数,图片中有3个,1是代表啥意义呢
源代码我更新过,现在1是不需要的
2022-6-6 10:43
0
雪    币: 14728
活跃值: (4020)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17

好像hook不起作用,怪哦

2022-6-6 11:03
0
雪    币: 263
活跃值: (1979)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
email123 好像hook不起作用,怪哦
这是C++的优化问题,将C++的优化设置为已禁用,启用内部函数选择是
2022-6-6 14:45
0
雪    币: 263
活跃值: (1979)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
email123 好像hook不起作用,怪哦
另外你手上那份存在一些bug,建议你重新下一份,我传github上了
2022-6-6 15:45
0
雪    币: 14728
活跃值: (4020)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
yuyuaqwq 这是C++的优化问题,将C++的优化设置为已禁用,启用内部函数选择是
ok了
2022-6-6 16:28
0
雪    币: 263
活跃值: (1979)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
email123 ok了
刚刚又改了点东西,大概不会再改了23333,没什么问题了
2022-6-6 16:50
0
雪    币: 14728
活跃值: (4020)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
yuyuaqwq 刚刚又改了点东西,大概不会再改了23333,没什么问题了
2022-6-6 17:30
0
雪    币: 5993
活跃值: (5385)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
23
感谢分享,下来看看!
2022-6-6 18:03
0
雪    币: 14728
活跃值: (4020)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
yuyuaqwq 刚刚又改了点东西,大概不会再改了23333,没什么问题了
把后面跟新的文件覆盖昨天下载的,生产的exe文件反而运行有问题了,一闪而过,用旧的重新覆盖,再生产没有问题,请检查
2022-6-6 18:30
0
雪    币: 263
活跃值: (1979)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
email123 把后面跟新的文件覆盖昨天下载的,生产的exe文件反而运行有问题了,一闪而过,用旧的重新覆盖,再生产没有问题,请检查
你重新看一下文章里的那张图片,给被hook的函数添加一下预处理指令
2022-6-6 18:43
0
游客
登录 | 注册 方可回帖
返回
//