MIUI通过xposed自动设置root权限
在小米手机上,每次安装一个自己的插件总需要打开安全中心进行root权限授权,非常的麻烦,总共需要电5次确认,每次需要等5秒
因为插件开发的需求,希望重启计算机时候判断是否已经root,未root则自动提权root,所以我查了一些supersu的授权机制,经启发想到小米是否也是如此,通过数据库的方式进行授权管理,如果是的话,那结合xposed,这个授权功能就很轻松实现了。
分析步骤:
1.打开安排小米:安全中心->root权限管理,pc执行命令
adb shell dumpsys activity top
返回结果:判断出当前应用包名是
com.miui.securitycenter
TASK com.miui.securitycenter id=340
ACTIVITY com.miui.securitycenter/com.miui.permcenter.root.RootManagementActivity be58eac pid=5036
Local Activity d6b28df State:
mResumed=true mStopped=false mFinished=false
mChangingConfigurations=false
mCurrentConfig={1.0 460mcc1mnc zh_CN ldltr sw360dp w360dp h572dp 480dpi nrml port finger -keyb/v/h -nav/h s.5 themeChanged=0 themeChangedFlags=0}
mLoadersStarted=true
Loader Manager 88e892c:
Active Loaders:
#113: LoaderInfo{683fff5 #113 : g{aaed18a}}
mId=113 mArgs=null
mCallbacks=com.miui.permcenter.root.RootManagementActivity@d6b28df
mLoader=g{aaed18a id=113}
mId=113 mListener=LoaderInfo{683fff5 #113 : g{aaed18a}}
mStarted=true mContentChanged=false mProcessingChange=false
mHaveData=true mDeliveredData=true
mData=[com.miui.permcenter.root.b@b0373fb]
mStarted=true mReportNextStart=false mDestroyed=false
mRetaining=false mRetainingStarted=false mListenerRegistered=true
FragmentManager misc state:
mHost=android.app.Activity$HostCallbacks@cf10c18
mContainer=android.app.Activity$HostCallbacks@cf10c18
mCurState=5 mStateSaved=false mDestroyed=false
ViewRoot:
mAdded=true mRemoved=false
mConsumeBatchedInputScheduled=false
mConsumeBatchedInputImmediatelyScheduled=false
mPendingInputEventCount=0
2. adb shell 登录手机, su切换root帐号,cd /system/priv-app ,ls -al 显示系统应用包列表,这一般放小米扩张定制的apk,用户在手机中是无法删除的。
很不错,一步就发现和安全相关的包名:SecurityCenter,完整路径:
复制到sdcard,cp /system/priv-app/SecurityCenter/SecurityCenter.apk /sdcard/Download/
电脑重新开一个命令行窗口,然后adb pull /sdcard/Download/SecurityCenter.apk /tmp 拷贝apk到电脑的/tmp目录,使用jadx对apk进行逆向静态分析,因为我们知道了之前activity的名称,所以jadx打开后,搜索root权限管理的activity页面关键词 “允许2个应用使用ROOT权限” ,所以这的关键词是“个应用使用ROOT权限” ,哈,非常顺利找到了。
<plurals name="hints_get_root_enable_title">
<item quantity="other">允许%d个应用使用ROOT权限</item>
</plurals>
查找hints_get_root_enable_title 定位出 RootManagementActivity就是我们的目标位置,这个和之前dumpsys activity top得到的activity是完全一致,所以可以判定就是这了。我们在真实场景点击,总是提示“确定允许x x x请求系统最高管理权限吗?” 这个下一步->下一步->下一步->确定是我们最总需要确定的代码位置,所以再次搜索 得到
<string name="root_apply_step_1">确定允许%s请求系统最高管理权限吗?</string>
查找到了只有在RootApplyActivity中使用
private String m1975a(int i, CharSequence charSequence) {
switch (i) {
case 1:
return getString(R.string.root_apply_step_1, new Object[]{charSequence});
case 2:
return getString(R.string.root_apply_step_2, new Object[]{charSequence});
case 3:
return getString(R.string.root_apply_step_3, new Object[]{charSequence});
case 4:
return getString(R.string.root_apply_step_4, new Object[]{charSequence});
case 5:
return getString(R.string.root_apply_step_5, new Object[]{charSequence});
default:
return null;
}
}
分析代码,确认那步后触发的逻辑是
C1132g.bR(this).m1998a(512, 3, this.mPkgName);
public void m1997a(long j, int i, int i2, String... strArr) {
Bundle bundle = new Bundle();
bundle.putLong("extra_permission", 512);
bundle.putInt("extra_action", 3);
bundle.putStringArray("extra_package", pack);
bundle.putInt("extra_flags", i2);
this.mContentResolver.call(C1126a.CONTENT_URI, String.valueOf(6), null, bundle);
}
public void m1998a(long j, int i, String... strArr) {
m1997a(512, 3, 0, packname);
}
这使用了android的ipc机制ContentProvider服务进行了授权,那这个ContentProvider的提供者又是哪个apk呢?我们通过C1126a.CONTENT_URI知道了提供者的地址content://com.lbe.security.miui.permmgr,一般来说,寻找类似的包名就可以了,我们手机上也能发现存在该包名的应用/data/data/com.lbe.security.miui
但是没找到这个apk,不过通过类似名字,运气再次爆棚,发现了这个地址是/system/priv-app/AuthManager/AuthManager.apk pull到电脑再次用jadx分析,确定就是这个apk提供了授权db的操作,参考意思代码分析方式,略过查找代码的过程,最终定位
com.lbe.security.service.provider.PermissionManagerProvider.updatePackagePermission 所以xposed hook自动授权root的代码就如下
XposedHelpers.findAndHookMethod("com.lbe.security.service.provider.PermissionManagerProvider", classLoader, "onCreate",
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
XposedBridge.log("--hook PermissionManagerProvider ok~~~~~~~ -- ");
//(String packageName, long permId, int action, boolean apply, boolean isSuggest, boolean kill)
//设置root权限,取消root权限把3改成1
XposedHelpers.callMethod(param.thisObject,
"updatePackagePermission",
PACKAGE_NAME,512, 3, true, false, false
);
XposedBridge.log(">> autoAuthorizeRoot ok~ ");
}
});
ok 到此结束,顺利完成任务!!
MIUI通过xposed自动设置root权限的更多相关文章
- expect脚本自动获取root权限
Linux脚本中有很多场景是进行远程操作的,例如远程登录ssh.远程复制scp.文件传输sftp等.这些命令中都会涉及到安全密码的输入,正常使用命令时是需要人工手动输入密码并接受安全验证的.为了实现自 ...
- ubuntu设置root权限默认密码
1.默认root密码是随机的,即每次开机都有一个新的root密码.我们可以在终端输入命令 sudo passwd,然后输入当前用户的密码2.终端会提示我们输入新的密码并确认,此时的密码就是root新密 ...
- LINUX下 一句话添加用户并设置ROOT权限
来源:linux一条命令添加用户并设置密码 linux一条命令添加一个root级别账户并设置密码 LINUX提权,除非是拿的EXP反弹CMD,才会有回显,这样添加管理员方便了. 通常是在SHELL,菜 ...
- ubuntu 13.04 root权限设置方法详解
很多朋友安装升级Ubuntu 13.04之后不知道ubuntu 13.04 root权限设置的具体方法,今天这篇文章就将为大家详细介绍设置root权限的步骤,新手朋友可以来看一看哦~ Ubunto 1 ...
- 小米4 miui专用 Xposed安装器86版
转载自 http://www.52pojie.cn/thread-516435-1-1.html 写在前面:各位用xp受到不同限制,有些机型还找不到框架包,又要刷第三方rec又要谨慎选择框架版本.官方 ...
- Ubuntu查看和设置Root账户
前言: 要在Linux中运行管理任务,必须要具有root(也称为超级用户)访问权限.在大多数Linux发行版中,拥有一个单独的root账户是很常见的,但是Ubuntu默认禁用root账户.这可以防止用 ...
- Ubuntu 设置root用户登录
由于 Ubuntu 是基于 Debian 的 linux 操作系统,在默认的情况下,是没有超级用户(superuser, root)的,但有些系统操作必须有超级用户的权限才能进行,如手动释放内存等. ...
- Linux如何把以下文件夹修改为root权限?
inux 修改文件目录所有者例:要将当前目录下名 title 的文件夹及其子文件的所有者改为geust组的su用户,方法如下:#chown -R su.geust title-R 递归式地改变指定目录 ...
- 介绍linux下利用编译bash设置root账号共用的权限审计设置
在日常运维工作中,公司不同人员(一般是运维人员)共用root账号登录linux服务器进行维护管理,在不健全的账户权限审计制度下,一旦出现问题,就很难找出源头,甚是麻烦!在此,介绍下利用编译bash使不 ...
随机推荐
- 应用MySQL(开启远程登录权限)
参考“开启MySQL远程访问权限 允许远程连接”.
- 关于SQLserver2008索引超出了数据
由于公司只支持了2008.不支持2012的数据库.所以安装的2008.但在对表进行操作的时候出现如下异常: 这个问题是由于本地装的2008,但IT那边的测试机上面确装的2012.所以2008连接了20 ...
- eclipse编译器显示的文件名乱码,活动标签乱码(已解决)
在公司电脑上安装了最新eclipse版本却发现文件名会乱码,如下所示,重新安装仍存在问题. 解决方法: 打开菜单Window->Preferences 打开选项General->Appe ...
- 使用dubbo中间件的zookeeper注册中心时报错
在项目中搭建soa项目时,使用dubbo服务中间件时需要在虚拟机中创建一个zookeeper注册中心,在配置都没有问题的时候,如果服务端启动成功,但是消费端启动报错并且看不出据地位置时,一定要注意你的 ...
- 安装USB驱动时报错“无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动”
今天在安装一个USB设备的时候报错“Windows已找到设备的驱动程序软件,但在试图安装它时遇到错误”. 这个错误的描述是“无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动”. 事实上,这个 ...
- js中的“默默的失败”
看阮一峰的js标准教程,看到了“默默的失败”觉得很形象也很无奈, 总结一下都有哪些地方会“默默的失败” 字符串内部的单个字符无法改变和增删,这些操作会默默地失败. var s = 'hello'; d ...
- elasticsearch批量修改,批量更新某个字段
1.源生API 在这里没有用官方提供的bulk API,而是用的另外一种方式. POST /infomations/infomations/_update_by_query JSON请求格式 { &q ...
- C语言典型编程3
关于C的一些小而精的编程,适合希望提升编程能力的初学者学习:关键编程也就几句,但思维可以迁移到其他编程语言.同一问题,算法多种. //判断三角形类型#include<stdio.h>mai ...
- SpringCloud-day09-Feign与Hystrix整合
8.5.Feign 与 Hystrix整合 服务熔断服务降级彻底解耦 前面的代码,用@HystrixCommand fallbackMethod是很不好的,因为和业务代码耦合度太高,不利于维护,所以需 ...
- ASCII,Unicode,GBK和UTF-8字符编码的区别和联系
如果经常写python2,肯定会遇到各种“奇怪”的字符编码问题,每次都通过谷歌解决了,但是为什么会造成这种乱码.decode/encode失败等等,本文就字符和字符编码做一个总结,更加清晰区分诸多的编 ...