Exp10 Final 微信防撤回原理与实现

时间:2019-06-13 20:25:48   收藏:0   阅读:201

一、写在前面

1.为什么做免考?

相较于考试,免考更能锻炼自身创新和探索能力,更有挑战性。

2.选做微信推送防撤回原因?

二、写在中间

1.什么是防撤回?

2.实验环境

3.撤回原理

4.撤回代码逆向分析

(1)将微信核心模块放入IDA,搜索一下撤回有关的命令

技术图片

技术图片

技术图片

(2)分析一哈,挺多的,但基本上逻辑顺序与二、3的一致,那就动态调试找一下哪一条是服务器下的命令,很简单就能发现是 On RevokeMsg svrId : %d ,那就好办了 F5 一下

技术图片

(3)再分析一哈,v191就应该是服务器下的命令,对应编号应该为10002(10000+2),然后查看一下这段程序调用的函数汇编,首先是  sub_10483FE0 函数

1 #对sub_10483FE0的汇编调用
2 sub     esp, 14h              
3 mov     ecx, esp;                
4 push    0
5 push    dword ptr [eax+4]
6 call    sub_10483FE0
 1 #sub_10483FE0函数的汇编
 2 push    ebp
 3 mov     ebp, esp
 4 sub     esp, 8
 5 push    esi
 6 mov     esi, ecx
 7 mov     ecx, [ebp+arg_0]
 8 push    edi
 9 mov     dword ptr [esi], 0
10 mov     dword ptr [esi+4], 0
11 mov     dword ptr [esi+8], 0
12 mov     dword ptr [esi+0Ch], 0
13 mov     dword ptr [esi+10h], 0

技术图片

1 0:000:x86> dd 00efcb00-14
2 00efcb0c  13f0e7f0 000000d6 00000100 00000000
1 0:000:x86> du 13f0e7f0 
2 13f0e7f0  "<sysmsg type="revokemsg"><revoke"
3 13f0e830  "msg><session>wxid_xxxxxxxxxxxxx"
4 13f0e870  "</session><msgid>18778893426</msg"
5 13f0e8b0  "id><newmsgid>5379365542789842691"
6 13f0e8f0  "</newmsgid><replacemsg><![CDATA["
7 13f0e930  ""不知名网友" 撤回了一条消息]]></replacemsg"
8 13f0e970  "></revokemsg></sysmsg>"

(4)到这里就显而易见了,出现了 <replacemsg> ,这不就是我们所想改的地方吗!!跟之前找撤回命令一样,找一下关于 replacemsg 在哪里,实际上也不用那么找,刚才执行完 sub_10483FE0 那一部分之后看看后面调用了啥就行,上面那个不是,那就是下面这个。

      技术图片

技术图片

技术图片

 

技术图片

技术图片

(5)如何让消息不撤回到这里已经很清楚了,只需要在这里给他按个补丁,一直让他在else里走就好,但这里会有一个问题出现,你的微信上别人无法撤回消息,你的消息你也撤回不了,岂不是有点尴尬,那就要找一找微信是怎么区分自己发的撤回指令和其他人发的指令的函数。

1 if   ( v50 == 10000 )
2   goto LABEL_46; 
1 sub_1004E320((int)&v46);
2 ...
3 ...
4 ...
5 v11 =  sub_1025A390 ( xmm0_0, v10, a3, a4, (int)&v46);
1 0:013> g
2 *** WARNING: Stack unwind information not available.  
3 #别人撤回时
4 012fc2e0  00000001 00000000 00000002 4cdf683f
5 #自己撤回时
6 012fc2e0  00000001 00000001 00000002 4cdf689f

技术图片

技术图片

技术图片

(6)到这里所有撤回流程就很清楚了,当自己撤回时,就按照正常指令进行操作,当他人撤销时,将消息撤回置位else,不让他进入if(true)就可以实现防撤回的功能了。

 三、写在后面

1.防撤回实现

(1)生成汇编语言代码,作为补丁,放入wechatwin.dll所在的文件夹重启微信

(2)实现:

技术图片

(3)彩蛋:撤回消息提醒是不是变了,原理全在 sub_102542A0 函数,可以自己试试。。。。嘿嘿嘿

2.感受:

逆向是真的麻烦,搞了半天补丁制作(借助了部分大佬的代码),才弄出来,结果写博客的时候微信升级了,虽然看了一下逻辑基本没变,但是地址都变了,f**k,不想再做一遍补丁了,虽然这个功能挺好用的,但是需要电脑客户端一直挂着微信就很麻烦,应该改进一下把撤回的消息都发给文件助手就会方便很多(网上有个大佬做过以前版本的),做到一半的时候,都想换题做个什么CTF杂项专题来着,幸好还是一点点坚持下来了,努力也没算白费(版本一换就不行o(╥﹏╥)o),终于不用写博客了(*^▽^*)。

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!