使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)

标题:使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)
作者:猫猫、有点乖

0x00 前述

QQ,作为一款即时通讯工具,现在已被很多人使用,对于 90 后来说(包括我),它记录了我们逝去的青春(现在 QQ 大多数是 00 后在玩),相信你也有所体会。在最近 QQ 举办的 20 周年的一个活动中(时光穿梭),无疑又激起你从前的记忆。

在 QQ 使用过程中,总是会发现一些人在发完信息之后撤销,这让我们这些不是一直盯着聊天窗口查看聊天信息的感觉不爽,所以作为逆向分析工程师的我选择分析一下撤销功能,将其改掉,这样再怎么撤销都不怕了 o( ̄︶ ̄)o,是不是觉得很过瘾,很刺激?

0x01 收集信息

其实在做这个之前,让我想到了 QQ 中的勋章墙加速软件,最早我是在爱 Q 生活网上看到的,现在还能在爱 Q 上搜的到,关键字勋章墙,如下:
使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)
只要运行那个软件,那么你的 QQ 就能自动完成勋章墙加速(不需要按照它上面面要求下载软件),软件界面如下:
使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)
那个时候我还不懂逆向,不知道那个软件到底做了什么,这也让我一直想不明白,但是有一个东西让我印象非常深刻,那就是这个软件会对 im.dll 这个 dll 文件做手脚(听其他群友说,一直在讨论这个文件),而且一旦 QQ 版本更新,它那个软件也要更新,工作原理就是替换 im.dll 文件。该文件位于 QQ 安装目录下的 Bin 目录下,各位 Q 友可以去查看下 ^ _ ^。
使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)
我现在这个 QQ 版本为 9.1.2,如下:
使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)

0x02 初窥门径

为什么之前我一直在讲这个 im.dll 文件呢?原因是本文章主题就与这个文件有关,也就是说 QQ 上的撤销功能也与这个 im.dll 文件有关,其实这个是我试出来的,为什么这么说,因为你可以这样想,QQ 要用到这个 dll 文件,想必调用了这个 dll 中某个导出函数,那具体调用哪个函数还不清楚,但是不妨看下这个 dll 文件中有哪些导出函数,如下(用 LoadPE 工具查看):
使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)
在上面你会发现有 5 个导出函数,其中有 4 个导出函数是 COM 组件标配(图中用红色圈起来的),所以可以确定是 COM 组件(COM 组件是 windows 下抽象于二进制层的 API 接口,可以适应各种编程语言,包括 C++、C#、VB 等,比 SDK API 适应性更强)。

0x03 略有小成

有了前面一些信息后,打开 x32dbg,附加 QQ,因为 QQ 为 32 位程序,所以就用 x32dbg 来分析,如下:
使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)
附加后,点击符号,我们需要在符号选项卡下面寻找 im.dll 模块,如下:
使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)
在最下面搜索下去搜索 im.dll,双击进去,进入到 im.dll 模块内,如下:
使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)
进去怎么做,当然去寻找与撤销相关的 API 函数,如何找?当然去找与撤销有关的英文,撤销英文为 Revoke,所在右击点搜索在当前模块搜索字符串 Revoke,如下:
使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)
Revoke 字段搜出来的有这么多,具体会调用哪一个也不清楚,我们可以在上面右击选择全部下断,如下:
使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)
下断之后,地址一栏会全部变为红色,接下来我们需先让 QQ 跑起来,按 F9 运行,再次登录另一个 QQ,用作测试,在发送并撤回后,x32dbg 断在如下地方:
使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)
接下来就去寻找撤回有关 CALL,经过几番调试,发现在断点处下方不远处有一个 CALL 与撤回有关(请各位亲自去调试每个 CALL),如下:
使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)
在地址 57B2EF97 处本来是 PUSH,再去调用下面的 CALL,而我这里把它改成 JMP,直接跳转到 CALL 下一条指令,也就是说不让它执行这个 CALL,我这个地址可能与你的地址不一样,因为有随机基址存在,请各位在这里注意一下,改完之后,将其他断点取消掉,按 F9 运行起来,如下:
使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)
小猪猪给猫猫、有点乖发了条消息测试,猫猫、有点乖收到了,但小猪猪这边撤销了,然而在猫猫、有点乖这边却依然显示着,这样就成功实现了好友之间防消息撤回。

回到 x32dbg 上,我们需要将这条修改后的指令以打补丁的方式打到 im.dll 上,如下:
使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)
在补丁界面上,选择修复,再选择 Bin 目录下的 im.dll 文件,建议备份原文件,打完之后重启 QQ 就行了。

0x04 驾轻就熟

在打完上述补丁后,只对好友之间有用,但是对于 QQ 群来说无效,所以本小节来实现 QQ 群消息防撤回(不管是你自己发的消息撤回还是群管理、群主撤回),文件还是上面提到的 im.dll,我们还需要在这个文件上作文章,在之前需要准备下,用其中一个号临时建一个 QQ 群来做测试,在这里我已为大家做好,前面几步操作还是和上述一样,附加,找 im.dll 模块,进入模块内,在模块内搜索 Revoke 关键字,找到后全部下断,按 F9 让 QQ 运行起来,在群里发一条消息并撤回,会发现 x32dbg 断在如下地方:
使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)
同样也是对附近的 CALL 逐一测试,这里需要耐心,经过反复推敲和测试(我找了好久),发现在群消息撤回在如下关键点:
使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)
只需将 JNE 改为 JMP,然后打补丁,如下:
使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)
打完补丁后,重启 QQ,登上测试号,测试如下:
使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)
小猪猪在 helloworld 群里连续发了几条消息,但只撤回其中 4 条,另外在猫猫、有点乖这边却依然显示,是不是很神奇?

0x05 结语

通过以上分析,总结如下:

  • 一定要有耐心(群消息撤回找了我好久才找到);
  • 要学会细心观察;
  • 心情不要过于急躁,一急躁注定失败;

好了,本篇文章也就到此结束了。
(本文完)