前言
這一篇,用到找偏移的第三個方法:日志;第四個方法:字符串;第五個方法:系統函數;第六個方法:第三方庫。目標是收發文本消息。
一、發送消息
分析
1、發送信息的一般流程
1、界面上編輯消息
2、點擊發送按鈕
3、消息存入數據庫
4、通過網絡發送出去
2、可以切入的點
1、界面
2、數據庫
3、網絡發送函數
3、入手方式
界面入手,得跟蹤Duilib的響應過程
數據庫入手,得監聽數據庫Sqlite的函數
網絡函數入手,數據依據加密了,難識別出來
數據從產生到發送,中間會有比較長的過程。
看下日志有沒有可以參考的信息。
Xlog
WX的日志模塊是第三方庫:Xlog。
關於Xlog的介紹和分析,后續會分享了《微信日志Xlog分析——帶源碼》。
注入打開日志的dll

隨便操作界面,就有日志輸出
發送一個文本信息
日志看到了關鍵詞On MsgAdd PrefixId,和 sendTextMsg。

用OD搜索字符串,發現沒有sendTextMsg,但是有On MsgAdd PrefixId,進行斷點。
觸發斷點
函數調用的關系有兩種
1、函數A調用函數B,函數B調用函數C(一條線)
2、函數A調用函數B,函數A調用函數C(分叉開)
點擊發送按鈕,WX會收到操作信息,部分信息給Duilib處理,部分信息給系統自帶的函數處理:ntdll.NtdllDefWindowProc_W。
堆棧里面往下翻,發現有這個函數。意味着這個斷點的位置,和發送消息函數的調用的關系是一條線的。也就是說,在堆棧就能找到發送消息的函數。

找函數
問題來了,堆棧這么多函數,到底哪一個呢?
一般發送消息函數的格式是:發送消息函數(參數:接收人,參數:發送的消息)
函數的調用約定有多種情況 __fastcall __stdcall __cdecl __thiscall。
這就意味這發送消息函數至少需要兩個參數.
但不一定都在堆棧,可能在ecx或者edx。
從斷點往回找,看有沒有滿足條件的。
1、第一個函數,堆棧沒有關鍵的參數,函數也沒用到ecx和edx,排除。

2、第二個函數,堆棧有發送的消息;兩個參數,其中一個是0,函數也沒用到ecx和edx,排除

3、第三個函數,堆棧有接收人;三個參數,沒有發送的消息,函數也沒用到ecx和edx,排除

4、第四個函數,堆棧有發送的消息;用到ecx和edx,加上3個push,總共五個參數,斷點看下

可以看到這里的參數是齊全的。

但是參數1未知,[ebp-0x738]是函數內一個變量,清空后發現能發送信息,可以直接偽造

修改發送的內容,驗證下
1、發送老的信息 oldmsg

2、od里看下攔截的數據也是oldmsg

3、修改成newmsg

4、最終發送的是newmsg,這里就是我們要找的發送信息函數

算偏移
基址 :5A090000
Executable modules, 條目 8
基址=5A090000
大小=01946000 (26501120.)
入口=5ADE4A63 WeChatWi.<ModuleEntryPoint>
名稱=WeChatWi
文件版本=2.9.0.123
路徑=C:\Program Files (x86)\Tencent\WeChat\WeChatWin.dll
源碼
5A17CA91 6A 01 push 0x1 ; 參數5:1
5A17CA93 8D43 34 lea eax,dword ptr ds:[ebx+0x34]
5A17CA96 50 push eax ; 參數4:空結構
5A17CA97 53 push ebx ; 參數3:發送的消息
5A17CA98 8D55 9C lea edx,dword ptr ss:[ebp-0x64] ; 參數2:接收人
5A17CA9B 8D8D C8F8FFFF lea ecx,dword ptr ss:[ebp-0x738] ; 參數1:未知 可置空
5A17CAA1 E8 AAFF2500 call WeChatWi.5A3DCA50 ; 發送文本消息函數
5A17CAA6 83C4 0C add esp,0xC ;平衡堆棧用
參數
eax
13EF5AA8 00000000
13EF5AAC 00000000
13EF5AB0 00000000
13EF5AB4 00000000
ebx
13EF5A74 13FB51E0 UNICODE "發送文本消息"
13EF5A78 00000006
13EF5A7C 00000008
13EF5A80 00000000
13EF5A84 00000000
ecx
空buffer:char buffer[0x738] = {0};
edx
0096EF00 13CA0610 UNICODE "filehelper"
0096EF04 0000000A
0096EF08 00000010
0096EF0C 00000000
0096EF10 00000000
偏移 = 內存地址 - 基址
發送文本消息函數 5A3DCA50 - 5A090000 = 34CA50
寫代碼
參數結構

構造參數

調用函數

二、接收消息
當WX收到消息時,也會在On MsgAdd PrefixId處觸發斷點。

跳轉到ebp(ebp相對比較穩定)

雙擊ebp所在的行,地址這一列顯示的是相對地址。
發送者 : ebp-0x220
$-220 > 13BD3EC0 UNICODE "filehelper"
發送的消息:ebp -0x1F8
$-1F8 > 13C0C380 UNICODE "手機發送的消息"
攔截需要至少五個字節,這里剛好五個(68 C0 03 49 5B)
5A3B9743 68 C003495B push WeChatWi.5B4903C0 ; UNICODE "On MsgAdd PrefixId : %I64d RealId : %I64d, SvrId :"
算偏移
基址:5A090000
Executable modules, 條目 8
基址=5A090000
大小=01946000 (26501120.)
入口=5ADE4A63 WeChatWi.<ModuleEntryPoint>
名稱=WeChatWi
文件版本=2.9.0.123
路徑=C:\Program Files (x86)\Tencent\WeChat\WeChatWin.dll
偏移 = 內存地址 - 基址
接收消息hook位置 5A3B9743 - 5A090000 = 329743
被覆蓋的數據偏移 5B4903C0 - 5A090000 = 14003C0
寫代碼