吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7888|回复: 38
收起左侧

[Android 原创] 使用Frida绕过MIUI 12系统设置倒计时

[复制链接]
XhyEax 发表于 2021-10-2 13:45
本帖最后由 XhyEax 于 2022-5-11 18:36 编辑

项目地址

完整项目见MIUICustom

注意:该模块仅测试于手机管家 5.4.05.6.0,其他版本未测试。

如果模块未生效,可自行反编译apk,查找并替换Hook点,自行编译Xposed模块。

概述

每次修改系统设置(设置通知使用权、允许app安装未知应用、开启无障碍功能等),都会有10秒倒计时,使用起来很不方便。

于是考虑使用Frida绕过倒计时,并开发Xposed模块。

倒计时类型

主要有以下两种:

查看前台Activity:

adb shell dumpsys activity activities | findstr "mFocused"

可以发现两个对话框都来自手机管家,分别对应:
com.miui.permcenter.privacymanager.SpecialPermissionInterceptActivity
com.miui.permcenter.install.AdbInputApplyActivity

后者已经有分析文章了,见MIUI 12稳定版系统中的开发者选项限制解除
也可以直接改配置文件,见需root,无需xp和frida,miui开发者选项限制解除

5.6.0 Hook点

com.miui.permcenter.privacymanager.fn函数,主动调用d函数。

快速定位

搜索SpecialPermissionInterceptActivity类,定位到判断函数(开头调用getStringExtra("permName"))。

protected void r() {
    int v0 = d.a(((Activity)this).getIntent().getStringExtra("permName"));
    if(v0 == -1) {
        ((Activity)this).finish();
    }

    t v1 = this.getSupportFragmentManager().b();
    g v0_1 = d.c(v0) ? g.a(((Activity)this).getIntent()) : h.a(((Activity)this).getIntent());
    v1.b(0x1020002, v0_1);
    v1.b();
}

进入三元运算符的返回值类g v0_1,查看其父类f,搜索setOnClickListener,该函数即为Hook点(n

public void n() {
    Button v0 = this.btnConfirm;
    if(v0 != null) {
        v0.setOnClickListener(this.e);
    }

    Button v0_1 = this.c;
    if(v0_1 != null) {
        v0_1.setOnClickListener(this.e);
    }
}

查看this.e的实现代码,即可找到主动调用函数名(d

    @Override  // android.view.View$OnClickListener
    public void onClick(View arg3) {
        boolean v0;
        f v3;
        if(arg3.getId() == 0x7F0B041A) {
            v3 = this.a;
            v0 = true;
            v3.d(v0);
            return;
        }

        if(arg3.getId() == 0x7F0B041E) {
            v3 = this.a;
            v0 = false;
            v3.d(v0);
            return;
        }

        this.a.h(arg3.getId());
    }

Frida脚本

Java.perform(function () {
    Java.use("com.miui.permcenter.privacymanager.f").n.overload()
        .implementation = function () {
            this.d(true);
        };
})

分析5.4.0

/system/priv-app/SecurityCenter/提取手机管家apk(版本号5.4.0),使用JEB打开,定位到该Activity:

protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        Window window = this.getWindow();
        window.setBackgroundDrawable(new ColorDrawable(this.getResources().getColor(0x7F060599)));
        window.setLayout(-1, -1);
        window.addFlags(4);
        this.a();
        this.b();
    }

其他函数

a函数反射调用setNavigationBarColor,设置导航栏颜色
b函数根据permName的值,显示不同的窗口(-1则直接退出):

private void b() {
    int permName = c.a(this.getIntent().getStringExtra("permName"));
    if(permName == -1) {
        this.finish();
    }

    FragmentTransaction fragmentTransaction = this.getFragmentManager().beginTransaction();
    e fragment = c.gt5(permName) ? e.a(this.getIntent()) : f.a(this.getIntent());
    fragmentTransaction.replace(0x1020002, ((Fragment)fragment));
    fragmentTransaction.commitAllowingStateLoss();
}

查看com.miui.permcenter.privacymanager.m.c类,其中包含权限数组:

c.d = Arrays.asList(new String[]{"perm_notification", "perm_install_unknown", "perm_app_statistics", "perm_device_manager", "miui_open_debug", "miui_barrier_free", "miui_close_optimization", "oaid_close"});

可得到以下对应关系:

permName 功能
0 通知使用权
1 安装未知应用
2 使用情况访问权限
3 设备管理应用
4 打开USB调试模式
5 无障碍功能
6 关闭MIUI优化
7 开启OEM解锁

核心函数

查看f.a函数:

public static f a(Intent intent) {
    f fragment = new f();
    Bundle bundle = new Bundle();
    if(intent != null) {
        bundle.putString("permName", intent.getStringExtra("permName"));
    }

    fragment.setArguments(bundle);
    return fragment;
}

f类继承自d类,且在c函数中设置了按钮的OnClickListener

protected View.OnClickListener e;

public d() {
    this.e = new d.a(this);
}

public void c() {
    Button btnConfirm = this.b;
    if(btnConfirm != null) {
        btnConfirm.setOnClickListener(this.e);
    }

    Button btnCancel = this.c;
    if(btnCancel != null) {
        btnCancel.setOnClickListener(this.e);
    }
}

查看com.miui.permcenter.privacymanager.d$aonClick函数:

public void onClick(View view) {
    boolean v0;
    d fragment;
    if(view.getId() == 0x7F0B03F9) {
        fragment = this.a;
        v0 = true;
        fragment.a(v0);
        return;
    }

    if(view.getId() == 0x7F0B03FD) {
        fragment = this.a;
        v0 = false;
        fragment.a(v0);
        return;
    }

    this.a.b(view.getId());
}

判断点击的按钮是确认还是取消,最终调用a函数,确认传入true,取消传入false

public void a(boolean flag) {
    this.getActivity().setResult(flag ? -1 : 0);
    this.getActivity().finish();
}

绕过

Hook com.miui.permcenter.privacymanager.d.c函数(即设置OnClickListener的函数),替换其实现,直接调用a函数,传入true即可

Frida

Java.perform(function () {
    Java.use("com.miui.permcenter.privacymanager.d").c.overload()
        .implementation = function () {
            this.a(true);
        };
})

Xposed

反射调用a函数即可

findAndHookMethod("com.miui.permcenter.privacymanager.d", lpparam.classLoader, "c", new XC_MethodReplacement() {
    @Override
    protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
        Method mtdA = param.thisObject.getClass().getDeclaredMethod("a", boolean.class);
        mtdA.invoke(param.thisObject, true);
        return null;
    }
});

参考

MIUI9绕开联网和插卡打开未知来源

免费评分

参与人数 13吾爱币 +20 热心值 +13 收起 理由
qtfreet00 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
cc66528 + 1 + 1 我很赞同!
独行风云 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lu_ + 3 + 1 我很赞同!
zjtaigame + 1 用心讨论,共获提升!
7Rad7 + 1 + 1 热心回复!
glz220 + 1 我很赞同!
笙若 + 1 + 1 谢谢@Thanks!
小兴818 + 2 + 1 太巧了!正好我正准备找这个!感谢感谢!
635217113 + 1 + 1 我很赞同!
wujinzhanyi + 1 + 1 热心回复!
cjcmxc + 1 + 1 我很赞同!
yi025 + 1 + 1 好帖,楼主辛苦了

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

xinziwenqing 发表于 2021-10-2 23:30
XhyEax 发表于 2021-10-2 14:54
使用Magisk获取root权限后,安装Riru和Xposed框架(如LSPosed)。

对手机管家启用模块,重启手机管家 ...

我用的上 xiaomi.eu_multi_HMK40_POCOF3_21.9.15_v12-11表示用不了。。。
手机管家启用,系统重启也是倒数十秒
加多框架安全核心组件也是一样

微信图片_20211002232702.jpg 微信图片_20211002232910.jpg
 楼主| XhyEax 发表于 2021-10-2 14:54
xinziwenqing 发表于 2021-10-2 14:26
请问,怎么用,我也希望跳过这烦人的倒计时,MIUI烦操作的做法我很是厌恶

使用Magisk获取root权限后,安装Riru和Xposed框架(如LSPosed)。

对手机管家启用模块,重启手机管家即可。

由于论坛不能提供成品,请前往Github下载。
SUDaBaiCai 发表于 2021-10-2 14:10
xinziwenqing 发表于 2021-10-2 14:26
请问,怎么用,我也希望跳过这烦人的倒计时,MIUI烦操作的做法我很是厌恶
skyadmin 发表于 2021-10-2 15:00
貌似有模快
dph5199278 发表于 2021-10-2 15:45
谢谢分享
老婆是加藤惠 发表于 2021-10-2 16:37
MIUI这点确实烦
Kae1249 发表于 2021-10-2 17:01
这个功能好,每次要等10秒钟好烦
小丑恶人 发表于 2021-10-2 17:07
小米用户,有点意思
笨鸟不一定先飞 发表于 2021-10-2 17:44
学到了,感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 13:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表