Android小黑科技---来自火星的你

作者: df556ada620a | 来源:发表于2018-12-10 21:26 被阅读43次

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

    需要运行环境

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

    开始逆向,找到大致位置

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

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

    首先利用命令

    <pre style="margin: 0px; padding: 0px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; font-size: 18px; line-height: inherit; font-family: inherit; vertical-align: baseline; word-break: break-word; color: rgb(93, 93, 93); letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">

    adb shell dumpsys activity
    
    

    </pre>

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

    <pre style="margin: 0px; padding: 0px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; font-size: 18px; line-height: inherit; font-family: inherit; vertical-align: baseline; word-break: break-word; color: rgb(93, 93, 93); letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">

    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}
    
    

    </pre>

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

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

    分析微信代码

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

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

    hook onCreate代码如下

    <pre style="margin: 0px; padding: 0px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; font-size: 18px; line-height: inherit; font-family: inherit; vertical-align: baseline; word-break: break-word; color: rgb(93, 93, 93); letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">

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

    </pre>

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

    打断打上,运行时分析。

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

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

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

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

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

    然后紧跟着,思路就是hook 初始化这个变量的方法,然后在调用完成之后,再放入我们自己自定义的地区。

    代码如下:

    <pre style="margin: 0px; padding: 0px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; font-size: 18px; line-height: inherit; font-family: inherit; vertical-align: baseline; word-break: break-word; color: rgb(93, 93, 93); letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">

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

    </pre>

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

    下面展示效果

    大功告成

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

    有没有感觉好玩儿呢。

    ps:改完之后ios设备无法看到你的地区,可能由于ios客户端判断的问题。

    赶紧动手试试吧,喜欢可以点个关注哦,记得随手转发让火星移民同胞更多吧哈哈~

    相关文章

      网友评论

        本文标题:Android小黑科技---来自火星的你

        本文链接:https://www.haomeiwen.com/subject/arxjhqtx.html