首先本文的測試微信版本是7.0.3 ,親測可以使用。
需要實現-抓取微信自動回覆消息的功能點。
一.首先打開DDMS,使用按鈕。
在微信中回覆一個消息
點擊Stop Method Profiling。
二.查看生成的報表,觀察到如下兩個方法
其中1應該是發送消息的接口方法。2應該是UI層顯示的方法。
三.首先分析第一個方法:
1.,可以看到,參數值是String,返回值是Boolean(Z表示boolean),這裏測試hook一下該函數。
2.測試結果:
可以看到成功hook到了,說明發送消息是調用的該方法。
3.然後如果需要調用該方法,首先需要獲得該方法的實例,並去調用,然後還需要獲取到具體消息指向的發送者。
那麼這裏需要對源碼進行分析。
找到Pg方法
調用了apl方法,這裏傳入了str,繼續往下分析可以看到調用了這個方法:
可以看到這個ex方法應該是具體的發送消息的方法:
其中調用了
setContent方法即爲具體的設置方法,
可以看到該類cx就是消息的包裝類:
這裏通過id參數入手,field_talkerId,hook使用到該id的方法,打印堆棧信息:
com.tencent.mm.g.c.cx.hm
Class clz = XposedHelpers.findClass("com.tencent.mm.g.c.cx", lpparam.classLoader);
XposedHelpers.findAndHookMethod(clz, "hm", int.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
LogUtil.d("打印調用堆棧開始...");
LogUtil.logStackTraces();
LogUtil.d("打印調用堆棧結束...");
}
});
測試輸出結果:
進入該方法:
這裏hook測試了一下,我發現原來field_talker纔是真正的微信id, field_talkerId並沒有用到。
所以整個hook的關鍵點方法都已經找到了:
1. com.tencent.mm.ui.chatting.p.Pg(String str) 方法,參數就是消息內容,可以發送消息,但是無法設置接受者id
2. com.tencent.mm.modelmulti.h(String str, String str2, int i, int i2, Object obj) 構造方法,第一個參數是接收者的微信id,第二個參數是內容。
自動回覆的思路:
首先獲得發送者的id,並保存下來,然後調用hook上面第一個方法發送消息,hook第二個方法修改微信id,實現收到消息立刻自動回覆。
四:難點:調用發送接口進行發送:
1.回到之前分析的具體發送的方法,結合消息體用到的地方,可以觀察到:
這裏最終是調用了這個a方法,拼接參數進行發送的。a方法內部:
可以看到兩個參數,第一個就是消息體封裝類。
最後按步驟調用
測試結果,大功告成: