首页
社区
课程
招聘
[原创]在内核中直接使用uprobe的一些坑
发表于: 8小时前 308

[原创]在内核中直接使用uprobe的一些坑

8小时前
308

前段时间因为想要写个trace工具,要用到能够同时hook大量native函数的框架,frida排除在外。在尝试使用github上其他开源的inline-hook框架后,发现效果均不佳,要么是稳定性太差,要么是无法达到我想要的效果。偶然间发现uprobe能在内核直接使用,于是便开始尝试写个基于uprobe用于大量hook应用层函数的kpm内核模块即Kernel-Trace

在内核直接注册uprobe挂载点主要就是依赖uprobe_register这个函数,取消注册则是要使用uprobe_unregister,这两个函数符号在5.10及以上版本的内核都是直接导出的,这就方便了kpm内核模块的编写。uprobe_register函数的参数为(struct inode *inode, loff_t offset, struct uprobe_consumer *uc),第一个参数是要hook的二进制文件对应的inode,这个可以通过文件名来获取,第二个参数是设置uprobe的偏移值,第三个参数主要包含了对应uprobe挂载点的一些回调函数,uprobe_unregister函数的参数与uprobe_register一致。

通过在内核直接主动调用uprobe_registeruprobe_unregister即可实现对任意用户态函数的挂载。

在使用uprobe_register注册了若干uprobe挂载点后,如果再直接使用uprobe_unregister函数取消这些挂载点有可能会致使内核发生严重错误而直接崩溃,通过查看内核日志后发现错误日志,在网上搜索后发现在调用uprobe_unregister函数前调用rcu_read_unlock函数先行解锁即可正常取消相应挂载点。


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

最后于 8小时前 被安卓逆向test编辑 ,原因:
收藏
免费 38
支持
分享
最新回复 (13)
雪    币: 5
活跃值: (3045)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
支持一下
6小时前
0
雪    币: 4
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
感谢分享
4小时前
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
支持一下
4小时前
0
雪    币: 650
活跃值: (1367)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
66666666
4小时前
0
雪    币: 0
活跃值: (1398)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
支持一下
4小时前
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
666
4小时前
0
雪    币: 94
活跃值: (3152)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
666666
4小时前
0
雪    币: 144
活跃值: (768)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
666666
4小时前
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
666666
4小时前
0
雪    币: 979
活跃值: (4912)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
666
3小时前
0
雪    币: 3686
活跃值: (3495)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
支持一下
2小时前
0
雪    币: 7483
活跃值: (3773)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
感谢分享
47分钟前
0
雪    币: 363
活跃值: (920)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
666
30分钟前
0
游客
登录 | 注册 方可回帖
返回