EMO的WEB开发技术日记 - 破解
type: channel
link: /tag/破解/
items: 记利用Xposed解除华为EMUI第三方桌面限制

记利用Xposed解除华为EMUI第三方桌面限制
type: item
link: /%E5%8E%9F%E5%89%B5-99.html
date: 2019-08-05T16:04:00+08:00
description: 自从入了魅族魅蓝E3的坑，等了一年也没等到BootLoader解锁的方法，也受够了那个没几秒就一次的WiFi断流。苦苦寻觅，终于找到价格在2k上下，性能过得去，非异形屏，非背面指纹，拍照还可以，最重要一点，可以解锁BootLoader，可以装xposed的机子 -- 二手 华为 Mate 10。机子到手随即在深水宝让人给解锁BootLoader了，开启了Magisk->Root->Xposed的折腾之路。或许是距离我太久没碰过华为手机了（上一台华为手机还是C8850），发现刷入Magisk，安装Xposed的方法跟其他机型有很大区别，爬文了解了之后，算是把Magisk+Root+Xposed搞定了。装上最熟悉的Nova Launcher却发现不能设置为默认桌面，华为什么脑残设定嘛！心想祭出冰箱冻结就好了，没想到事情却没这么简单，使用冰箱添加支付宝扫码快捷方式后，发现没有任何反应，冰箱的快捷方式权限已经给了啊!再去论坛爬文，发现还是华为脑残设定。。。这下子没这么好办了，冰箱管不到这块了。爬文良久没找到解决办法，只能硬着头皮自己来了。既然默认应用设置把第三方桌面灰了不让我点，那就从这里入手，用开发者助手找出这里的资源ID，包名，将系统设置的apk传到Mac上JEB静态反编译走起。拿着0x7f0a07a8就到JEB去搜索，找到位于com.android.settings.applications.PreferredSettings这个类的onCreateView方法里，但是这个方法看不出什么有价值的线索，JEB字体太小，看的眼睛都疼了，还是把dex拉出来，用jadx直接把dex还原成Java源文件吧。庆幸的是，这些代码并没有做混淆，还原成Java源文件后，方法名和变量名都是原始命名，这样看起来就容易多了。用IntelliJ IDEA打开源码看，舒服多了，翻翻这个类，发现PreferredSettings.buildPreferredActivitiesList这个方法有点嫌疑，build什么List，可惜jadx反编译失败了，还是要回到jeb去看。Jeb反编译也不算很好，出来一堆goto,耐着性子找亮点。发现这有重大嫌疑，Anti?Protection?Launcher?进去看看呗！在这个类里，看到了华为桌面的包名com.huawei.android.launcher了，先写个hook，把AntiMalProtectionUtils.checkLauncherPermisson始终返回true试试！XposedBridge.hookAllMethods(loadPackageParam.classLoader.loadClass("com.android.settings.AntiMalProtectionUtils"), "checkLauncherPermisson", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { param.setResult(true); } });重启一看，红色提示文字消失了，第三方桌面可以选择了，但是应用快捷方式还是添加不了，常规返回Home时，还是回到的华为桌面。难道跟AntiMalProtectionUtils.getHwDefLauncherPkg这个方法有关?public static String getHwDefLauncherPkg() { return "com.huawei.android.launcher"; }改成返回Nova桌面的包名试试？XposedBridge.hookAllMethods(loadPackageParam.classLoader.loadClass("com.android.settings.AntiMalProtectionUtils"), "getHwDefLauncherPkg", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { param.setResult("com.teslacoilsw.launcher"); } });结果还是不行，再仔细看AntiMalProtectionUtils.checkLauncherPermisson这个方法，按照它的正常流程走的话，ActivityManager.checkUidPermission应该要返回0,那就hook这个方法试试吧！XposedBridge.hookAllM…