Android逆向之路—Android逆向之路—讓你的微信地區來自火星

MartinHan發表於2019-03-04

前言

今天看到網友的微信地區是一個魔法學院,微信的地區怎麼可能是魔法學院呢,肯定是這位網友自己搞了一些黑科技,然後改的。他能改,我們也能改,二話不說就開幹。
先來看看我的成果
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逆向之路—讓你的微信地區來自火星

大功告成

然後選擇我們篡改的第一項,哈利波特魔法學校,然後你的地區就會改變啦。

有沒有感覺很神奇呢。

ps:改完之後ios裝置無法看到你的地區,可能由於ios客戶端判斷的問題。

原始碼地址

要不要star一下呢

github地址,點我點我

寫在最後

偶爾聊聊逆向,偶爾聊聊生活,做一個很懶的博主就是本人了。

歡迎吐槽。

關於我

個人網站:MartinHan的小站

部落格:hanhan12312的專欄

知乎:MartinHan01

相關文章