关于kernelSU,异想天开的想自己逆向实现简单授权(失败经历)

首次听说kernelSU还是去年的时候,当时没太在意。直到今年kernelSU实现了5.10以上内核的适配。我又重新关注起来了。看了下其开源代码。
由于对android root毫无了解,刚开始我天真的以为只需要设置进程的uid、gid…等等的参数就好了。
于是我的思路是:
1.串改普通系统调用(使其传入特定参数时实现自己的功能)。
2.手敲汇编,实现对上述的一些参数的直接修改。
改完以后刷入手机,成功开机,于是心花怒放的去输出了一下调用自己实现的功能后…getuid、getgid、getegid…都设置成功了。
但是我发现无论是访问文件还是其他功能,都不具备root所拥有的能力。
于是又一顿研究,发现有个叫selinux的东西管理着所有文件的权限。嗯!维术开源的代码上也有,selinux的参数是在cred->security中设置的。我注意到在此之前,他还调用了security_secctx_to_secid,逆向时也能调用到这个函数,但是传参比较麻烦。所以我选择性的忽略了。再次手敲汇编实现了修改cred->security中各项参数的功能。开机后发现文件访问仍然受限制,但是如果是sh调用文件的话,不会向之前一样提示没有权限了。这也侧面反应了我改的是没错的,至于没有成功的原因,我能想到应该是没调用security_secctx_to_secid的缘故,但是我没打算马上解决,因为这部分传参有点麻烦,先放一放。既然是selinux搞的鬼,那么直接setenforce 0(临时关闭selinux)。确实能访问其他进程的文件了。但是还是不具备root用户的其他权限,比如某些系统调用。
再次发现,系统调用是由一个叫seccomp的东西管理的,看维术的代码是这么做的:

// disable seccomp
#if defined(CONFIG_GENERIC_ENTRY) &&                                           
	LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0)
	current_thread_info()->syscall_work &= ~SYSCALL_WORK_SECCOMP;
#else
	current_thread_info()->flags &= ~(TIF_SECCOMP | _TIF_SECCOMP);
#endif
	current->seccomp.mode = 0;
	current->seccomp.filter = NULL;

上面if、else的那部分,大概是设置thread_inof->syscall_work或者thread_inof->flags的,thread_inof结构体的地址是通过current_thread_info()获取的。因为我是逆向的缘故,这个函数又被内联了。所以我压根就得不到thread_inof结构体的地址。
于是我尝试直接逆向写汇编修改current->seccomp.mode和current->seccomp.filter的值。结果也在我的意料之中。开机后调用自己实现的功能修改这两个值以后,手机直接死机重启。当然也不是我改错地方了,以我的逆向经验不会改错的。而且我也反复确认过。

以上就是我妄图以逆向串改内核的方式实现kernelSU简单授权的失败经历。
由于对内核中权限管理方面的了解几乎为0。所以有些东西也可能是我做的不对。或者有其他更好的方式?如果哪位大佬有什么更好的建议,欢迎评论、私信。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
https://app.dengskypou.com/

)">
< <上一篇
下一篇>>