分析羣拉人功能的思路
首先思考一下羣拉人功能背後的編程邏輯,第一步需要將一組聯繫人放到一個數組裏,然後拿到這一批人的微信ID,接着對這一批人發送一個羣邀請。那麼我們就可以從聯繫人的微信ID入手,只要找到了那組微信ID,那麼就能下內存訪問斷點,進而找到羣拉人的call
定位羣拉人call
定位聯繫人的微信ID
首先在不選中聯繫人的情況下搜索微信ID
接着選中所有的地址,添加到下方地址欄
接着複製所有的內容,將其放到在線文本對比工具的A部分中
接着選中要添加的聯繫人,然後再次搜索微信ID,此時搜索的數量增加。因爲當你選中聯繫人的時候,微信肯定要把這個選擇的聯繫人的ID放到已選聯繫人的數組裏。
接着同樣將這批地址放到文本對比工具的B部分中。接着我們需要找到點擊前沒有的地址,點擊後有的地址。也就是找到B有A沒有的地址。
接着我們在B部分裏找到了四個A部分沒有的地址,那麼問題在於怎麼篩選出唯一的一個地址呢?根據我們以往的經驗我們知道,存放微信ID的數據格式一般如下:
XXXXXXXX XXXXXXXX "wxid_xxxxxx"
XXXXXXXX 13
XXXXXXXX 20
XXXXXXXX 0
XXXXXXXX 0
那麼我們可以大膽猜測,存放這個選中聯繫人的微信ID的地址的數據格式也是和之前的一樣。接着我們在OD中去查看這四個地址的數據格式,看是否和上述的數據格式一致
首先在CE中搜索選中的地址是否有上一級指針,如果沒有 直接pass這個地址
接着在OD中查看上一級指針的內容,發現這個數據結構比較符合我們的要求
再次查看另外一個地址,發現這個正好是我們預期的數據結構,完全符合
經過篩選我們發現三個地址都符合我們要的特徵
定位羣拉人call
必須要執行的call
既然如此我們只能先挑一個最大的地址來碰運氣了,在這個地址中下內存訪問斷點(這一步需要經過多次排查)
點擊確定,讓程序斷下,
此時程序斷下,刪除訪問斷點,開始排查堆棧
在堆棧中我們發現了一個call,傳入了被邀請人的微信ID,那麼這個call就非常像我們找的邀請羣成員的call,我們在這下個斷點,邀請好友讓程序再次斷下
如果想要驗證這個call是否是關鍵call,那麼可以修改微信ID,看看是否會將修改後的好友加進羣。經過測試如果直接跳過這個call,那麼微信會直接崩潰,因爲這個是組裝數據的必要的一個call。
但是我們發現這個地方只有被邀請人的微信ID,並沒有邀請的羣ID,那麼我們需要繼續往後跟,很有可能這也是一個連續的call
可以不執行的call
從找到的call一直往後F8單步,接着我們在這個地方找到了一個call,傳入了一個羣ID,那麼有沒有可能只要調用這兩個call就能完成邀請的動作了呢?我們來驗證一下
讓程序再次斷下,然後將這個je修改爲jmp,跳過這個call,跳過之後好友還是被拉進羣了,那麼說明這個call是一個沒有用的call。我們還要繼續往下找,找到傳入了羣ID的那個call
必須要執行的call
當我們F8步過這個all的時候,發現將羣ID寫入到了堆棧,說明這個call可能是我們需要的call,繼續往下單步
發現這裏有一個call將一個結構體壓入堆棧,這個結構體我們已經很眼熟,見過很多次了
數據窗口跟隨,發現裏面保存的就是微信ID,那麼這個call就很有可能是我們需要的邀請人進羣的call了
當我們跳過這個call時,發現此時微信崩潰,也就是說這個call也是一定要執行的一個關鍵call
追蹤數據結構的來源
現在我們已經知道了哪些是必須要調用的call,現在我們需要拿到esi數據結構的來源
一直往上追溯,我們發現esi在這個地方被賦值,所以我們在這個call下斷點,讓程序斷下
程序斷下,查看esi的值,我們發現此時esi已經是我們需要追溯的結構體,所以我們還需要繼續往上找
繼續往上翻我們並沒呀找到任何給esi賦值的地方,所以我們猜測有可能是這個call傳入了一個微信ID,然後組裝數據結構,所以我們在這個call下斷點
斷點斷下,此時esi的緩存區爲空,F8步過這個call
此時緩衝區內正是我們需要的數據,也就是說這個call是用於組裝數據的必須的call
另外 在這個地址還有一個往堆棧中寫入羣號的call,這個call也是要調用的
現在我們只需要調用我們找到的前面三個call,就能夠完成拉人的功能,但是微信會崩潰
經過排查我們發現這個call,也是一個必須要調用的call,如果不調用的話 微信會直接崩潰
總結
想要寫代碼完成羣拉人的功能,分爲三個步驟。第一步,調用下面的call,組裝數據
0FD94079 50 push eax ; 微信ID
0FD9407A E8 911E0000 call WeChatWi.0FD95F10 ; 用於組裝微信ID結構體的call
第二步,調用下面的call,防止微信崩潰
0FD9412F 6A 00 push 0x0
0FD94131 68 A4D8FA10 push WeChatWi.10FAD8A4
0FD94136 8D4D C0 lea ecx,dword ptr ss:[ebp-0x40]
0FD94139 E8 D2D84200 call WeChatWi.101C1A10 ; 一定要調用的call 否則微信會崩潰
第三步,調用下面的call往堆棧中寫入羣號
0FD941EC 83EC 14 sub esp,0x14
0FD941EF 8D8B 80080000 lea ecx,dword ptr ds:[ebx+0x880]
0FD941F5 8BC4 mov eax,esp
0FD941F7 8965 E8 mov dword ptr ss:[ebp-0x18],esp
0FD941FA 50 push eax
0FD941FB E8 90300100 call WeChatWi.0FDA7290 ; 往堆棧中寫入羣號
第四步,調用拉人的call
0FD9422B C645 FC 03 mov byte ptr ss:[ebp-0x4],0x3
0FD9422F 56 push esi ; 微信ID結構體
0FD94230 B9 C0DDFA10 mov ecx,WeChatWi.10FADDC0
0FD94235 C645 FC 02 mov byte ptr ss:[ebp-0x4],0x2
0FD94239 E8 920E2100 call WeChatWi.0FFA50D0 ; 拉人的call
目前微信機器人的成品已經發布,需要代碼請移步Github。還請親們幫忙點個star
https://github.com/TonyChen56/WeChatRobot