今天看到网友的微信地区是一个魔法学院,微信的地区怎么可能是魔法学院呢,肯定是这位网友自己搞了一些黑科技,然后改的。他能改,我们也能改,二话不说就开干。 先来看看我的成果
#git地址github地址,点我点我
首先要知道微信的选择地区的页面在什么位置,然后我们再看对应代码。
先保持在微信的选择地区页面。然后dump activity
首先利用命令
从日志里面我们可以看到如下所示 重点在此
看到了吧,重点就是在com.tencent.mm.ui.tools.MultiStageCitySelectUI
这个页面里面了。
我们需要分析微信的逻辑,随后hook他的方法。
其实有一点我也很有疑问,微信的运行时内部的变量名字和方法名字,和我们静态分析的是不太对应的,对此暂时没有深入研究,如果有朋友知道的话可以提示我,欢迎一起探讨。
由于我上面所说的这个问题,所以采用利用Xposed hook 这个MultiStageCitySelectUI的onCreate方法,然后我们动态的在内存里分析。
hook onCreate代码如下
如代码所示,我们还将属于MultiStageCitySelectUI类本身的方法筛选了出来,防盗了myMethods里面,方便于我们分析。
打上断点,运行时分析。
然后看运行时的成员变量,根据软件开发的经验,肯定有一个数据源,存着所有的地区列表。
突然发现有一个wdN的变量,他的类型是RegionCodeDecoder$Region。
这个的意思就是这个变量的类型是RegionCodeDecoder的子类Region类型。 然后打开结果如下
这个图片正好对应我们手机里的第三项,
这也就说明其实这个列表有很大可能性就是我们需要篡改的列表了。
然后紧跟着,思路就是hook 初始化这个变量的方法,然后在调用完成之后,再放入我们自己自定义的地区。
代码如下:
我们修改了Region对象的code和name。 这样wdnObj这个对象的第一项就变成了我们篡改之后的值了。 并且要设置hasChildren为false,这样不会有二级选择,这个是微信8.0更新以后新加入的字段
下面展示效果
然后选择我们篡改的第一项,哈利波特魔法学校,然后你的地区就会改变啦。
有没有感觉很神奇呢。
ps:改完之后ios设备无法看到你的地区,可能由于ios客户端判断的问题。
要不要star一下呢
github地址,点我点我
偶尔聊聊逆向,偶尔聊聊生活,做一个很懒的博主就是本人了。
欢迎吐槽。
个人网站:MartinHan的小站
知乎:MartinHan01
adb shell dumpsys 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
Intent {
cmp
=
com.tencent.mm
/
.ui.tools.MultiStageCitySelectUI }
ProcessRecord{a2337f6
1215
:com.tencent.mm
/
u0a82}
Hist
Intent {
cmp
=
com.tencent.mm
/
.plugin.setting.ui.setting.SettingsPersonalMoreUI }
ProcessRecord{a2337f6
1215
:com.tencent.mm
/
u0a82}
Hist
Intent {
cmp
=
com.tencent.mm
/
.plugin.setting.ui.setting.SettingsPersonalInfoUI }
ProcessRecord{a2337f6
1215
:com.tencent.mm
/
u0a82}
Hist
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}
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
Intent {
cmp
=
com.tencent.mm
/
.ui.tools.MultiStageCitySelectUI }
ProcessRecord{a2337f6
1215
:com.tencent.mm
/
u0a82}
Hist
Intent {
cmp
=
com.tencent.mm
/
.plugin.setting.ui.setting.SettingsPersonalMoreUI }
ProcessRecord{a2337f6
1215
:com.tencent.mm
/
u0a82}
Hist
Intent {
cmp
=
com.tencent.mm
/
.plugin.setting.ui.setting.SettingsPersonalInfoUI }
ProcessRecord{a2337f6
1215
:com.tencent.mm
/
u0a82}
Hist
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}
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);
}
}
}
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);
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-6-5 02:52
被风月缘编辑
,原因: