吾愛破解 - LCG - LSG |安卓破解|病毒分析|破解軟件|www.mlqcje.live

 找回密碼
 注冊[Register]

QQ登錄

只需一步,快速開始

搜索
查看: 24150|回復: 519
上一主題 下一主題

[原創] PCXX逆向 --- 帶自定義提示的PCXX防撤回

    [復制鏈接]
跳轉到指定樓層
樓主
JieKeH 發表于 2019-5-17 10:31 回帖獎勵
本帖最后由 Kido 于 2019-6-6 18:09 編輯

帶自定義提示的防撤回

1.前言

最近太忙了,一直沒有時間更新這個文章.今天做點好玩的東西

在第一篇分析獲取登錄二維碼的數據中,我們分析了登錄過程中二維碼的顯示邏輯,現在我們分析下怎么實現帶自定義提示的消息防撤回,實現的效果圖就是如下所示

撤回顯示

可以看到這人一直在辱罵我,哈哈哈

PC微信核心模塊:wechatwin.dll (2.6.7.57版本)

相關工具:

  • windbg 或者 OD,x64dbg (動態調試工具)
  • IDA (靜態分析)
  • vs2015(開發hook功能模塊)

2.分析

大家知道ios/android/mac中都實現了防撤回,這些平臺上的分析也是有相似之處,就是搜索"Revoke"的關鍵字進行分析,我們可以借鑒他們的思路,嘗試從關鍵字"Revoke"入手,我們先腦中想一下整個撤回邏輯的實現

  • 對方在一個終端上發起一個撤回消息,服務端收到這個通知,下發消息給我方的所有終端
  • 我方所有的終端收到了服務端發來的撤回消息通知
  • 我方所有的終端實現撤回消息邏輯

可以看出,如果我們要實現防撤回邏輯,需要在第二步的網絡數據層或者第三步的撤回邏輯實現層做點手腳,我們先搜索下關鍵字"Revoke"吧

Revoke

可以看到Revoke相當之多了, 初步可以認為上面標注的消息中可能存在我們需要查找的邏輯,通過調試確認,能發現 On RevokeMsg svrId : %d這個就是服務端發來的撤回消息通知,看下下圖中相關的邏輯

ServerRevoke

可以看出來服務端對于撤回消息的定義是10002,上圖中還標注了sub_10252f80這個函數,下面解釋下為什么要標注這個函數

看看上圖中對sub_10483FE0的匯編調用

 sub     esp, 14h              
 mov     ecx, esp;                
 push    0
 push    dword ptr [eax+4]
 call    sub_10483FE0

再看下sub_10483FE0函數的匯編

push    ebp
mov     ebp, esp
sub     esp, 8
push    esi
mov     esi, ecx
mov     ecx, [ebp+arg_0]
push    edi
mov     dword ptr [esi], 0
mov     dword ptr [esi+4], 0
mov     dword ptr [esi+8], 0
mov     dword ptr [esi+0Ch], 0
mov     dword ptr [esi+10h], 0

綜合起來看,可以看出來

 sub     esp, 14h              
 mov     ecx, esp;
mov     esi, ecx
mov     ecx, [ebp+arg_0]
push    edi
mov     dword ptr [esi], 0
mov     dword ptr [esi+4], 0
mov     dword ptr [esi+8], 0
mov     dword ptr [esi+0Ch], 0
mov     dword ptr [esi+10h], 0

其實就是有兩個含義

  • ecx此時是一個類的指針,這個類的內存布局大小是0x14

  • 類每個成員是4字節大小,共有5個成員

而且從sub_10483FE0函數中可以發現這是一個MultiByteToWideChar的操作,可以推斷下這個類其實有點類似Wstring,那么對于下面的匯編函數來說,此時ecx是wstring, dword ptr [eax+4]是string(UTF-8)

 sub     esp, 14h              
 mov     ecx, esp;                
 push    0
 push    dword ptr [eax+4]
 call    sub_10483FE0

那將斷點斷在在call    sub_10483FE0上, 先記錄下此時的ecx的值,等執行完call    sub_10483FE0,再dd剛才保存的ecx的值,下面用xxxxx打碼了一些個人信息

0:000:x86> dd 00efcb20-14
00efcb0c  13f0e7f0 000000d6 00000100 00000000
00efcb1c  00000000 a6d44d71 00efee84 00efe484
00efcb2c  00000000 00000000 00000000 00000000
00efcb3c  00000000 00000000 00000000 00000000
00efcb4c  00000000 00000000 00000000 00000000
00efcb5c  00000000 00000000 00000000 00000000
00efcb6c  00000000 00000000 00000000 00000000
00efcb7c  00000000 00000000 00000000 00000000
0:000:x86> du 13f0e7f0 
13f0e7f0  "<sysmsg type="revokemsg"><revoke"
13f0e830  "msg><session>wxid_xxxxxxxxxxxxx"
13f0e870  "</session><msgid>1675514177</msg"
13f0e8b0  "id><newmsgid>2468247753633590716"
13f0e8f0  "</newmsgid><replacemsg><![CDATA["
13f0e930  ""xxxxxxx" 撤回了一條消息]]></replacemsg"
13f0e970  "></revokemsg></sysmsg>"

可以看到拿到了服務端的消息數據,注意其中的 xxxx 撤回了一條消息 這個和微信界面顯示是一致的,那么可以知道微信其實提取了replacemsg里面的消息顯示給界面

IDA中搜索"replacemsg"這個字符串,可以發現sub_10257570中是唯一處理replacemsg的函數,并且可以找到一條sub_10252F80 -> sub_10257570 的調用鏈條,現在可以知道,sub_10252F80這個函數其實就是第三步的撤回邏輯實現層,下圖是sub_10252F80的邏輯,一步步的跟下去,可以知道sub_10253250這個函數是邏輯實現層

邏輯實現層

下圖是sub_10253250函數中的邏輯,經過調試后能發現,如果v69為0的時候,界面仍然會顯示出來 xxx撤回了一條消息 , 但是實際上這條消息并沒有被撤回,所以我們的思路很簡單,Patch這塊的代碼,讓它一直走else里面的邏輯即可

3.深入挖掘

到第二步其實已經就可以了,但是其實還是有一個問題的,你會發現,上面在阻止別人撤回的同時也阻止了自己的撤回,更糟糕的是,當自己發起撤回的時候,界面會彈出來兩次 你撤回了一條消息 ,一開始其實還好了,自己用這個插件的時候倒是能接受,后來把這個插件給好友使用后,被一直吐槽,說體驗很差,還有就是希望加上自定義的撤回提醒,吐槽的久了以后,那就進一步研究下,當自己發起撤回的時候,就不攔截這個撤回了

注意看下sub_10253250函數中下圖的代碼段, 其中v46是個結構體,sub_1004E320初始化這個結構,sub_1025A390是對這個結構體的賦值,v50是結構體中的成員,可以看到當v50為10000的時候,sub_10253250是什么事情也不做就退出了,這個結構體值得我們的關注,它里面的成員對sub_10253250的邏輯有很大的影響,調試觀察下這個結構體的數據吧

將斷點斷在sub_1025A390執行后,直接能打印出來此時v46中的值,然后先讓別人撤回一條消息,再自己撤回一條消息,可以看到兩次v46內容的差異性

撤回對比

為啥使用這兩個數據的作為差異比較呢,當自己撤回的時候,微信還提供重新編輯的功能,但是當別人撤回的時候,微信就直接撤回了,也就是說,微信其實是保存了是自己撤回還是別人撤回這個變量作為區分的

再看下sub_10253250函數中下圖的代碼段

查看sub_102541D0 -> sub_102542A0 的調用,在sub_102542A0中可以看出當a1為1的時候,會提供撤回編輯的能力,這個a1是 (_DWORD )(v7 + 52) != 0 賦值的 v7就是v46,也就是上圖中的差異的位置

至此就找到了判斷是別人撤回還是自己撤回的標志,解決了第一個問題,那下面還要解決第二個問題,那就是撤回消息的定制

既然sub_102542A0函數中提供了撤回編輯的能力,并且可以在sub_102542A0中看到下面的函數片段

對應的匯編操作

  • .text:102544A1 85 C0                                         test    eax, eax
    .text:102544A3 74 06                                         jz      short loc_102544AB
    .text:102544A5 66 83 38 00                                   cmp     word ptr [eax], 0
    .text:102544A9 75 05                                         jnz     short loc_102544B0

可以看出來這個是字符串拼接,a5就是需要被拼接的字符串.調試看下這個數據

Breakpoint 1 hit
WeChatWin!IMVQQEngine::`default constructor closure'+0x1a7121:
69a844a1 85c0            test    eax,eax
0:000:x86> du eax
0c073b08  ""xxx" 撤回了一條消息"

也就是說對a5進行修改就可以了,a5是sub_102542A0的參數,那么在sub_102541D0中看下a5的賦值

好了,只需要修改lpmem就行了.

4.工程實現

現在我們知道只需要hook住sub_102541D0,然后判斷下撤回的來源

  1. 如果是別人撤回的,Patch掉sub_10253250的v69的邏輯,并且修改撤回的字符串消息為我們自定義消息
  2. 如果是自己的撤回,恢復sub_10253250的v69的邏輯

下圖中SigPatternRevoke2_6_7_40是sub_102541D0函數頭開始的特征碼

下圖是代{過}{濾}理函數的實現,注意修飾符__declspec(naked) 就是告訴編譯器按照我們寫的匯編代碼生成代碼,不要偷偷的再加入一些多余的匯編代碼

解釋下 上圖 中間那段匯編push寄存器的來源, 首先是Push edx, 從下圖中可以看到sub_102541D0中判斷自己還是別人撤回的標志位是[exi+52],而esi來源于edx,故代{過}{濾}理函數需要的參數是edx寄存器

從上圖中可以看到要修改的字符串是[ebp+8]的位置,而ebp又是

push  ebp
mov   ebp, esp

也就是說當斷點斷在 push ebp這個位置的時候,此時的[esp+4]就是字符串了, 而看下代碼中的代{過}{濾}理函數

__asm
        {
                PUSHAD;
                sub esp, 20;
        }

其中 pushad會使得 esp-0x20(壓了8個寄存器), 然后又 sub esp, 20(0x14), 所以代{過}{濾}理函數 esp + 0x14 + 0x20 + 4 的位置就是字符串了

剩下的RevokeMsg2_6_7_40函數就是比較簡單了

  1. 需要注意下這個字符串使用的內存不是crt的堆,而是進程堆就可以了. 至于為啥這樣,這里就當留個作業了,提示下sub_10484190函數內有答案
  2. PatchMemoryUCHAR中修改的就是sub_10253250的v69的邏輯

具體的工程實現就在上篇文章上增加而來,還是放到百度云盤了

網盤鏈接  提取碼: 3964



重要提示:

  • 如果對代碼工程感興趣的,可以下載網盤的文件
  • 如果只是對二進制的bin文件有興趣的,直接下載論壇的附件,解壓后將version.dll放到微信的安裝目錄下就可以



如果二進制的bin文件替換后沒有效果的,可以做下面的排查
  • 文件替換后,要重啟微信才生效。
  • 目前支持的微信版本是 2.6.7.40 2.6.7.48 2.6.7.57,其余的微信版本是不支持的


做了上述的排查后還是沒有生效的,可以查看下dbgview的log信息.回帖的時候可以截圖或者上傳log信息

如果發現微信異常或者功能異常的,也可截圖回帖,感謝


2019/06/04 :增加2.6.8.51版本的支持


2.6.8.51.7z

576.24 KB, 閱讀權限: 10, 下載次數: 641, 下載積分: 吾愛幣 -1 CB

Version.zip

746.9 KB, 閱讀權限: 10, 下載次數: 3953, 下載積分: 吾愛幣 -1 CB

bin文件

點評

怎么新的版本,顯示鍵盤記錄木馬?一直被攔截  發表于 2019-6-17 09:25

免費評分

參與人數 214吾愛幣 +200 熱心值 +198 收起 理由
俗氣 + 1 + 1 [email protected]
e698j2 + 1 + 1 [email protected]
fuckbin + 1 + 1 我很贊同!
Fa1sePRoMiSe + 1 + 1 用心討論,共獲提升!
永恒的未來 + 1 我很贊同!
wuxiaojie + 1 + 1 熱心回復!
13235699629 + 1 + 1 用心討論,共獲提升!
Destiny007 + 1 [email protected]
swebcc + 1 + 1 用心討論,共獲提升!
pinkly + 1 用心討論,共獲提升!
Brainor + 1 + 1 我很贊同!
懵逼貓咪 + 1 + 1 [email protected]
ab10012358 + 1 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
fu90 + 1 + 1 我很贊同!
XinChenK + 1 + 1 [email protected]
Hiro_J + 1 + 1 [email protected]
laohucai + 1 + 1 [email protected]!學到了很多知識。
VitaL + 1 [email protected]
dd0373 + 1 [email protected]
番茄炒西紅柿1 + 1 + 1 我很贊同!
Cway + 1 [email protected]
ProgramerFangL + 1 + 1 [email protected]
cenvin + 1 + 1 熱心回復!
zthinking + 1 + 1 用心討論,共獲提升!
左右1906 + 1 + 1 再出一個QQ的就很好了,這個好像不管用,還是撤回了
yangdl + 1 熱心回復!
love514415 + 1 + 1 我很贊同!
yx13343795594 + 1 + 1 我很贊同! 有態度的防撤回
yhygwj + 1 + 1 [email protected]
非恨丶 + 1 + 1 我很贊同!
fg676123 + 1 + 1 我很贊同!
vincener + 1 我很贊同!
purplewall + 1 我很贊同!
Adorable_Star + 1 [email protected]
pengzhihua + 1 + 1 我很贊同!
hgd_icbc + 1 熱心回復!
傻笑的老鼠 + 1 + 1 用心討論,共獲提升!
limit7 + 1 + 1 厲害了,佩服佩服
切惦紅純 + 1 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
xulichen + 1 + 1 我很贊同!
媚眼的丹客 + 1 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
yuanmo + 1 + 1 [email protected]
zpp7 + 1 + 1 用心討論,共獲提升!
iret_52 + 1 + 1 這個有意思
秦先生 + 1 + 1 我很贊同!
aa849397558 + 1 + 1 手賤點了升級, 不管用了2.6.8.51
yixi + 1 + 1 [email protected]
1188 + 1 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
Poison丶biting + 1 + 1 [email protected]
zmywsw + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
xueya + 1 + 1 很不錯的逆向文 不過我相信大多數是看不懂得 作者有時間出教學嗎?
shidongjiao + 1 我很贊同!
Ailynhm + 1 我很贊同!
小木頭堆 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
8901658 + 1 + 1 我很贊同!
胖維尼 + 1 + 1 用心討論,共獲提升!
Q4964 + 1 351#,萌新請教怎么知道防撤回由wechatwin.dll控制?
告別花季 + 1 [email protected]
小瘋子已經瘋了 + 1 + 1 用心討論,共獲提升!
Uhn + 1 + 1 [email protected]
梁蕭 + 1 我很贊同!
azabual + 1 + 1 用心討論,共獲提升!
塵世迷途小書童 + 1 + 1 [email protected]
池到了 + 1 + 1 [email protected]
阿墨 + 1 [email protected]
小粉B + 1 + 1 [email protected]
tong_wen2504 + 1 [email protected]
52pjShiron + 1 + 1 熱心回復!
太空獨角獸 + 1 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
風吹落葉飄 + 1 + 1 [email protected]
xuanzuanmu + 1 + 1 熱心回復!
55555555 + 1 + 1 厲害,可用
yj1049841 + 1 + 1 [email protected]
LUCKandme + 1 用心討論,共獲提升!
心語科技 + 1 + 1 用心討論,共獲提升!
ukonw3477 + 1 + 1 熱心回復!
靑葉 + 1 + 1 熱心回復!
sllijingwei + 1 + 1 [email protected]
sdysyhj + 1 + 1 [email protected]
ImLee + 1 + 1 [email protected]
a3607896 + 1 + 1 [email protected]
Ai5 + 1 + 1 熱心回復!
LaUstiN + 1 [email protected]
linying0208 + 1 + 1 [email protected]
Harvey丶 + 1 + 1 我很贊同!
seethesun + 1 + 1 我確實看不懂 感謝分享 碼起收藏
beawes0me + 1 + 1 用心討論,共獲提升!
ipi0001 + 1 + 1 試過有效,感謝樓主!
殺豬用牛刀 + 1 + 1 [email protected]
非法管理者 + 1 + 1 用心討論,共獲提升!
寒狼 + 1 + 1 好像還是需要配合防撤回多開版本,不然第二賬號會失效
流云0202 + 1 + 1 我很贊同!
jakhu + 1 + 1 我很贊同!
冷笑丶小雨 + 1 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
cwb2412 + 1 + 1 我很贊同!
CHN酋長 + 1 + 1 [email protected]
FBomBom + 1 + 1 親測可用。部分不可用的,其實可以通過重新安裝一下微信再試一下。
gqdsc + 1 + 1 厲害厲害
ChinaNB + 1 [email protected]
l64549102 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!

查看全部評分

本帖被以下淘專輯推薦:

發帖前要善用論壇搜索功能,那里可能會有你要找的答案或者已經有人發布過相同內容了,請勿重復發帖。

推薦
jiazhiyuan0325 發表于 2019-5-17 11:04
可以做出來一個嗎啊?
推薦
honda160 發表于 2019-5-17 11:29
JieKeH 發表于 2019-5-17 11:27
你的版本是對的嘛

2.6.7.57呀,百度盤上那3個全部覆蓋到微信根目錄了,微信也重啟過了
4#
XTo 發表于 2019-5-17 10:48
5#
kenny216 發表于 2019-5-17 10:56
樓主,下載下來的東西怎么用?能否做個程序。
6#
zhaoladen 發表于 2019-5-17 10:59
學習學習
7#
格魯特 發表于 2019-5-17 11:00
沒有傻瓜一鍵的那種嗎?
8#
小阿花 發表于 2019-5-17 11:06
看上去好有意思,很厲害的樣子
9#
unixcs 發表于 2019-5-17 11:16
好東西!!!
10#
tankyle 發表于 2019-5-17 11:19
把version放進安裝目錄就可以了嗎
但是測試了一下撤回的消息還是撤回了啊
11#
zpzb 發表于 2019-5-17 11:23
比較詳細的 說明,多謝分享
您需要登錄后才可以回帖 登錄 | 注冊[Register]

本版積分規則 警告:禁止回復與主題無關內容,違者重罰!

快速回復 收藏帖子 返回列表 搜索

RSS訂閱|小黑屋|聯系我們|吾愛破解 - LCG - LSG ( 京ICP備16042023號 | 京公網安備 11010502030087號 )

GMT+8, 2019-8-12 08:37

Powered by Discuz!

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表
内蒙古11选5开奖查询百度