Android逆向之路---Android逆向之路---让你的微信地区来自火星

前言

今天看到网友的微信地区是一个魔法学院,微信的地区怎么多是魔法学院呢,确定是这位网友本身搞了一些黑科技,而后改的。他能改,咱们也能改,二话不说就开干。 先来看看个人成果 java

须要运行环境

  • xposed环境
  • root过的android手机
  • 微信最新版,我用的是6.7.3

开始逆向,找到大体位置

首先要知道微信的选择地区的页面在什么位置,而后咱们再看对应代码。android

先保持在微信的选择地区页面。而后dump activityios

首先利用命令git

adb shell dumpsys activity
复制代码

从日志里面咱们能够看到以下所示 重点在此github

Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.tencent.mm/.ui.LauncherUI bnds=[816,1041][996,1221] (has extras) }

        Hist #3: ActivityRecord{2152aef u0 com.tencent.mm/.ui.tools.MultiStageCitySelectUI t266}

          Intent { cmp=com.tencent.mm/.ui.tools.MultiStageCitySelectUI }

          ProcessRecord{a2337f6 1215:com.tencent.mm/u0a82}

        Hist #2: ActivityRecord{e722872 u0 com.tencent.mm/.plugin.setting.ui.setting.SettingsPersonalMoreUI t266}

          Intent { cmp=com.tencent.mm/.plugin.setting.ui.setting.SettingsPersonalMoreUI }

          ProcessRecord{a2337f6 1215:com.tencent.mm/u0a82}

        Hist #1: ActivityRecord{4e7fec5 u0 com.tencent.mm/.plugin.setting.ui.setting.SettingsPersonalInfoUI t266}

          Intent { cmp=com.tencent.mm/.plugin.setting.ui.setting.SettingsPersonalInfoUI }

          ProcessRecord{a2337f6 1215:com.tencent.mm/u0a82}

        Hist #0: ActivityRecord{5cb9f3a u0 com.tencent.mm/.ui.LauncherUI t266}

          Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.tencent.mm/.ui.LauncherUI bnds=[816,1041][996,1221] (has extras) }

          ProcessRecord{a2337f6 1215:com.tencent.mm/u0a82}
复制代码

看到了吧,重点就是在com.tencent.mm.ui.tools.MultiStageCitySelectUI这个页面里面了。shell

咱们须要分析微信的逻辑,随后hook他的方法。bash

分析微信代码

其实有一点我也颇有疑问,微信的运行时内部的变量名字和方法名字,和咱们静态分析的是不太对应的,对此暂时没有深刻研究,若是有朋友知道的话能够提示我,欢迎一块儿探讨。微信

因为我上面所说的这个问题,因此采用利用Xposed hook 这个MultiStageCitySelectUI的onCreate方法,而后咱们动态的在内存里分析。网站

hook onCreate代码以下ui

XposedHelpers.findAndHookMethod("com.tencent.mm.ui.tools.MultiStageCitySelectUI", classLoader, "onCreate", new Object[]{Bundle.class, new XC_MethodHook() {
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    super.beforeHookedMethod(param);
                    XposedBridge.log("MartinHan_xposed: wx success MultiStageCitySelectUI onCreate beforeHookedMethod");
                }

                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                    XposedBridge.log("MartinHan_xposed: wx success MultiStageCitySelectUI afterHookedMethod");
                    Class mscsu = XposedHelpers.findClass("com.tencent.mm.ui.tools.MultiStageCitySelectUI", classLoader);
                    Method[] methods = param.thisObject.getClass().getMethods();
                    List<Method> myMethods = new ArrayList();
                    for (Method item : methods) {
                        if (item.getDeclaringClass().equals(mscsu)) {
                            myMethods.add(item);
                        }
                    }
                }
复制代码

如代码所示,咱们还将属于MultiStageCitySelectUI类自己的方法筛选了出来,防盗了myMethods里面,方便于咱们分析。

打断打上,运行时分析。

而后看运行时的成员变量,根据软件开发的经验,确定有一个数据源,存着全部的地区列表。

忽然发现有一个wdN的变量,他的类型是RegionCodeDecoder$Region。

这个的意思就是这个变量的类型是RegionCodeDecoder的子类Region类型。 而后打开结果以下

这个图片正好对应咱们手机里的第三项,

这也就说明其实这个列表有很大可能性就是咱们须要篡改的列表了。

而后紧跟着,思路就是hook 初始化这个变量的方法,而后在调用完成以后,再放入咱们本身自定义的地区。

代码以下:

XposedHelpers.findAndHookMethod("com.tencent.mm.ui.tools.MultiStageCitySelectUI", classLoader, "cJa", new Object[]{new XC_MethodHook() {
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    super.beforeHookedMethod(param);
                    XposedBridge.log("MartinHan_xposed: wx success MultiStageCitySelectUI cJa beforeHookedMethod");
                }

                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                    XposedBridge.log("MartinHan_xposed: wx success MultiStageCitySelectUI cJa afterHookedMethod");
                    Object wdnObj = XposedHelpers.findField(XposedHelpers.findClass("com.tencent.mm.ui.tools.MultiStageCitySelectUI", classLoader), "wdN").get(param.thisObject);
                    Class regionClazz = XposedHelpers.findClass("com.tencent.mm.storage.RegionCodeDecoder$Region", classLoader);
                    Field codeField = XposedHelpers.findField(regionClazz, "code");
                    Field nameField = XposedHelpers.findField(regionClazz, "name");
                    Object arrayHarryporrt = Array.get(wdnObj, 0);
                    codeField.set(arrayHarryporrt, "哈利波特魔法学校");
                    nameField.set(arrayHarryporrt, "哈利波特魔法学校");
                    Array.set(wdnObj, 0, arrayHarryporrt);
                }
            }});
复制代码

咱们修改了Region对象的code和name。 这样wdN这个对象的第一项就变成了咱们篡改以后的值了。

下面展现效果

大功告成

而后选择咱们篡改的第一项,哈利波特魔法学校,而后你的地区就会改变啦。

有没有感受很神奇呢。

ps:改完以后ios设备没法看到你的地区,可能因为ios客户端判断的问题。

源码地址

要不要star一下呢

github地址,点我点我

写在最后

偶尔聊聊逆向,偶尔聊聊生活,作一个很懒的博主就是本人了。

欢迎吐槽。

关于我

我的网站:MartinHan的小站

博客:hanhan12312的专栏

知乎:MartinHan01

相关文章
相关标签/搜索