huiyadanli/RevokeMsgPatcher · error · BusinessException

match_part_replace

match_part_replace

Error message

特征比对:部分特征已经被替换,请确认是否有使用过其他防撤回/多开补丁!

What it means

matchNum >= expected but matchNum != changes.Count and changes.Count > 0: some matched positions already equal the replace bytes while others still need patching. FindChanges throws BusinessException('match_part_replace'), suggesting a third-party anti-recall / multi-open patcher altered part of the file.

Source

Thrown at RevokeMsgPatcher/Matcher/ModifyFinder.cs:79

                            $"出现此种情况的一般有如下可能:\n" +
                            $"1. 你可能已经安装了某个功能的补丁,请选择未安装功能进行安装。\n" +
                            $"2. 如果当前版本为最新版本,特征码可能出现变化(可能性比较低),请联系作者处理。");
                    }
                }
            }
            else
            {
                // 匹配数和需要替换的数量不一致时,可能时部分/所有特征已经被替换
                if (matchNum != changes.Count)
                {
                    // 此逻辑在当前特征配置下不会进入,因为查找串和替换串当前全部都是不相同的
                    if (changes.Count == 0)
                    {
                        throw new BusinessException("match_already_replace", "特征比对:当前应用已经安装了所选功能补丁!");
                    }
                    else
                    {
                        throw new BusinessException("match_part_replace", "特征比对:部分特征已经被替换,请确认是否有使用过其他防撤回/多开补丁!");
                    }

                }
                else
                {
                    // 匹配数和需要替换的数量一致时才是正常状态
                    return changes;
                }
            }
        }

        public static SortedSet<string> FindReplacedFunction(string path, List<ReplacePattern> replacePatterns)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            byte[] fileByteArray = File.ReadAllBytes(path);
            Console.WriteLine("读取文件耗时:{0}ms.", sw.Elapsed.TotalMilliseconds);
            Tuple<bool, SortedSet<string>> res = IsAllReplaced(fileByteArray, replacePatterns);

View on GitHub (pinned to 89cbbb3f0c)

Solutions

  1. Restore the original DLL from a clean source (the tool's restore, or a fresh DLL).
  2. Remove other patchers' modifications before using this tool.
Defensive patterns

Strategy: try-catch

Type guard

static bool IsBusinessException(Exception e, string code) => e is BusinessException b && b.ErrorCode == code;

static bool IsPartReplaced(Exception e) => IsBusinessException(e, "match_part_replace");

Try / catch

try
{
    editor.TargetChanges = ModifyFinder.FindChanges(editor.FilePath, replacePatterns);
}
catch (BusinessException ex) when (ex.ErrorCode == "match_part_replace")
{
    // Partly patched by another tool: require a clean restore first.
    MessageBox.Show("检测到部分特征已被替换,请先还原原始文件。");
}

Prevention

When it happens

Trigger: A prior different patcher (or an older version of this tool) replaced some but not all signature locations, leaving the file in a half-patched state.

Common situations: Used another WeChat/QQ multi-open or anti-recall tool before this one; mixed usage of patchers.

Related errors


AI-assisted analysis of huiyadanli/RevokeMsgPatcher@89cbbb3f0c (2026-08-13). Data as JSON: /api/errors/38df39d0255f5ef0. Report an issue: GitHub.