首页
/ RevokeMsgPatcher微信修改器:WechatModifier核心实现原理

RevokeMsgPatcher微信修改器:WechatModifier核心实现原理

2026-02-04 04:34:09作者:裘旻烁

前言:微信防撤回的技术挑战

你是否曾经遇到过这样的场景:在微信PC端收到重要消息后,对方突然撤回,让你错失关键信息?RevokeMsgPatcher项目正是为了解决这一痛点而生。作为一款专业的十六进制编辑器,它通过修改微信核心DLL文件来实现消息防撤回功能。本文将深入解析WechatModifier模块的核心实现原理,带你了解Windows平台二进制补丁技术的精髓。

项目架构概览

RevokeMsgPatcher采用模块化设计,WechatModifier作为核心组件之一,负责处理微信客户端的修改逻辑。整个系统架构如下:

classDiagram
    class AppModifier {
        +FindInstallPath() string
        +GetVersion() string
        +InitEditors() bool
        +ValidateAndFindModifyInfo() void
        +Patch() bool
        +Restore() bool
    }
    
    class WechatModifier {
        +FindInstallPath() string
        +GetRealInstallPath() string
        +GetVersion() string
    }
    
    class FileHexEditor {
        +FileName
        +FilePath
        +FileVersion
        +FileSHA1
        +Backup()
        +Patch() bool
        +Restore() void
    }
    
    class ModifyFinder {
        +FindChanges() List~Change~
        +FindReplacedFunction() SortedSet~string~
    }
    
    AppModifier <|-- WechatModifier
    AppModifier --> FileHexEditor
    FileHexEditor --> ModifyFinder

核心实现原理深度解析

1. 文件定位与验证机制

WechatModifier首先需要准确找到微信安装目录,其采用多级定位策略:

public override string FindInstallPath()
{
    // 1. 注册表查找
    string installPath = PathUtil.FindInstallPathFromRegistry("Wechat");
    string realPath = GetRealInstallPath(installPath);
    
    // 2. 默认路径遍历
    if (string.IsNullOrEmpty(realPath))
    {
        List<string> defaultPathList = PathUtil.GetDefaultInstallPaths(@"Tencent\Wechat");
        foreach (string defaultPath in defaultPathList)
        {
            realPath = GetRealInstallPath(defaultPath);
            if (!string.IsNullOrEmpty(realPath)) return defaultPath;
        }
    }
    return realPath;
}

针对微信3.5.0.4版本后的目录结构变化,项目实现了智能路径识别:

private string GetRealInstallPath(string basePath)
{
    if (IsAllFilesExist(basePath)) return basePath;
    
    // 按修改时间倒序查找最新版本目录
    DirectoryInfo[] directories = new DirectoryInfo(basePath).GetDirectories();
    PathUtil.SortByLastWriteTimeDesc(ref directories);
    
    foreach (DirectoryInfo folder in directories)
    {
        if (IsAllFilesExist(folder.FullName)) return folder.FullName;
    }
    return null;
}

2. 版本匹配与特征码识别

WechatModifier支持两种补丁方式:精确版本匹配和特征码匹配。

精确版本匹配(SHA1校验)

{
  "Name": "WeChatWin.dll",
  "Version": "3.3.5.25",
  "SHA1Before": "3e94753ccbc2799d98f3c741377e99bdae33b4cf",
  "SHA1After": "ab98f83fc16674ac4911380882c79c3ca4c2fd71",
  "Changes": [
    {"Position": 3413977, "Content": [235]},
    {"Position": 12159591, "Content": [235]}
  ]
}

特征码匹配(通用版本支持)

{
  "Name": "WeChatWin.dll",
  "StartVersion": "4.0.3.0",
  "EndVersion": "",
  "ReplacePatterns": [
    {
      "Search": [117,33,72,184,114,101,118,111,107,101,109,115,72,137,5,63,63,63,63,102,199,5,63,63,63,63,103,0,198,5,63,63,63,63,1,72,141],
      "Replace": [235,33,72,184,114,101,118,111,107,101,109,115,72,137,5,63,63,63,63,102,199,5,63,63,63,63,103,0,198,5,63,63,63,63,1,72,141],
      "Category": "防撤回"
    }
  ]
}

3. 字节级修改引擎

核心修改逻辑在FileUtil.EditMultiHex方法中实现:

public static void EditMultiHex(string path, List<Change> changes)
{
    using (var stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite))
    {
        foreach (Change change in changes)
        {
            stream.Seek(change.Position, SeekOrigin.Begin);
            foreach(byte b in change.Content)
            {
                // 跳过通配符(0x3F)
                if(b == 0x3F)
                {
                    stream.ReadByte();
                }
                else
                {
                    stream.WriteByte(b);
                }
            }
        }
    }
}

4. 智能特征码匹配算法

ModifyFinder使用Boyer-Moore算法的变种进行高效特征码搜索:

public static List<Change> FindChanges(string path, List<ReplacePattern> replacePatterns)
{
    byte[] fileByteArray = File.ReadAllBytes(path);
    List<Change> changes = new List<Change>();
    
    foreach (ReplacePattern pattern in replacePatterns)
    {
        int[] matchIndexs = FuzzyMatcher.MatchAll(fileByteArray, pattern.Search);
        if (matchIndexs.Length >= 1)
        {
            for (int i = 0; i < matchIndexs.Length; i++)
            {
                if (!FuzzyMatcher.IsEqual(fileByteArray, matchIndexs[i], pattern.Replace))
                {
                    changes.Add(new Change(matchIndexs[i], pattern.Replace));
                }
            }
        }
    }
    return changes;
}

关键技术细节解析

1. 防撤回原理分析

微信的撤回功能本质上是在客户端执行的逻辑判断。通过分析WeChatWin.dll,可以发现撤回相关的关键函数:

版本范围 特征码类型 修改内容 功能描述
4.0.3.0+ 新防撤回 JE→JMP 跳过撤回判断逻辑
3.9.0.0-4.0.3.0 老防撤回 JZ→JMP 修改条件跳转
3.7.0.0-3.8.1.0 带提示防撤回 多字节替换 同时防撤回并保留提示

2. 多开功能实现

多开功能的实现原理是修改互斥体(Mutex)检查逻辑:

// 特征码示例:多开功能
Search: [85,86,87,83,72,129,236,63,63,63,63,72,141,172,36,63,63,63,63,72,199,133,63,63,63,63,254,255,255,255,72,199,133,63,63,63,63,0,0,0,0,185,96,0,0,0]
Replace: [195,86,87,83,72,129,236,63,63,63,63,72,141,172,36,63,63,63,63,72,199,133,63,63,63,63,254,255,255,255,72,199,133,63,63,63,63,0,0,0,0,185,96,0,0,0]

3. 安全备份与恢复机制

项目采用.h.bak后缀进行文件备份,确保操作可逆:

public void Backup()
{
    // 不覆盖同版本的备份文件
    if (File.Exists(FileBakPath))
    {
        if (FileVersion != BackupFileVersion)
        {
            File.Copy(FilePath, FileBakPath, true);
        }
    }
    else
    {
        File.Copy(FilePath, FileBakPath, true);
    }
}

版本兼容性处理策略

WechatModifier针对不同微信版本采用智能适配策略:

微信版本 支持功能 技术方案 备注
2.6.x-2.8.x 基础防撤回 精确位置修改 早期版本支持
3.0.x-3.4.x 防撤回+多开 特征码匹配 功能扩展期
3.5.x-3.9.x 多功能支持 多特征码体系 成熟期
4.0.x+ 新架构适配 动态特征识别 持续更新

错误处理与用户提示

项目实现了完善的错误处理机制:

// 特征码匹配数验证
if (matchNum < replacePatterns.Count)
{
    Tuple<bool, SortedSet<string>> res = IsAllReplaced(fileByteArray, replacePatterns);
    if (res.Item1)
    {
        throw new BusinessException("match_already_replace", 
            "特征比对:当前应用已经安装了对应功能的补丁!");
    }
    else
    {
        throw new BusinessException("match_inconformity", 
            $"特征比对:当前特征码匹配数[{matchNum}]和期望的匹配数[{replacePatterns.Count}]不一致");
    }
}

技术挑战与解决方案

1. 版本碎片化问题

微信更新频繁,每个版本的文件结构都可能变化。解决方案:

  • 建立版本数据库,收录各个版本的特征码
  • 实现动态特征码提取和验证机制
  • 采用通配符(0x3F)处理可变字节

2. 防检测机制

为避免被微信检测到修改,采用:

  • 最小化修改原则,只修改关键跳转指令
  • 保持文件SHA1校验的合理性
  • 提供完整的恢复功能

3. 多架构适配

支持x86和x64架构,处理不同指令集:

  • 32位系统:使用近跳转(JMP rel8/rel32)
  • 64位系统:适应更长的指令编码

总结与展望

WechatModifier作为RevokeMsgPatcher的核心组件,展现了Windows平台二进制修改技术的高水平实现。通过深入分析微信客户端的内部机制,项目团队成功实现了:

  1. 精准定位:智能识别微信安装路径和版本信息
  2. 安全修改:基于特征码的可靠补丁方案
  3. 全面兼容:支持从2.6.x到4.x的全版本系列
  4. 用户友好:完善的错误处理和恢复机制

未来可能的发展方向包括:

  • 云特征码数据库,实时更新最新版本支持
  • 机器学习辅助的特征码识别
  • 更安全的修改验证机制
  • 跨平台支持(如macOS版微信)

通过本文的技术解析,相信读者对Windows二进制补丁技术有了更深入的理解。RevokeMsgPatcher项目不仅解决了实际使用痛点,更为我们展示了软件逆向工程的精妙之处。

登录后查看全文
热门项目推荐
相关项目推荐