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

栏目: Android · 发布时间: 7年前

内容简介:今天看到网友的微信地区是一个魔法学院,微信的地区怎么可能是魔法学院呢,肯定是这位网友自己搞了一些黑科技,然后改的。他能改,我们也能改,二话不说就开干。 先来看看我的成果首先要知道微信的选择地区的页面在什么位置,然后我们再看对应代码。先保持在微信的选择地区页面。然后dump activity

今天看到网友的微信地区是一个魔法学院,微信的地区怎么可能是魔法学院呢,肯定是这位网友自己搞了一些黑科技,然后改的。他能改,我们也能改,二话不说就开干。 先来看看我的成果 Android逆向之路---Android逆向之路---让你的微信地区来自火星

需要运行环境

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

开始逆向,找到大致位置

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

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

首先利用命令

adb shell dumpsys activity
复制代码

从日志里面我们可以看到如下所示 重点在此

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 这个页面里面了。

我们需要分析微信的逻辑,随后hook他的方法。

分析微信代码

其实有一点我也很有疑问,微信的运行时内部的变量名字和方法名字,和我们静态分析的是不太对应的,对此暂时没有深入研究,如果有朋友知道的话可以提示我,欢迎一起探讨。

由于我上面所说的这个问题,所以采用利用Xposed hook 这个MultiStageCitySelectUI的onCreate方法,然后我们动态的在内存里分析。

hook onCreate代码如下

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类型。 然后打开结果如下

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

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

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

然后紧跟着,思路就是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这个对象的第一项就变成了我们篡改之后的值了。

下面展示效果 Android逆向之路---Android逆向之路---让你的微信地区来自火星


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Natural Language Processing with Python

Natural Language Processing with Python

Steven Bird、Ewan Klein、Edward Loper / O'Reilly Media / 2009-7-10 / USD 44.99

This book offers a highly accessible introduction to Natural Language Processing, the field that underpins a variety of language technologies, ranging from predictive text and email filtering to autom......一起来看看 《Natural Language Processing with Python》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具