目录

充电学习中...

标签: 内核 (2)

安卓内核定制开发笔记(三)系统调用Hook 有更新!

安卓内核定制开发笔记(三)系统调用Hook 在上一篇文章中,我们已经探讨了对系统调用的简单Hook,但是在实际应用中,只是监控系统调用的出入参是无法满足需求的,我们预期得到一个类似于inline hook的功能,也就是在hook到调用的同时,可以对出入参进行修改。这一功能在用户态非常容易实现,与正向开发无异,但是内核态由于各种保护机制,无法直接修改用户态的内存,导致这一实现有些麻烦,可以参考看雪文章[原创]内核层偷天换日之hook openat进行文件重定向-Android安全-看雪-安全社区|安全招聘|kanxue.com 我们可以看到内核代码中对openat调用号的声明 int openat(int dirfd, const char __user *pathname, int flags, umode_t modex) 可以看到,关键的路径入参被const和__user修饰,这代表这是一个用户态的常量,而内核模块工作在内核态,与用户态是隔离的,内核策略也限制了内核态和用户态内存的互相访问,所以内核模块是无法直接修改这个参数的。 解决方案 为了解决这一问题,我们需要使用内核提供的....

安卓内核定制开发笔记(二)系统调用拦截 有更新!

安卓内核定制开发笔记(二)系统拦截 在第一篇文章中,我们已经已一加3T为例,尝试编译和刷入了官方内核,并且解决的一些驱动问题,接下来我们将在此基础上去实现对系统调用的Hook,以openat为例 Hook原理 系统调用是内核开放给用户态的"接口",而各个系统调用的地址被保存在系统调用表(sys_call_table)中,所以只需要修改对应调用号(例如openat)在系统调用表中的地址就可以实现对系统调用的hook了 开发流程 1.获取sys_call_table地址 方法一: 在内核编译页面,找到System.map,里面保存了编译后的符号地址,可以在内核编译输出目录直接执行以下命令 cat System.map |grep "sys_call_table" 方法二: 动态获取,内核版本4.4以下可以用 // 内核4.4以下可以用 static void getsyscall_table(void) { unsigned long *syscall_table; unsigned long int i; for (i = (unsigned long int)sys_close; i....