微信防撤回是怎么实现的?

WxPcHook

Hook技术 可能已经没啥稀奇的了,但我是最近才了解,兴趣浓厚嗷,很多人说做这个是为了赚钱
在文章开头用老师的话说 “只用于技术交流,法律边界不得触碰

我在最近通过看视频等等也学到了很多。但从视频中学习有个缺点,就是别人已经告诉你怎么解决这个问题。比如去CE里搜索某些特征码之类的。比如下面我要讲的 “防撤回” 大佬们的教学一开始就让你搜索 revoke 这个关键字 (这是我找完CALL以后再看一些教程文章了),感觉多半还是有点运气成分在,所以我尝试通过之前学习的知识,自己解决一下这个问题。

最终效果

微信防撤回是怎么实现的?_第1张图片
微信防撤回是怎么实现的?_第2张图片

情景模拟

我们能在接收消息CALL中获取以下参数
1. 谁发给你的?
2. 发了什么?
3. 什么类型?
4. 还有一串加密的类似hash的字符串(可能是标识作用)

如果我们是程序员,我们在做撤回功能的时候肯定得给函数传入参数应该就是消息的ID吧?

那我们现在对程序内部是一无所知的,所以我想通过我们看的到的去追寻我们看不到的。

查看看得见的变化

我们在wx中撤回一条消息,原信息消息,输出了一条 “某某某 撤回了一条消息”

所以在CheatEngine中搜索 “撤回”

返回了20多条结果
微信防撤回是怎么实现的?_第3张图片
可以把 “Type” String Unicode 长度的大一些,这样我们就可以看到在这条记录后面跟着的很多数据。

20多条数据,测试起来很方便了,直接将他们拉下来进行进一步测试

第二步选定变量地址

我们重复撤回,寻找跟随变化的变量地址,乱码的变量就可以直接删掉了,因为是个临时变量。

这样就能更加精确的缩小范围。

第三步内存断点

函数在撤回消息的时候,肯定需要访问内存获取数据。
可以通过内存断点,查询堆栈中函数调用的情况

微信防撤回是怎么实现的?_第4张图片
在这里我们看到了即将撤回的 消息内容,和即将输出的内容,这说明附近可能有我们要的函数地址。继续往栈底看。
微信防撤回是怎么实现的?_第5张图片
有我们要撤回的消息,和消息中的那串加密字符串。找到需要的参数数据!!
我就在此函数地址下断

函数追踪

微信防撤回是怎么实现的?_第6张图片

  1. 收信的时候,不执行该幻术
  2. 撤回的时候,执行了该函数

这说明这是撤回操作需要的函数【很可能是我们要的】

mov eax,[arg.1] // 传入参数
test eax,eax
...
push eax
call 函数
add esp,0x4 // 平衡堆栈

我修改 call 直接 jmp 到下一个命令,发现消息并没有撤回,但是点击继续运行,消息撤回了!

这说明:这个函数是必经之路,但是不是最重要的,撤回的函数应该在其后面。

然后我傻乎乎的跟进函数,发现进入的一个循环。姑且认为是个消息循环,总之没跟随到。

再换一个思路…

之前断下的函数传入了一个参数 [arg.1],保存再eax,eax呢又压入了堆栈让即将调用的函数使用,那么问题来了,[arg.1]就是我们看到的堆栈esp中的一些参数



  
    wxid_0h3n1axxxxxxxx 佛系打码
    1701xxxxx 佛系打码
    79069xxxxxxxxx 佛系打码
    
  

场景模拟

VOID func1(msg,param){
	// win 的消息循环
	switch(msg){
		case "撤回":
			revokeMsg(param);
			break;
		default:
			break;
	}
}

// 我们当前的函数
VOID revokeMsg(param){
	func3(param); //我们要的call
}

VOID func3(arg_1){
	// 做了一些函数
}

所以说调用这个函数的函数,即外层函数,所以我们要继续外层找,看堆栈里。
微信防撤回是怎么实现的?_第7张图片
看到这里,这儿已经是比较外层,再往下就没有消息的参数了,而且看到了

LASS SycnMgr 我也不知道这是啥

一种猜测
Mgr:MySQLGroupReplication
Sycn:同步
MySQL Group Replication 是MySQL官方推出的一个全新的高可用与高扩展的解决方案,提供高可用、高扩展、高可靠(强一致性)。

不管Wx的意思是不是这个,这个 可能 是一个消息循环【现在只是猜测,我没有告诉大家这就是一个消息循环的特征码】

我们跟进这个CALL下断点,发现这个CALL的调用是在我们之前断点之前的(这当然是理所当然的了,因为我们是通过堆栈的栈底找到的这里)

我直接使用F8尝试步过这个函数,发现界面上的消息还是没有撤回,说明这里还不是真正我们要的入口。那么在汇编代码窗口网上寻找,找到主函数入口,并且下断点。
微信防撤回是怎么实现的?_第8张图片
撤回的时候,任然能够被断下。
直接修改汇编,push ebp 为 ret

暂时步去管会返回到哪里去,我们就先做个尝试,果然消息就不撤回了,并且程序也没有崩溃。

这样我们就轻松定位到了防止撤回的CALL的位置。

在回到那个 LASS SycnMgr,我是如何判断他是一个消息循环的特征字符呢?

在我们找到应该说是最外层调用的撤回函数,再外层就应该是消息循环了把???

不如动动手,追踪一下

微信防撤回是怎么实现的?_第9张图片

这里大概才可以看出是个消息循环吧??
判断消息类型是啥???等等等等。。。

展望

我使用的是最新版的 2.8的版本,有兴趣的小伙伴可以跟我一起研究。

本文只用于技术交流,法律边界不可触碰

你可能感兴趣的:(程序逆向之美)