定位關鍵call的思路總結
一 尋找切入點
一般來說需要找的關鍵call可能會有多個地方有切入點,比如定位獲取羣成員的call,可以在消息窗口打開羣列表
也可以在聯繫人窗口打開羣列表
那麼這兩個切入點中,第二個切入點可用信息有羣ID和微信ID,相對來說會比第一個切入點要好。所以找到一個好的切入點是一個好的開始
二 思考切入點背後的編程邏輯
找到了切入點之後,我們要思考這個切入點以及需要找的call背後的編程邏輯。例如:如果讓你來實現一個發消息的函數,你會怎麼寫?
如果讓我去實現一個發送消息的函數,那麼至少需要有三個參數,第一個是消息的內容,第二個是消息的接收者,第三個是消息的類型。僞代碼如下:
BOOL SendMessage(wchar_t wMegText,wchar_t wMsgRecver,DWORD dwType)
{
//這裏是代碼
}
另外,思考清除切入點背後的編程邏輯有利於我們後面的分析,比如在排查堆棧的時候可以直接跳過三個參數以下的函數。
三 尋找切入點和已有信息間的聯繫
第三步,我們需要找到切入點和我們已掌握的信息間的聯繫,通過它們之間的聯繫進行入手。
以發消息的call爲例,三個參數中我們已經能拿到其中兩個參數,一個是接收者的微信ID,一個是消息內容。那麼作爲發消息函數的參數,在調用這個函數的時候就必然會訪問這兩個參數,所以我們可以先在CE中找到接收者的微信ID的地址,然後對這個地址下斷點進行分析。
四 棧回溯 分析附近代碼
在斷點斷下之後,逐個排查堆棧中的返回地址和參數,根據已有的信息,篩選出最有可能的那個返回地址。
例如我們知道發送消息的函數至少需要三個參數,那麼在排查堆棧的時候就可以直接過濾掉三個參數以下的函數。
如果堆棧中沒有找到我們所需要的call,那麼可以直接返回到堆棧的最上一層的地址,在函數頭下斷點進行單步跟蹤,一定可以找到所需要的call。
找到可能的call之後記得進一步驗證,可以利用修改參數的方式測試是否是自己需要的call。
五 分步進行
如果在尋找切入點的過程中發現沒有跟要找的call關聯的最直接的切入點,那麼可以嘗試一下分多步進行,先找到和關鍵call有關聯的call,然後再通過這個有關聯的call去找關鍵call。
例如在定位發送xml名片的時候,我們需要先找到需要發送的對象的微信ID,然後對微信ID下內存訪問斷點。
但是我們很難去定位到這個好友的微信ID的地址,因爲地址太多了。
這個時候可以先通過選字符串的提示找到這個選擇的call,選擇的call自然會將選中的好友的微信ID傳入。找到了微信ID,就能直接對微信ID下訪問斷點,棧回溯分析了。
目前微信機器人的成品已經發布,需要代碼請移步Github。還請親們幫忙點個star
https://github.com/TonyChen56/WeChatRobot