[原創]微信PC端技術研究-訊息防撤銷

anhkgg發表於2019-02-25

微信PC端技術研究-訊息防撤銷
by anhkgg
2018年11月30日

0x1. 寫在前面

不知道大家有沒有遇到過這種情況,微信收到訊息,但是沒有及時檢視,然後閒暇時去看的時候,訊息被撤銷了,撤銷了!

 

那時肯定是無比無語,撓心撓肺,究竟發了什麼?

 

有沒有一種神器可以防訊息撤銷呢,有的!其實移動端和mac上已經有人做了相關的外掛,但是PC端貌似沒人來啃這塊骨頭。

 

當然也可能是我沒找到,不過不管怎樣,對我來說就是沒有。

 

既然如此,小生來!

0x2. 技術分析

先理一下思路:

 

1.對方傳送訊息之後,我收到訊息並在訊息視窗顯示<br/>
2.然後對方點選選單選擇撤銷<br/>
3.我會收到發來的撤銷通知,然後刪除訊息視窗顯示的訊息

 

所以分析方向就基本定為兩個方向了:

 

1.一個是透過分析網路訊息找到撤銷訊息,然後攔截該訊息阻止訊息被撤銷<br/>
2.另一個是找到撤銷訊息的介面操作,patch掉這個撤銷訊息的操作即可

 

開始之前,先了解一下微信主要模組都實現什麼功能。

模組 功能
WeChat.exe 主程式,初始化操作,載入WeChatWin.dll
WeChatWin.dll 主要功能模組,包括介面、網路、功能
wechatresource.dll 儲存資源的模組,包括介面資源
 

主要分析目標就是WeChatWin.dll,其實很早之前就想分析這個東西了,但是那時候的老版本vmp殼加的更嚴重(映像中是,無法考證),所以擱置很久。

 

當前我分析的版本應該是最新的2.6.5.38,目前來看加殼程度還行,基本都是比較好分析的程式碼,沒有經過加殼處理,不過聽說核心程式碼還是處理過的。

1. 介面入手

首先試試從介面入手,都知道微信介面使用duilib實現的,所以可以從它的某些特徵入手分析,比如字串click等,可以快速找到功能函式。

 

想的是透過click找到整個視窗響應函式,然後再分析找到撤銷操作的程式碼位置。

 

確實很快就看到了視窗響應函式,不過大概有119個相關函式,所以無奈放棄。

 

換一個方向,透過選單入手,搜尋menu找到menuCmdDeletemenuCmdRevoke等字串,menuCmdRevoke就是撤銷選單對應的名字。有29個相關函式,還行。結合除錯,嘗試了幾個函式,果然找到了刪除、撤銷對應的響應函式。然後想透過刪除選單來找到刪除介面訊息的程式碼,而被撤銷訊息其實也是刪除介面訊息,不過折騰了一圈未果。

2. 網路入手

透過recv回溯到接收網路訊息的函式中,40個,有點多。找了個tcp抓包工具,想抓到撤銷訊息的呼叫堆疊,結果一直被其他訊息干擾,無果。

3. 取巧

函式太多,分析很費實踐,想看看有沒有其他路可以走。在字串中搜尋revoke發現很多看起來有用的除錯資訊,不過也有79條之多。然後透過篩選和除錯確認,找到了On RevokeMsg svrId : %d,然後回溯到撤銷訊息處理的函式中。

if ( sub_10247BF0((wchar_t *)v258, (int)v259, (int)v260, v261) )
{                             // 撤銷訊息
*(_OWORD *)&v259 = xmmword_10E6A278;
v257 = xmmword_10E6A278;
v256 = xmmword_10E6A278;
v255 = xmmword_10E6A278;
*(_OWORD *)&v251 = xmmword_10E6A278;
sub_1007E090(&v247, v353, SHIDWORD(v353));
f_log_10471580(
  (int)"02_manager\\SyncMgr.cpp",
  2,
  1357,
  (int)"SyncMgr::doAddMsg",
  (int)"SyncMgr",
  "On RevokeMsg svrId : %d",

經過除錯發現sub_10247BF0返回1則進入撤銷訊息處理中,訊息被撤銷,跳過此段程式碼,訊息不會被撤銷,所以patch掉sub_10247BF0這個函式的返回值使其一直為0即可完成防撤銷的功能。

 

當然也不能太隨意了,還是看看這個函式大概做了些什麼處理吧。關鍵引數第一個,除錯中發現值如下:

<sysmsg type="revokemsg">
    <revokemsg>
        <session>wxid_0811111140112</session>
        <msgid>1111000048</msgid>
        <newmsgid>11411701182813217</newmsgid>
        <replacemsg><![CDATA["xxx" 撤回了一條訊息]]></replacemsg>
    </revokemsg>
</sysmsg>

sub_10247BF0解析發現type="revokemsg"即判斷為撤銷訊息操作,返回1,很明瞭。

 

小結:此次分析運氣較好,透過revoke找到關鍵程式碼,少花了很多時間,其實透過網路方向堆疊篩選確認應該也是可以找到這段程式碼的,但是透過結果去看,發現有近10層呼叫棧,肯定會花成倍的時間才能找到關鍵程式碼。

0x3. 實現

分析是為了最後能夠用起來,所以用上一篇文章《一種通用Dll劫持技術》寫了一個簡單的包含patch程式碼(沒有用hook)的dll模組,劫持微信的WeChatResource.dll來完成載入。

 

關鍵程式碼如下所示,patch了sub_10247BF0返回值所在程式碼,讓其eax永遠為0。

bool FakeRevokeMsg()
{
    if (!IsSupportedWxVersion()) {
        return false;
    }

    //33 C0                xor eax,eax 
    BYTE code[] = { 0x33, 0xc0, 0x90 };
    HMODULE hMod = GetModuleHandle(WECHATWINDLL);
    DWORD offset = 0x247EF1;//返回值處
    if (!hMod) {
        return false;
    }

    PVOID addr = (BYTE*)hMod + offset;
    Patch(addr, 3, code);

    return true;
}

最後慣例,放上github地址:https://github.com/anhkgg/SuperWeChatPC

 

補一個網盤地址直接下載編譯好的工具,不過要去github給我點星星哦
連結: https://pan.baidu.com/s/1S4UdcPOORdmzE69TzD-eRA 提取碼: ry4g

 

廣告:歡迎關注公眾號漢客兒或QQ群(753894145),一起交流學習



[推薦]看雪企服平臺,提供安全分析、定製專案開發、APP等級保護、滲透測試等安全服務!

最後於 2018-12-5 22:41 被Angelxf編輯 ,原因:

相關文章