PCXX逆向:分析羣拉人功能

分析羣拉人功能的思路

在這裏插入圖片描述

首先思考一下羣拉人功能背後的編程邏輯,第一步需要將一組聯繫人放到一個數組裏,然後拿到這一批人的微信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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章