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

使用Frida绕过MIUI 12系统设置倒计时

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

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

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

倒计时类型

主要有以下两种:

使用Frida绕过MIUI 12系统设置倒计时  第1张 使用Frida绕过MIUI 12系统设置倒计时  第2张

查看前台Activity:

adb shell dumpsys activity activities | findstr "mFocused"

可以发现两个对话框都来自手机管家,分别对应:

com.miui.permcenter.privacymanager.SpecialPermissionInterceptActivity

com.miui.permcenter.install.AdbInputApplyActivity

提取手机管家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$a的onClick方法:

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方法,替换其实现,直接调用a方法,传入true即可

Frida

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

Xposed

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;
    }
});

反射调用a方法即可

忆笙

忆笙 主页 联系他吧

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

欢迎 发表评论: