前段时间因为想要写个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_register与uprobe_unregister即可实现对任意用户态函数的挂载。
在使用uprobe_register注册了若干uprobe挂载点后,如果再直接使用uprobe_unregister函数取消这些挂载点有可能会致使内核发生严重错误而直接崩溃,通过查看内核日志后发现错误日志,在网上搜索后发现在调用uprobe_unregister函数前调用rcu_read_unlock函数先行解锁即可正常取消相应挂载点。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 8小时前
被安卓逆向test编辑
,原因: