关掉magiskhide_[讨论] Magisk隐藏root的实现
Magisk源码地址:https://github.com/topjohnwu/Magisk,隐藏root功能包含了隐藏某些系统属性,隐藏magisk包名等。本菜抛砖引玉,希望大家讨论其中隐藏su文件的逻辑,以及检测这种情况的方法。代码位于工程的 Magisk/native/jni/magiskhide目录下,这里直接把功能实现核心代码抽离出来,以下是主要部分:
int main(int argc, char** argv) {
DEBUG_PRINT("hideroot start\n");
if (argc
DEBUG_PRINT("usage: ./hideroot {pid}\n");
return 1;
}
pid_t target_pid = atoi(argv[1]);
DEBUG_PRINT("target pid is %d\n", target_pid);
// 1. 暂停目标进程
kill(target_pid, SIGSTOP);
// 2. 关联到目标进程的mnt-namespace
DEBUG_PRINT("hideroot switch_mnt_ns\n");
if (switch_mnt_ns(target_pid)) {
DEBUG_PRINT("");
return 1;
}
// 3. 卸载相关文件系统
DEBUG_PRINT("hideroot read mounts\n");
char buffer[256];
char* line = NULL;
struct vector mount_list;
snprintf(buffer, sizeof(buffer), "/proc/%d/mounts", target_pid);
DEBUG_PRINT("hideroot init mount_list\n");
vec_init(&mount_list);
DEBUG_PRINT("hideroot read file\n");
file_to_vector(buffer, &mount_list);
DEBUG_PRINT("hideroot unmount dummy skeletons and /sbin links\n");
// Unmount dummy skeletons and /sbin links
vec_for_each(&mount_list, line) {
if (strstr(line, "tmpfs /system/") || strstr(line, "tmpfs /vendor/") || strstr(line, "tmpfs /sbin")) {
sscanf(line, "%*s %4096s", buffer);
lazy_unmount(buffer);
}
free(line);
}
vec_destroy(&mount_list);
// Re-read mount infos
snprintf(buffer, sizeof(buffer), "/proc/%d/mounts", target_pid);
vec_init(&mount_list);
file_to_vector(buffer, &mount_list);
DEBUG_PRINT("hideroot unmount everything under /system, /vendor\n");
// Unmount everything under /system, /vendor, and loop mounts
vec_for_each(&mount_list, line) {
if (strstr(line, "/dev/block/loop") || strstr(line, " /system/") || strstr(line, " /vendor/")) {
sscanf(line, "%*s %4096s", buffer);
lazy_unmount(buffer);
}
free(line);
}
vec_destroy(&mount_list);
exit:
// 4. 目标进程继续运行
kill(target_pid, SIGCONT);
sleep(100);
return 0;
}
switch_mnt_ns的实现如下:
int switch_mnt_ns(int pid) {
char mnt[32];
snprintf(mnt, sizeof(mnt), "/proc/%d/ns/mnt", pid);
if(access(mnt, R_OK) == -1) {
DEBUG_PRINT("[switch_mnt_ns] %s can't access!", mnt);
return 1;
}
int fd, ret;
fd = open(mnt, O_RDONLY);
if (fd
DEBUG_PRINT("[switch_mnt_ns] open %s failed!", mnt);
return 1;
}
// setns的详细解释见 http://man7.org/linux/man-pages/man2/setns.2.html
ret = setns(fd, 0);
close(fd);
return ret;
}
原理很简单,通过setns关联到目标进程,unmount掉一些文件系统。附件demo的测试输出:
unmount前后,目标进程/proc/self/mounts文件内容的变化:
然后测试了下namespace相关的输出,shell 和root的mnt-namespace 是同一个:
所以在shell或者root中某一个终端隐藏su后,在其他终端也不能直接访问su了。
另外,查看过的所有进程的net-namespace都是同一个:
关于哪些进程使用同一个namespace的逻辑,本菜也不清楚从内核源码的哪部分看,有大佬了解这块的欢迎拍砖。
上传的附件:
hideroot.zip
(7.06kb,202次下载)
关掉magiskhide_[讨论] Magisk隐藏root的实现相关推荐
- 关掉magiskhide_最新版Magisk-v20.4刷入后找不到Magisk Hide怎么办+Magisk Hide开启教程
2020年,说到ROOT权限,我们最多谈到的就是Magisk 面具ROOT了,什么Kingroot,什么SuperSU,不是倒闭就是早就项目停止了.面具ROOT成为了当下几乎唯一的ROOT权限了除了R ...
- KernelSU: 内核 ROOT 方案, KernelSU KernelSU KernelSU 新的隐藏root防止检测 封号方案
大约一年多以前,我在一篇讲Android 上 ROOT 的过去.现在和未来https://mp.weixin.qq.com/s?__biz=MjM5Njg5ODU2NA==&mid=22574 ...
- 红米K60刷入MIUI.EU安装面具magisk与root教程
文章目录 前言 1.解锁BootLoader 2.刷入Recovery 3.刷入EU的ROM包 4.刷入magisk面具 后话 前言 教程大概就是四步,解锁,刷入rec,刷入系统,刷入面具,跟着教程走 ...
- Moto P30(XT1943-1) 免解锁BL 免rec 保留数据 Magisk Xposed ROOT 救砖 ZUI 4.0.374
>>>重点介绍<<< 第一:本刷机包可卡刷可线刷,刷机包比较大的原因是采用同时兼容卡刷和线刷的格式,所以比较大 第二:[卡刷方法]卡刷不要解压刷机包,直接传入手机后 ...
- Pixel3 XL 刷Android原生系统,刷Magisk 进行ROOT
Pixel3 XL 刷Android原生系统,刷Magisk 进行ROOT 前言 一.基本信息 二.解锁OEM和BL 三.驱动安装下载 四.刷入google官方镜像 五.刷入面具Magisk,ROOT ...
- Magisk 保留root升级系统(亲测小米)
Magisk 保留root升级系统(亲测小米) 系统提示升级,先检查是否跨版本升级,如果跨版本升级,请参考下面帖子重新获取权限,如果不是,升级提示如下,则可使用本帖 小米,红米 root Magisk ...
- ZUK Z2 Pro(Z2121) 免解锁BL 免rec Magisk Xposed ROOT 救砖 ZUI 4.0.247
>>>重点介绍<<< 第一:本刷机包可卡刷可线刷,刷机包比较大的原因是采用同时兼容卡刷和线刷的格式,所以比较大 第二:[卡刷方法]卡刷不要解压刷机包,直接传入手机后 ...
- 玩机搞机----root面具的安装 更新 隐藏root 德尔塔面具等等综合解析
目前的机型都是root面具,今天的帖子主要分析下面具的一些使用常识.一般面具如何使用一参考我前面的帖子.基本步骤都是解锁bl---修补boot---刷入boot----安装面具apk.但目前很多app ...
- 红米Redmi K40手机刷入Magisk获取Root教程
Magisk是一套开源系统自定义模块,内置了Magisk Manager(图形化管理界面).Root.启动脚本.SElinux补丁和启动时认证/dm-verity/强制加密移除功能.Magisk同时提 ...
- miui13刷magisk面具root
可能存在一定门槛,可能又没有 刷fastboot忘记要不要先unlock了,建议还是去unlock一下,等7天再来整root. 目录 准备工作 1.下载要装的rom包 2.rom解包(无加密则跳过此步 ...
最新文章
- 吃透Java中的动态代理
- PyQt:如何给界面自定义背景?
- 全球及中国生物质能发电产业十四五利用现状及建设布局研究报告2021-2027年
- 迷宫收集星星 并查集解答
- 用matlab定义2020年元旦是星期三,如何用matlab实现某年某月某日是星期几的问题,...
- 图片压缩工具optipng/jpegoptim安装
- 信息学奥赛C++语言:乘车费用
- 野生前端的数据结构练习(11)动态规划算法
- Swift - UIBezierPath
- MATLAB中的线性插值
- phalapi-进阶篇3(自动加载和拦截器)
- 鞍山楷邦计算机学院,计算机专业和平面设计专业是一个专业不?
- 分布式监控系统开发【day37】:填充表配置项目(三)
- .NET简谈观察者模式
- python xlwt生成Excel
- delete 和 delete []的真正区别+析构函数
- OneZero第二周第三次站立会议(2016.3.30)
- Numpy删除指定行
- Unitary matrix 幺正矩阵
- JavaMail 之 搜索邮件