逆向工程深度解析:如何通过二进制补丁实现微信QQ消息防撤回
【免费下载链接】RevokeMsgPatcher:trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了)项目地址: https://gitcode.com/GitHub_Trending/re/RevokeMsgPatcher
RevokeMsgPatcher 是一款基于逆向工程和二进制补丁技术的Windows平台防撤回工具,通过修改微信的WeChatWin.dll和QQ/TIM的IM.dll文件,巧妙绕过消息撤回检测机制。该工具采用模块化架构设计,支持多版本兼容性处理,为技术爱好者提供了一套完整的二进制修改解决方案。
消息撤回机制的技术挑战
在即时通讯软件中,消息撤回功能通常通过客户端与服务器协同实现。当用户撤回消息时,客户端会执行特定逻辑来隐藏或删除已发送的消息。对于微信和QQ这类闭源软件,实现防撤回功能需要深入分析其二进制文件,定位关键代码段并进行修改。
传统的手动逆向分析过程复杂且容易出错,需要开发者在每次软件更新后重新分析二进制文件。RevokeMsgPatcher通过自动化的二进制模式匹配技术,解决了版本兼容性和维护成本的问题。
二进制补丁技术实现原理
核心修改机制
防撤回功能的核心在于修改条件跳转指令。在x86/x64汇编中,条件跳转指令如JE(Jump if Equal)和JMP(Unconditional Jump)的区别在于前者仅在特定条件满足时跳转,而后者总是跳转。
// 在 RevokeMsgPatcher/Model/ReplacePattern.cs 中定义的替换模式 public class ReplacePattern { public byte[] Search { get; set; } // 搜索的字节模式 public byte[] Replace { get; set; } // 替换的字节模式 public string Category { get; set; } // 功能分类:防撤回/多开 }以微信WeChatWin.dll为例,典型的防撤回修改是将0x74(JE指令)替换为0xEB(JMP指令),将条件跳转变更为无条件跳转,从而绕过撤回检测逻辑。
使用x32dbg调试器分析微信WeChatWin.dll中的revokemsg相关字符串
版本兼容性数据库
RevokeMsgPatcher通过详细的版本数据库支持多版本兼容。在 RevokeMsgPatcher.Assistant/Data/ 目录中,每个版本都有对应的补丁配置文件:
{ "Name": "WeChatWin.dll", "Version": "3.3.5.25", "SHA1Before": "3e94753ccbc2799d98f3c741377e99bdae33b4cf", "SHA1After": "ab98f83fc16674ac4911380882c79c3ca4c2fd71", "Changes": [ {"Position": 3413977, "Content": [235]}, {"Position": 12159591, "Content": [235]} ] }每个补丁记录包含文件哈希验证、修改位置和替换内容,确保补丁的精确性和安全性。
架构设计与模块实现
核心修改器模块
项目的核心修改器位于 RevokeMsgPatcher/Modifier/ 目录,采用面向对象设计:
WechatModifier.cs- 微信防撤回实现QQModifier.cs- QQ防撤回实现TIMModifier.cs- TIM防撤回实现FileHexEditor.cs- 二进制文件编辑器基类
每个修改器继承自AppModifier基类,实现了统一的文件验证、补丁应用和版本检测接口。
x32dbg补丁窗口显示具体的二进制指令修改
模式匹配算法
在 RevokeMsgPatcher/Matcher/ 目录中,BoyerMooreMatcher.cs和FuzzyMatcher.cs实现了高效的二进制模式匹配算法:
// Boyer-Moore算法优化搜索性能 public static int IndexOf(byte[] source, byte[] pattern) { // 预处理坏字符表 int[] badCharSkip = new int[256]; for (int i = 0; i < 256; i++) badCharSkip[i] = pattern.Length; for (int i = 0; i < pattern.Length - 1; i++) badCharSkip[pattern[i]] = pattern.Length - i - 1; // 执行搜索 int offset = 0; while (offset <= source.Length - pattern.Length) { // 从后向前匹配 int j = pattern.Length - 1; while (j >= 0 && pattern[j] == source[offset + j]) j--; if (j < 0) return offset; // 找到匹配 offset += Math.Max(1, badCharSkip[source[offset + j]] - (pattern.Length - 1 - j)); } return -1; }数据模型设计
项目的核心数据模型在 RevokeMsgPatcher/Model/ 目录中定义:
ModifyInfo.cs- 精确版本补丁信息CommonModifyInfo.cs- 通用版本范围补丁信息ReplacePattern.cs- 字节模式替换规则Change.cs- 具体修改位置和内容
这种设计支持两种补丁方式:基于精确版本SHA1校验的精确补丁和基于字节模式匹配的通用补丁。
逆向工程实践步骤
1. 字符串定位与分析
首先使用逆向工具(如x32dbg、IDA Pro)搜索关键字符串如"revokemsg"、"撤回消息"等,定位相关函数:
x32dbg调试器附加到QQ进程进行逆向分析
2. 二进制模式提取
分析找到的函数,识别关键的条件跳转指令。例如,在消息撤回检测函数中通常会有类似以下模式的代码:
cmp eax, 0 ; 比较返回值 je 撤回处理函数 ; 如果相等则跳转到撤回处理对应的二进制模式可能是83F800 740A(比较eax与0,如果等于则跳转10字节)。
3. 补丁规则定义
将识别出的模式转换为ReplacePattern对象:
var antiRecallPattern = new ReplacePattern { Search = new byte[] { 0x83, 0xF8, 0x00, 0x74, 0x0A }, // cmp eax,0; je +10 Replace = new byte[] { 0x83, 0xF8, 0x00, 0xEB, 0x0A }, // cmp eax,0; jmp +10 Category = "防撤回" };4. 多版本兼容性处理
通过分析不同版本的二进制文件,建立版本范围与补丁规则的映射关系:
{ "Name": "WeChatWin.dll", "StartVersion": "3.9.0.0", "EndVersion": "3.9.2.0", "ReplacePatterns": [ { "Search": [133,192,116,50,185,63,63,63,63,138], "Replace": [133,192,235,50,185,63,63,63,63,138], "Category": "防撤回(老)" } ] }技术实现细节
文件哈希验证机制
在应用补丁前,工具会计算目标文件的SHA1哈希值,与预定义的SHA1Before值比对,确保文件未被篡改:
public bool VerifyFileIntegrity(string filePath, string expectedSHA1) { using (var sha1 = SHA1.Create()) using (var stream = File.OpenRead(filePath)) { byte[] hash = sha1.ComputeHash(stream); string actualSHA1 = BitConverter.ToString(hash).Replace("-", ""); return actualSHA1.Equals(expectedSHA1, StringComparison.OrdinalIgnoreCase); } }安全备份与恢复
工具在修改前会自动备份原始文件,备份文件以.bak后缀保存。如果补丁失败或用户需要恢复,可以通过备份还原功能恢复原始文件。
将JE指令修改为JMP指令实现无条件跳转
多开功能实现
除了防撤回,工具还提供微信多开功能。这是通过修改互斥体检查逻辑实现的:
{ "Search": [85,86,87,83,72,129,236,63,63,63,63], "Replace": [195,86,87,83,72,129,236,63,63,63,63], "Category": "多开" }将函数入口的PUSH EBP(0x55)改为RET(0xC3),使互斥体检查函数直接返回,绕过单实例限制。
项目架构优势
模块化设计
项目采用清晰的模块分离:
- 核心修改器:处理不同应用的特定逻辑
- 匹配算法:提供高效的二进制搜索
- 数据管理:维护版本兼容性数据库
- 用户界面:提供友好的图形化操作
可扩展性
通过配置文件驱动的设计,新版本的补丁可以通过更新JSON配置文件实现,无需修改核心代码。这种设计使得社区贡献和维护变得更加容易。
安全性考虑
- 哈希验证:确保目标文件未被篡改
- 备份机制:提供安全的回滚选项
- 版本检测:避免不兼容的补丁应用
- 权限控制:需要管理员权限运行,确保文件访问安全
技术挑战与解决方案
版本碎片化问题
微信和QQ频繁更新导致版本碎片化严重。解决方案是建立详细的版本数据库,支持从旧版本到最新版本的连续补丁链。
二进制差异处理
不同编译环境可能产生微小的二进制差异。工具使用模糊匹配算法,支持通配符(0x3F)匹配任意字节,提高匹配成功率。
性能优化
对大文件(如WeChatWin.dll超过100MB)进行二进制搜索需要高效算法。Boyer-Moore算法将搜索复杂度从O(n*m)优化到O(n/m),显著提升性能。
总结与展望
RevokeMsgPatcher展示了逆向工程和二进制补丁技术的实际应用,为Windows平台即时通讯软件的定制化修改提供了完整解决方案。通过模块化架构、版本兼容性管理和安全的补丁机制,该项目在技术深度和工程实践上都达到了较高水平。
RevokeMsgPatcher图形化界面,支持微信、QQ、TIM的防撤回和多开功能
对于技术爱好者而言,该项目不仅是实用的工具,更是学习逆向工程、二进制分析和Windows平台开发的优秀案例。通过分析其源码和实现原理,可以深入理解现代软件保护机制和相应的绕过技术。
随着即时通讯软件安全机制的不断加强,防撤回技术也需要持续演进。未来的发展方向可能包括更智能的模式识别、云端补丁数据库同步以及对新架构(如ARM64)的支持。
【免费下载链接】RevokeMsgPatcher:trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了)项目地址: https://gitcode.com/GitHub_Trending/re/RevokeMsgPatcher
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考