欢迎光临散文网 会员登陆 & 注册

Magisk hide/Denylist 核心原理分析 ROOT隐藏的实现浅论

2023-06-21 16:00 作者:MeetUnknown  | 我要投稿


前言

当手机安装magisk后,全局的挂载空间会受到变更,magisk给我们挂载上了一个su二进制,这就是我们能够访问到su命令的原因

无论是Magisk hide还是Denylist,我们都可以将它们的工作分成两个部分,第一个部分是如何监控安卓进程的启动第二部分是在安卓进程启动(fork)之后,尽快移除已经“污染”的挂载空间


ROOT隐藏关乎到magisk的核心原理:

mount

我们可以从linux内核获取到mount的相关信息

全局挂载空间

/proc/mounts

/proc/mountinfo

/proc/mountstats


进程的挂载空间

/proc/pid/mounts

...

如果我们成功刷入magisk, 以下命令将会有大量的挂载信息输出

cat /proc/mounts |grep magisk


在linux系统中,mount有好多种

我们注意关注的是“mount --bind

mount --bind命令来将两个目录连接起来,mount --bind命令是将前一个目录挂载到后一个目录上,所有对后一个目录的访问其实都是对前一个目录的访问

就是说,我们可以给文件目录戴上一个“面具”,应用程序访问文件,首先访问到的是“面具层”,而不是真正的文件。


程序由数据和代码组成,但是,我们也可以说,数据和代码都是基于“文件”, 因此对文件的改动,就能改变程序的运行~

所以我们可以面具实现许许多多的黑科技


在root下的程序可以切换到任意进程的命名空间,进行mount(umount)操作


如果我们使用momo检测,我们可以发现magisk这套检测并非运行得很完美

1. magisk hide 的ptrace容易被检测到

2. magisk hide 无法对isolated_zygote进程处理,因为isolated_zygote与zygote进程共享挂载空间,如果对isolated_zygote进程进行处理,那么后面所有打开的app无法访问到su,即无法获取到root权限。因此,出现一个名为riru_unshare的插件可以使用unshare函数指定独立进程不与zygote共享命名空间。

3. 还有一些可以绕过早期magisk hide(18)的方法,就是自定义安卓的进程名后面加两个.., 如微信的“:hotpot..”进程会被magisk_hide忽略为无效的隐藏进程而被magisk hide忽视。

上述方法在magisk时代下,几乎毫无作用的,因为我们可以使用面具随机地让某个指定程序看到哪些文件,看不到哪些文件。

magisk hide/denylist 的源码分析


在magisk 23版本之前, 使用magisk hide进行隐藏, magisk hide使用ptrace监控进程启动,如果是zygote进程且非isolated_zygote进程,则暂停进程,进行umount操作,再继续运行进程

Part1 监控安卓进程的启动


在magisk 25版本之后,使用denylist,如果你要使用denylist,那需要先需要开启zygote,因为denylist通过hook zygote的fork函数获知进程的启动。

denylist与magisk hide也是一样,都是对污染的命名空间进行卸载,但有一点不同,denylist是在自身的进程执行卸载代码,而magisk_hide在magiskd进程进行操作,需要先使用__switch_to_ns__切换到目标进程的命名空间。


Yyds.Msu 的设计

Yyds.Msu与magisk hide反其道而行之。大道至简,尽可能让方案更加简单才能更稳定。

1. Yyds.Msu 是先卸载,默认应用是没有污染命名空间的,也就是说,直接对zygote以及zygote64进程进行命名空间卸载。

2. Yyds.Msu 在不使用zygote hook与ptrace的情况下,是无法监听其它app进程的启动的,但可以想办法监听到yyds.msu管理apk的启动,那就是inotify,我们只需要让yyds.msu管理apk在Application时候创建一个文件,即可让我们魔改过的magiskd知晓到并进行挂载。

3. 缺点是我们无法让其它app打开即进行挂载获得到root权限,在不进行任何hook的情况下除非我们死循环地地扫描/proc目录。

4. 在Yyds.Msu中我们手动使用超级运行对指定进程直接挂载root权限以及相关magisk bin,但是似乎对某些app来说获取root权限有些慢,我们直接对zygote进程挂载root权限并在app启动成功后恢复zygote的正常挂载,这个就是超级运行的兼容模式。


Magisk hide/Denylist 核心原理分析 ROOT隐藏的实现浅论的评论 (共 条)

分享到微博请遵守国家法律