在小米手机上,每次安装一个自己的插件总需要打开安全中心进行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权限的更多相关文章

  1. expect脚本自动获取root权限

    Linux脚本中有很多场景是进行远程操作的,例如远程登录ssh.远程复制scp.文件传输sftp等.这些命令中都会涉及到安全密码的输入,正常使用命令时是需要人工手动输入密码并接受安全验证的.为了实现自 ...

  2. ubuntu设置root权限默认密码

    1.默认root密码是随机的,即每次开机都有一个新的root密码.我们可以在终端输入命令 sudo passwd,然后输入当前用户的密码2.终端会提示我们输入新的密码并确认,此时的密码就是root新密 ...

  3. LINUX下 一句话添加用户并设置ROOT权限

    来源:linux一条命令添加用户并设置密码 linux一条命令添加一个root级别账户并设置密码 LINUX提权,除非是拿的EXP反弹CMD,才会有回显,这样添加管理员方便了. 通常是在SHELL,菜 ...

  4. ubuntu 13.04 root权限设置方法详解

    很多朋友安装升级Ubuntu 13.04之后不知道ubuntu 13.04 root权限设置的具体方法,今天这篇文章就将为大家详细介绍设置root权限的步骤,新手朋友可以来看一看哦~ Ubunto 1 ...

  5. 小米4 miui专用 Xposed安装器86版

    转载自 http://www.52pojie.cn/thread-516435-1-1.html 写在前面:各位用xp受到不同限制,有些机型还找不到框架包,又要刷第三方rec又要谨慎选择框架版本.官方 ...

  6. Ubuntu查看和设置Root账户

    前言: 要在Linux中运行管理任务,必须要具有root(也称为超级用户)访问权限.在大多数Linux发行版中,拥有一个单独的root账户是很常见的,但是Ubuntu默认禁用root账户.这可以防止用 ...

  7. Ubuntu 设置root用户登录

    由于 Ubuntu 是基于 Debian 的 linux 操作系统,在默认的情况下,是没有超级用户(superuser, root)的,但有些系统操作必须有超级用户的权限才能进行,如手动释放内存等.  ...

  8. Linux如何把以下文件夹修改为root权限?

    inux 修改文件目录所有者例:要将当前目录下名 title 的文件夹及其子文件的所有者改为geust组的su用户,方法如下:#chown -R su.geust title-R 递归式地改变指定目录 ...

  9. 介绍linux下利用编译bash设置root账号共用的权限审计设置

    在日常运维工作中,公司不同人员(一般是运维人员)共用root账号登录linux服务器进行维护管理,在不健全的账户权限审计制度下,一旦出现问题,就很难找出源头,甚是麻烦!在此,介绍下利用编译bash使不 ...

随机推荐

  1. C语言程序实现,统计字符串里面各个字符的个数在总字符个数中的比例,并打印输出。

    #include<stdio.h> int main() { char *ppp= "aaassadddeeds"; ] = {};//存放字符 uint32 ccnt ...

  2. mybatis学习 -每天一记 mybatis insert null 报错

    mybatis 插入数据,model的属性存在null,插入报错 在使用mybatis 进行insert时,如果字段值存在null的情况,会出现插入失败的情况,解决方案: 如果使用spring boo ...

  3. python大法好——Python XML解析

    Python XML解析 什么是XML? XML 被设计用来传输和存储数据. XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识. 它也是元标记语言,即定义了用于定义其他与 ...

  4. Go 语言 map (映射)

    1.Go 语言中 map 的定义及初始化: map[Key_Type]Value_Type scence := make(map[string]int) 2.Go 语言的遍历: scene := ma ...

  5. Windows下查看自己电脑的网关mac以及手动获取新的地址

    场景:正在上班时,工作电脑突然无法连接网络了.查看配置发现DNS服务器地址被分配到了192.168.1.1,瞬间懵了? 过程:(1)进入cmd.使用ipconfig /all查看网关地址; (2)使用 ...

  6. 性能学习随笔(1)--负载均衡之f5负载均衡

    负载均衡设计涉及软件负载和硬件负载,下文转自CSDN中一篇文章涉及f5硬负载知识 ----转载:https://blog.csdn.net/tvk872/article/details/8063489 ...

  7. springboot性能优化

    一.扫描优化 原文链接:http://www.studyshare.cn/blog-front/blog/details/1135 SpringBoot项目中的启动类,会使用@SpringBootAp ...

  8. Linux命令:let

    语法 let  expr [expr ...] 说明 计算c的算术表达式.详细说明请参考<Bash参考指南-6.5 shell算术运算>

  9. PowerDesigner工具将表字段转成java实体

    首先将数据库的表导出为SQL文件.下载安装PowerDesigner工具. 下面以图文的形式讲解: 图   (1) 图   (2) 图   (3) 图   (4) 图   (5) 图   (6) 图 ...

  10. Idea实用快捷键

    快速找到最近使用的文件的设置       ctrl+E    general 里设置 自动补全末尾的字符                Ctrl+Shift+Enter 选择当前光标位置单词      ...