微信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
找到menuCmdDelete
,menuCmdRevoke
等字串,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編輯
,原因: