蓝天资源网
当前位置:蓝天资源网 / 汇编逆向 / 正文

MIUI 12稳定版系统中的开发者选项限制解除

作者:忆笙发布时间:2021-10-03 01:21浏览数量:786次评论数量:0次

以下MIUI 12限制解除:1.开发者选项中的USB安装必须插入SIM卡

MIUI 12稳定版系统中的开发者选项限制解除  第1张

2.开发者选项中的USB调试(安全设置)25秒窗口绕过

MIUI 12稳定版系统中的开发者选项限制解除  第2张

3.通过ADB命令行安装APK时提示小窗口“是否继续安装”

MIUI 12稳定版系统中的开发者选项限制解除  第3张

0x00 定位第一个限制代码

实际控制权限App:com.miui.securitycenter

过程摘要:

一开始以为在com.android.settings包App里面,经过界面定位发现竟然在MIUI手机管家。

解包,JEB 3.24 Decompiler之后迅速定位相关Activity: com.miui.permcenter.install.AdbInstallVerifyActivity

    该Activity寻找的办法是:点击开启USB安装后,利用“开发者助手”的界面分析器看到栈顶界面有一闪而过的com.miui.permcenter,由于是一闪而过的小窗口,他显示的是“正在开启...”,然后迅速提示我”请插入SIM卡“,截图来不及,就不上图了.
    随后找到com.miui.securitycenter,利用AdbInstallVerifyActivity类名迅速定位,详细寻找过程不再赘述。

查看OnCreate函数,可以看到

MIUI 12稳定版系统中的开发者选项限制解除  第4张

直接在启动了一个后台网络线程,请求网络,查看q.a后发现是检查用户是否有权限解锁:

MIUI 12稳定版系统中的开发者选项限制解除  第5张

此处不提,往下看可知

MIUI 12稳定版系统中的开发者选项限制解除  第6张

又执行了一个b函数,检查是否登录小米账号。我这里已经登录所以没有报错。如果想在不登录账户的情况下解锁,可以考虑回溯该处堆栈信息以进行判断Hook,让他直接走this.a()函数。

我们继续查看this.a函数:

MIUI 12稳定版系统中的开发者选项限制解除  第7张

可以看到开始进入布局界面inflate,做开发的看到这个函数一定很熟悉了,界面加载。

setupAlert函数没什么看头,目测是打开提示窗口。

我们直接看d函数

MIUI 12稳定版系统中的开发者选项限制解除  第8张

d函数很有意思,先进行了网络判断,如果没网会提示你开网再玩.有网的话它会执行一个后台任务.

我们到new a这里看。

a是一个内部静态异步任务

MIUI 12稳定版系统中的开发者选项限制解除  第9张

里面持有了一个弱引用上下文防止内存泄漏。

既然是Asynctask那么我们就关注一下两个特殊函数

MIUI 12稳定版系统中的开发者选项限制解除  第10张

doInBackground是优先于onPostExecute执行的,是进行网络访问等耗时操作,然后把结果传回UI线程函数onPostExecute。

也就是说,我们只需要直接看结果接受函数:onPostExecute.

doInBackground是返回了错误信息,用于this.a函数接受,如果不符合解锁条件那么a函数将会吐司它的String信息。

点开this.a(((String)arg1));我们看下a函数是干嘛的:

MIUI 12稳定版系统中的开发者选项限制解除  第11张

直接预览一看,v0不用看了 是上下文 不会出现null指针,所以第一个判断直接忽略,看第二个:arg4 == null那么执行v0.c()函数。

c函数又是干嘛的?我们预览一下:

MIUI 12稳定版系统中的开发者选项限制解除  第12张

这个没什么好说的了,InputApplyActivity不是我们的界面,略过,所以this.c一定是false才对。

又执行了this.a(true)函数,我们看一下:

MIUI 12稳定版系统中的开发者选项限制解除  第13张

好,最后执行了最终操作函数:d.a(clazzInstance).a(Boolean)

跳过去一看:

MIUI 12稳定版系统中的开发者选项限制解除  第14张

对头了,终于找到控制adb安装的选项。

重新梳理逻辑:

this.onPostExecute(null)参数必须为null,然后cls.c.value = false直接判断为false走this.a(true)函数,最后执行了a(true)函数,整个Hook就完成了。剩下的工作MIUI已经做好了,我们Hook的只有两个地方。

解除限制SIM卡的Frida Hook代码:(注释较多)

// 开启USB安装 主动调用无效
// ss.set('persist.security.adbinstall', '1')
var cls = Java.use('com.miui.permcenter.install.AdbInstallVerifyActivity')
cls.onCreate.overload('android.os.Bundle').implementation = function (arg) {
    this.onCreate(arg)
    var AdbInstallVerifyActivity$a = Java.use('com.miui.permcenter.install.AdbInstallVerifyActivity$a')
    AdbInstallVerifyActivity$a.onPostExecute.overload('java.lang.Object').implementation = function () {
        // console.log('onPostExecute')
        this.onPostExecute(null) //强制指定值为null让他走v0.c()函数继续启用ADB
        // a函数原型
        //protected void a(String arg4) {
        //  AdbInstallVerifyActivity v0 = (AdbInstallVerifyActivity)this.a.get();
        //  if(v0 == null) {
        //      return;
        //  }
        //
        //  if(arg4 == null) {
        //      v0.c(); //走这里
        //  }
        //  else if(!TextUtils.isEmpty(arg4)) {
        //      Toast.makeText(v0.getApplicationContext(), arg4, 1).show();
        //  }
        //  v0.finish();
        //}
    }
}
cls.c.value = false //让程序强制完成判断
// protected void c() {
//     if(this.c) {
//         AdbInputApplyActivity.a(true);
//         return;
//     }
//
//     this.a(true); //执行启用ADB代码
// }
// 函数原型
cls.c.overload().implementation = function (params) {
    console.log(this.c.value) //打印日志 无作用
    this.c()
}
cls.a.overload('boolean').implementation = function (a) {
    console.log('我被调用了') //打印日志 无作用
    this.a(true) //这里True是MIUI固定的
}
//最后执行
// public void a(boolean arg2) {
//     b.b("security_adb_install_enable", ((boolean)(((int)arg2))));
//     SystemPropertiesCompat.set("persist.security.adbinstall", arg2 ? "1" : "0");
// }

0x01 寻找解除USB调试(安全设置)25秒窗口

实际控制权限App:com.miui.securitycenter

过程摘要:类似0x00节,这里是弹出窗口后用“开发者助手”查看栈顶Activity,得到当前界面:com.miui.permcenter.install.AdbInputApplyActivity

MIUI 12稳定版系统中的开发者选项限制解除  第15张

根据类名迅速定位:

MIUI 12稳定版系统中的开发者选项限制解除  第16张

既然是两个按钮,直接定位相关onClick代码

MIUI 12稳定版系统中的开发者选项限制解除  第17张

看到图中有一个0x7F090017和0x7F090502,一个ID是Accept和Reject,此处不难理解。

有趣的是ID:reject处调用了一个a函数。我们看:

MIUI 12稳定版系统中的开发者选项限制解除  第18张

那么如果我们设置它参数为true,会怎么样呢?答案是会重启手机adbd,成功开启该选项,从而绕过25秒提示。

var SystemPropertiesCompat = Java.use('com.miui.permcenter.compact.SystemPropertiesCompat')
SystemPropertiesCompat.set.overload('java.lang.String', 'java.lang.String').implementation = function (a1, a2) {
    console.log('SystemPropertiesCompat', a1, a2)
    return this.set(a1, a2)
}
//由于该操作会断开frida与手机连接,此处做一个判断,若未开启(0)则设置为1开启该功能。
var adbinput = SystemPropertiesCompat.getInt('persist.security.adbinput', 0)
if (adbinput === 0) {
    console.log('persist.security.adbinput 开始设置')
    SystemPropertiesCompat.set('persist.security.adbinput', '1') //手机设置中成功开启
}
// 开启USB调试(安全设置)
// ss.set('persist.security.adbinput','1')

0x02 寻找解除是否继续安装限制

实际控制权限App:com.miui.securitycenter

过程摘要:还是在MIUI手机管家里。MIUI真厉害!

MIUI 12稳定版系统中的开发者选项限制解除  第19张

简单分析,拒绝和继续安装还是按钮。

直接从activity找相关执行函数:

MIUI 12稳定版系统中的开发者选项限制解除  第20张

可以看到,有一个arg3和arg4.

通过frida下log断点得出 当用户点击拒绝时arg4为-1,否则为-2.

我们看下a.a函数验证猜想:

MIUI 12稳定版系统中的开发者选项限制解除  第21张

果然,只有-2时参数arg3才是false,即allowed_pkg.

所以我们可以这样写:主动调用onClick(null,-2),然后finish()让窗口自己消失,这样就达到了不用点击全自动安装App不受限制的目的。

看代码:

var AdbInstallActivity = Java.use('com.miui.permcenter.install.AdbInstallActivity')
// 方法1 全自动版 自动运行后关闭
AdbInstallActivity.onCreate.overload('android.os.Bundle').implementation = function (arg){
    this.onCreate(arg) // 给他初始化的机会
    this.onClick(null, -2) //主动调用函数,-2与-1是同意和拒绝按钮
    this.finish() //自动同意后执行进程自杀
}
AdbInstallActivity.$init.overload().implementation = function () {
    this.$init();//执行完初始化函数后设置this.l的新值
    this.l.value = 999999
    console.log('构造函数', this.l.value)
}

// 方法2 手动点击版(似乎没有必要) 点击任意按钮即可继续运行
AdbInstallActivity.onClick.overload('android.content.DialogInterface', 'int').implementation = function (a1, a2) {
    // this.onClick(a1,a2);
    a2 = -2;
    this.onClick(a1, a2)
    console.log('onClick', a2)
}

0x03 结果

MIUI 12稳定版系统中的开发者选项限制解除  第22张

MIUI 12稳定版系统中的开发者选项限制解除  第23张

MIUI 12稳定版系统中的开发者选项限制解除  第24张

App也直接成功直接安装进入debugger模式。

忆笙

忆笙 主页 联系他吧

人间山河远阔,只想与你同行。

欢迎 发表评论: