獲取羣好友的相關思路
在微信點開羣列表的時候會顯示所有的羣成員,這個就是我們的突破口。
這個動作的編程邏輯在於,當我們點擊羣的時候,微信需要傳入這個羣的ID,然後取出所有的羣成員,顯示到界面上。那麼思路就來了,我們可以拿到當前羣ID的地址,然後對這個地址下訪問斷點,接着棧回溯分析
定位獲取羣好友列表的call
獲取羣ID
首先將當前聊天窗口定位到文件助手,然後搜索filehelper
接着切換當前聊天窗口,搜索wxid_
把地址添加到下方地址欄,然後將顯示的範圍擴大
然後我們點開羣列表,再點擊發送消息
就能拿到這個微信羣的ID了。我們記錄下這個羣ID
篩選當前窗口的羣ID
我們已經拿到需要的羣ID了,接着來定位一下當前窗口的羣ID
將窗口定位到羣列表,然後搜索這個羣的ID,
接着我們變換羣列表,然後搜索這個羣的羣ID
加入到下方地址欄
此時地址欄中的ID會跟隨當前羣窗口的ID變換而變換
定位當前窗口的羣ID
這麼多地址,那麼我們怎麼確定唯一的一個呢?很簡單
當前我所在的羣ID是The Magic Way的羣ID
接着我們切換到聊天界面,此時羣ID不會變化
接着我們選擇一半地址,將這一半選中的地址更改爲14軟件三班的羣ID
此時我們再次點擊聯繫人,如果這個時候羣成員的列表變成了14軟件三班的羣成員列表,那麼就說明前面四個中的一個就是當前窗口的羣ID,我們就刪除後面三個。反過來,如果沒有變化,就說明前面四個不是我們要的當前窗口的羣ID,我們就直接刪掉前面四個地址
點擊聯繫人,我們發現當前羣成員的列表已經變成了14軟件三班的羣成員列表,說明前面四個地址中有我們需要的。刪除後三個。重複上面的步驟,直到篩選出唯一一個羣ID
定位獲取羣好友列表call
接着我們給這個地址下一個內存訪問斷點
點擊羣列表,此時程序斷下,刪除內存斷點,分析附近的堆棧地址
我們要在堆棧中找一個call,傳入了我們當前點擊的羣ID。我剛纔點擊的是14軟件三班,羣ID是1741784456@chatroom。我們要在堆棧中找這樣一個帶羣ID參數的call
這個就是我們需要的call
我們在這個地址下斷,然後切換羣爲The Magic Way,此時程序斷下。找到了這個call,就說明離我們想要的獲取羣成員的call不遠了。單步往下跟蹤
這裏有一個call,傳入了當前的羣ID
和自己的微信ID,這個有可能就是我們需要的call,我們F7進去
在裏面看到有一個call傳入了數據庫的句柄,但是還是沒有我們想要的東西,繼續單步往下跟
這裏也有一個call,傳入的參數是一個羣ID,我們F7進去這個函數
這裏有一個call,傳入了兩個參數,eax是比較大的一個緩衝區,
ebx是羣ID,那麼可以猜測,這個call的作用是通過傳入一個羣ID獲取到羣成員之後,將羣成員放入到緩衝區裏。我們F8步過這個函數
此時eax返回了一個數據庫的句柄
然而緩衝區沒有任何變化。這裏我們可以猜測程序的流程是先獲取數據庫句柄,然後用數據庫句柄發起sql請求,拿到數據,接着寫入到緩衝區。
接着我們繼續往下跟,看看在什麼時機往裏面寫入了數據
再次步過函數,發現此時緩衝區裏有大量的微信ID,數據窗口跟隨這個地址
這裏把所有的數據用一個特殊字符隔開,繼續往下單步
此時eax的返回值指向了一個地址,我們數據窗口跟隨這個地址
裏面顯示的是已經處理好的所有的羣成員的ID,那麼我們就可以確定這個call可以拿到所有處理好的羣成員的列表
但是光找到這個call還不夠,我們需要拿到羣成員的數量,才方便我們寫代碼循環獲取羣成員。F9運行程序,然後記錄下羣成員的數量
點擊The Magic Way,記錄下276的十六進制是114
在[eax+0xA4]的位置保存有當前選中羣的成員數量。這個地方可以拿到所有羣成員的微信ID,而想要拿到羣成員的其他信息,還需要找另外一個call。下篇文章見。
目前微信機器人的成品已經發布,需要代碼請移步Github。還請親們幫忙點個star