内容简介:今天看到网友的微信地区是一个魔法学院,微信的地区怎么可能是魔法学院呢,肯定是这位网友自己搞了一些黑科技,然后改的。他能改,我们也能改,二话不说就开干。 先来看看我的成果首先要知道微信的选择地区的页面在什么位置,然后我们再看对应代码。先保持在微信的选择地区页面。然后dump activity
今天看到网友的微信地区是一个魔法学院,微信的地区怎么可能是魔法学院呢,肯定是这位网友自己搞了一些黑科技,然后改的。他能改,我们也能改,二话不说就开干。 先来看看我的成果
需要运行环境
- 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类型。 然后打开结果如下
这个图片正好对应我们手机里的第三项,
这也就说明其实这个列表有很大可能性就是我们需要篡改的列表了。
然后紧跟着,思路就是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这个对象的第一项就变成了我们篡改之后的值了。
下面展示效果
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- CNN网络可以更高效地区
- 中国香港地区DDoS-botnet态势分析
- 某疑似针对中东地区的APT攻击事件分析
- 黑狮行动:针对西班牙语地区的攻击活动分析
- 攻击巴西和台湾地区的无文件银行木马分析
- 一线|谷歌TensorFlow中国地区下载量已超200万
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。