ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

防撤回补丁的核心机密:RevokeMsgPatcher特征码匹配实战拆解

防撤回补丁的核心机密:RevokeMsgPatcher特征码匹配实战拆解 防撤回补丁的核心机密RevokeMsgPatcher特征码匹配实战拆解【免费下载链接】RevokeMsgPatcher:trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁我已经看到了撤回也没用了项目地址: https://gitcode.com/GitHub_Trending/re/RevokeMsgPatcher聊天正嗨对方突然甩来一句哎呀发错了然后消息瞬间变成灰色提示某某撤回了一条消息。这种抓心挠肝的时刻你可能想过如果我能看到撤回前的原文就好了。RevokeMsgPatcher 就是干这个的——一款面向 PC 端微信、QQ、TIM 的防撤回补丁工具。它不改服务器、不碰协议而是直接修改本机安装目录里的 DLL 二进制文件让撤回这条指令在客户端侧失效。你甚至能选择带提示模式对方一撤回你这边照样弹出完整内容。听上去很黑科技其实它的原理并不神秘核心就一句话在几十上百兆的二进制文件里精准找到那几行撤回相关的代码改掉它。而这件事最难的部分正是本文要拆解的主题——特征码匹配。发出去的消息对方又撤回了先聊聊这工具解决了什么假设你是开发这个补丁的作者。你的目标文件是微信目录下的WeChatWin.dll体积轻松超过 100MB。你要做的事是找到里面判断消息是否被撤回的那段汇编指令把条件跳转改成无条件跳转或者直接 NOP 掉。问题来了DLL 是编译产物没有人给你源码地图。几千万个字节里你怎么知道撤回逻辑藏在哪里两种思路按版本记坐标每个版本的 DLL 里撤回逻辑都在固定偏移位置。只要提前用调试器分析出每个版本的坐标写进配置文件打补丁时直接按偏移量改即可。缺点是——微信每更新一次坐标就全乱。按特征认指纹不管代码挪到哪那段指令的长相十六进制序列是稳定的。我们不去记位置而是去认特征。这就催生了 RevokeMsgPatcher 的核心模块RevokeMsgPatcher/Matcher/目录下的三个类——BoyerMooreMatcher、FuzzyMatcher和ModifyFinder。项目实际采用了两者结合的双轨制能匹配到 SHA1 的旧版本走精准坐标路线新版本则走特征码匹配路线后者正是让工具在软件频繁更新下依然好用的关键。在几百兆的DLL里大海捞针靠的是这套指纹打法把特征码想成通缉令上的指纹我不需要知道犯人在哪条街只要抓住一个用指纹一比对就知道是不是目标。在二进制世界里指纹就是一小段十六进制字节序列。比如微信老版本里撤回逻辑常以这样一段指令开头33 C0 85 C0 74 32 B9 ...其中74JE等于则跳转就是条件跳转的关键字。补丁要做的事是把它改成EBJMP无条件跳转让是否被撤回的判断永远走显示消息的分支。但这里有个细节同一段代码在不同版本里操作数比如地址偏移经常不同。如果要求整段特征码逐字节一致很多版本就匹配不上了。RevokeMsgPatcher 的解法很聪明——引入通配符。在FuzzyMatcher.cs中0x3F被定义为通配符特征码里凡是不确定的字节用?占位匹配时跳过不比较。配合项目里按版本维护的patch.json配置文件RevokeMsgPatcher.Assistant/Data/下按版本号分目录同一功能可以在不同版本区间各配一套特征码兼容性一下就上来了。照这五步你也能亲手定位并改掉撤回逻辑想知道这套特征码是怎么来的作者其实是用 x32dbg 这类调试器手工分析出来的。整个过程大概是这样的你也可以跟着在虚拟机里复现一遍附加进程启动微信用 x32dbg 附加到WeChat.exe加载WeChatWin.dll模块。下图就是附加前的启动界面和进程选择界面。搜索特征字符串在反汇编窗口里搜索与撤回相关的字符串比如revokemsg这类关键标识定位到引用它的代码附近。找到跳转指令在目标函数里找到JE相等则跳走即执行撤回指令这就是要改的点。改指令把74改成EBJE→JMP让程序永远不执行撤回分支。这一步在工具里是自动完成的但原理就是这样。生成补丁把修改后的代码导出成补丁文件记录下这段字节序列——它就是将来特征码匹配的指纹素材。手工改一次不难难的是把这件事自动化。我们来还原一下程序内部的匹配流程核心代码见RevokeMsgPatcher/Matcher/FuzzyMatcher.cs和ModifyFinder.cs1. 读取整个 DLL 文件到内存 2. 对每条替换规则做特征码匹配 a. 从特征码里提取通配符之前的头串 b. 用 Boyer-Moore 算法在文件里快速找到所有头串出现的位置 c. 对每个候选位置按完整特征码含通配符逐字节验证 3. 校验匹配数量是否和预期一致 4. 若目标位置当前内容与替换串不同则记录为一个修改点 5. 返回所有修改点交给文件编辑器执行替换这里的 Boyer-Moore 算法值得一提它通过坏字符和好后缀两条启发式规则在匹配失败时能一次跳跃多个字节而不是傻乎乎地一位一位挪。对 100MB 的文件来说这决定了一次匹配是毫秒级还是秒级——这也是BoyerMooreMatcher.cs存在的意义。跑起来才会遇到的坑特征码失效、重复打补丁、版本不符真正用过这类工具的人都知道最大的坑不是找不到而是找错了或找过了。RevokeMsgPatcher 在ModifyFinder里做了三层防御值得写补丁的人抄作业坑一软件更新后特征码失效。代码重排、编译器优化都会让特征码对不上。项目的应对是多套特征码按版本区间覆盖配置文件里的StartVersion/EndVersion字段并在匹配失败时抛出匹配数与期望数不一致的明确报错而不是闷头硬改。坑二重复打补丁。用户可能已经打过一次补丁再打一次就会把改过的代码再改一遍。代码里用了一个很妙的反向验证分别用查找串和替换串去匹配文件——如果查找串找不到、替换串却存在说明补丁早已生效直接提示已安装绝不重复写入。坑三装过其他家的补丁。文件被别的工具动过特征码可能对不上但版本号一致。这时工具会抛出文件校验不通过请确认是否使用过其他补丁程序把责任边界划得清清楚楚。此外项目在动手修改前会先做一件保命的事把原始 DLL 备份成*.h.bak文件修改前还会记录 SHA1 校验值ModifyInfo里的SHA1Before/SHA1After。一旦补丁失败可以一键还原。这层先备份、校验再改的机制让工具即使面对不同版本也足够稳健。它为什么比你手动改更靠谱把手工调试的成果固化成一个工具价值不只在省事。手动改一次容易但你要面对每个版本重新分析、特征码变化、改坏了没法还原……而 RevokeMsgPatcher 把这些全部封装成了用户界面上的几个勾选框——选择功能防撤回 / 防撤回带提示 / 多开点击应用补丁剩下的交给匹配引擎。对比一下效果就很直观手工方案每个新版本都要重新逆向分析普通人根本无从下手固定坐标方案一次只能支持一个版本更新即失效特征码匹配方案一套规则覆盖一个版本区间加上通配符容忍小差异新版本发布后通常只需小改配置即可适配。从BoyerMooreMatcher的跳跃式搜索到FuzzyMatcher的通配符匹配再到ModifyFinder的冲突检测这一整套定位→验证→修改→还原的闭环其实也适用于漏洞分析、游戏修改、逆向工程等更广泛的场景。如果你在项目里发现了某个新版本的特征码失效欢迎直接提交 Issue附上版本号和日志如果你想动手改进匹配算法Matcher/目录的代码结构很清晰改起来也不难。多一个人参与就意味着下一次微信更新时防撤回补丁能更快跟上——这大概就是开源工具最动人的地方一个人踩过的坑写进代码就成了所有人的路。【免费下载链接】RevokeMsgPatcher:trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁我已经看到了撤回也没用了项目地址: https://gitcode.com/GitHub_Trending/re/RevokeMsgPatcher创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表