前言
聊下函數的調用關係是分叉的,應該怎麼分析。目的是內存直接讀取通訊錄。
分析
- 通訊錄,是數據。
- 全局數據直接讀取,局部數據間接攔截。
- 通訊錄要經常用到,寫成全局數據,方便讀取。
- 看著和個人信息一樣,是全局數據,內存裡直接搜索。
- 但用什麼搜索呢?並沒有一個明確的數據可以代表通訊錄。
- 一般說,通訊錄裡面有很多好友信息,要獲取某個好友信息,在裡面搜索。
- 也就是說,通訊錄可以是一個數組,鏈表,或者一棵樹,而這個集合的開頭寫成全局數據。
切入點
從獲取某個好友的信息入手。
要獲取某個好友信息,得在通訊錄裡面搜索。
順藤摸瓜,知道獲取單個人的信息,就知道通訊錄的了。
依然是從日誌入手,看下有什麼線索。
日誌
和上一篇一樣,注入打開日誌模塊的插件,點擊通訊錄某個好友,看看日誌有什麼。
有一個字符串:NetSceneBatchGetContact,表示通過網絡獲取聯繫人的信息。
對字符串進行下斷點:NetSceneBatchGetContact
點擊通訊錄某個好友的頭像,觸發到斷點
堆棧往下翻,發現這裡已經有好友的多個信息
已經有信息,還需要網絡獲取,意味著本地存儲了一些基本信息,然後還需要去網絡獲取。
可以猜測,WX獲取好友信息的函數大概是
獲取好友信息(參數:好友ID)
調用函數:獲取好友本地信息
如果消息不全
調用函數:通過網絡獲取
而我們現在斷點到的是:通過網絡獲取,要找的函數是:獲取好友本地信息。也就是遇到的是分叉情況,獲取好友本地信息這個函數不在堆棧裡面。
所以要回到分叉點,也就是已經有基本信息的函數里面,從函數頭開始分析。
分析
1、返回分叉的地方(已經有好友的基本信息)
2、往上翻翻代碼,到函數的頭部,定下斷點
前兩個函數都沒有wxid,直到第三個才有
但這個函數里面只是對數據處理,沒有調用別的函數,排除掉
接下來的兩個函數和剛才的一樣,也排除掉
接下來的函數還是沒有微信ID,到了第二個才有。
3、F7進入函數,F8單步執行,到這個函數,才有微信ID
函數里面是拿到一個寫死的全局變量 0x10995060
執行結果eax,又給下一個函數使用:mov ecx,eax
4、跟蹤進去下一個函數,裡面有很多字符串和jnz,這裡應該是對微信ID的過濾
跳過字符串,到這個函數又有微信ID,但執行完這個函數,只是把微信ID傳入堆棧。
5、繼續F7進入下一個的函數,到這裡又有微信ID
6、再進入這個函數,注意這裡有個je是向上的,意味著是一個循環
單步進行分析,確實是在對通訊錄進行遍歷,並且通訊錄是一個先序排列的二叉樹。
在前面有一個全局變量,跟蹤這個數據的傳遞過程
(中間重啟過,基址變了,全局變量不一樣)
5A279D03 A1 6050615B mov eax,dword ptr ds:[0x5B615060]
5A279D08 83C0 28 add eax,0x28
5A22E5FD 8BC8 mov ecx,eax
5A4026AB 8BD9 mov ebx,ecx
5A40276C 8BCB mov ecx,ebx
5A400E87 8BF1 mov esi,ecx
5A400EAE 8D9E 84000000 lea ebx,dword ptr ds:[esi+0x84]
5A400EB5 8BCB mov ecx,ebx
59FB2584 8B19 mov ebx,dword ptr ds:[ecx] ; WeChatWi.5B3B4994
59FB2587 8B73 04 mov esi,dword ptr ds:[ebx+0x4]
通訊錄第一個節點 = [[[0x5B615060] + 0x28+0x84]+0x4]
左節點:mov esi,dword ptr ds:[esi]
右節點:mov esi,dword ptr ds:[esi+0x8]
節點是否有效:cmp byte ptr ds:[esi+0xD],0x0
算偏移
基址:59F60000
Executable modules, 條目 7
基址=59F60000
大小=01946000 (26501120.)
入口=5ACB4A63 WeChatWi.
名稱=WeChatWi
文件版本=2.9.0.123
路徑=C:\Program Files (x86)\Tencent\WeChat\WeChatWin.dll
偏移 = 內存地址 - 基址
通訊錄偏移:5B615060 - 59F60000 = 16B5060
代碼
最新版本2.9.5.41的偏移量,請私信我
原文地址:https://www.cnblogs.com/wwgk/p/13199553.html