1、申 请 I D:浩劫者12345
2、个人邮箱:3112611479@qq.com
3、原创技术文章:去除QQ回复消息时自动加@
Github: https://github.com/haojiezhe12345/PCQQTweaks/blob/main/tutorials/NoReplyAt.md
haojiezhe12345 为本人GitHub账号
使用 Cheat Engine 打开QQ进程, 搜索聊天框输入的字符串, 注意勾选 UTF-16
(为了避免网络IO造成打断点时卡死, 建议先把QQ调成离线模式)

改变字符串, 继续搜索, 直到找到两个地址为止

尝试在CE修改字符串, 其中一个可以成功回显

删除聊天框内所有文字, 然后右键那个地址, 查找写入操作

这个时候右键回复一条消息, 就会出现访问那个地址的操作

选择 39702610 - 88 07 - mov [edi],al
添加到代码列表, 以便后续定位

为了保证不出现多余操作, 先清空QQ聊天框
然后在反汇编中给 mov [edi],al
打断点

再次回复消息之后, 触发断点


接下来一直点Run, 直到调用栈里面看到 AppFramework.dll+2A98B
为止
然后双击跳转到那个函数地址, 往上翻一行, 把 call edi
加入代码列表
(经验之谈, 我也是试了很多次才发现这个函数打断点方便)

回到 riched20.dll+2610
, 取消断点

给 AppFramework.dll+2A98B
打断点, 然后回复自己
(这里利用的原理是回复自己的时候是不带@的)

回复自己的时候会触发两次 (也有可能是三次) 断点
可以看到这里已经出现一个很可疑的函数了, AppUtil.MsgReplyHelper::InsertReplyOleCtrl+20E
但我们并不对它研究 (这个估计是UI的handler, 我研究过了没什么用)

我们记录下这两次断点的调用栈


然后删除聊天框文本
(注意, 此时你打过断点, 那么删除文本也会触发断点, 也需要点一次Run)
然后回复别人的消息

回复别人会触发五次断点, 我们也是把调用栈都记下来
(第二次和第三次调用栈完全一样, 这里忽略)




对比发现, 回复自己和别人, 前两次调用栈完全一致
但是回复别人触发的第4次断点, 调用栈有点不一样
(左边是第1次, 右边是第4次)

这里已经可以判断第4次触发断点的操作就是添加回复@
而第4次断点中, 没有走 MsgMgr.dll+52C47
, 而是走了 MsgMgr.dll+52D0E
那么我们的思路就是让 MsgMgr.dll+52D0E
不触发就行了
我们跳转到 MsgMgr.dll+52D0E
, 发现前面有一个判断语句, 符合条件则触发 call dword ptr [edx+10]
函数调用

想要 call dword ptr [edx+10]
不触发, 只需要改一下前面的判断语句
把 je MsgMgr.dll+52D0E
改为 jmp MsgMgr.dll+52D0E
, 无论什么条件都跳过执行下面那块

至此, 破解成功

接下来手动修补DLL
请注意先备份原DLL
把修补前和修补后的字节码记下来
修补前, 85 C0 74 16 FF 75 F4
修补后, 85 C0 EB 16 FF 75 F4

然后用十六进制编辑器打开 MsgMgr.dll
(这里使用WinHex)
查找字节 (注意去掉空格), 搜索方向为全部

找到一条匹配结果, 把 74
改为 EB
, 保存即可
然后关闭QQ, 替换掉 QQ.exe
同目录下的 MsgMgr.dll
即可