PCXX逆向:終結篇——定位關鍵call的思路總結

定位關鍵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

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