huiyadanli/RevokeMsgPatcher
:trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了)
Single-maintainer risk — review before adopting
copyleft license (GPL-3.0) — review compatibility; top contributor handles 94% of recent commits…
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ⚠Single-maintainer risk — top contributor 94% of recent commits
- ⚠GPL-3.0 is copyleft — check downstream compatibility
- ⚠No test directory detected
- ⚠Scorecard: default branch unprotected (0/10)
- ✓Last commit 3d ago
- ✓5 active contributors
- ✓GPL-3.0 licensed
- ✓CI configured
What would improve this?
- →Use as dependency Concerns → Mixed if: relicense under MIT/Apache-2.0 (rare for established libs)
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests + OpenSSF Scorecard
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Forkable" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/huiyadanli/revokemsgpatcher)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card
This card auto-renders when someone shares https://repopilot.app/r/huiyadanli/revokemsgpatcher on X, Slack, or LinkedIn.
Ask AI about huiyadanli/RevokeMsgPatcher
Grounded in the actual source code. Pick a starter question or write your own.
Onboarding doc
Onboarding: huiyadanli/RevokeMsgPatcher
Generated by RepoPilot · 2026-06-19 · Source
🎯Verdict
WAIT — Single-maintainer risk — review before adopting
- Last commit 3d ago
- 5 active contributors
- GPL-3.0 licensed
- CI configured
- ⚠ Single-maintainer risk — top contributor 94% of recent commits
- ⚠ GPL-3.0 is copyleft — check downstream compatibility
- ⚠ No test directory detected
- ⚠ Scorecard: default branch unprotected (0/10)
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests + OpenSSF Scorecard</sub>
⚡TL;DR
RevokeMsgPatcher is a C# hex editor that patches Windows PC versions of WeChat, QQ, and TIM to prevent message recall/revocation. It modifies core DLLs (WeChatWin.dll for WeChat, IM.dll for QQ/TIM) by patching conditional jump instructions (je → jmp) at specific memory offsets to disable the message deletion handler, making deleted messages remain visible to the recipient. Single C# WinForms application with a companion Assistant project. Main structure: core patching logic (implied in root project files) handles DLL hex patching, UI for selecting install paths (auto-detects via Windows Registry for installed versions), and a RevokeMsgPatcher.Assistant subdirectory storing version-specific patch configurations as JSON in Data/0.7/patch.json and Data/0.8/patch.json.
👥Who it's for
Windows PC users of WeChat, QQ, or TIM who want to see messages even after the sender attempts to recall them. Secondary audience: security researchers and reverse engineers studying Windows messaging applications and DLL patching techniques.
🌱Maturity & risk
Actively maintained with v2.1 as the latest release. The project has GitHub Actions CI/CD configured (.github/workflows/build.yml), multiple versioned patch datasets (0.7, 0.8+), and extensive wiki documentation with screenshots for each major version. However, it remains inherently fragile: each WeChat/QQ/TIM update may break patches, requiring rapid version-specific patch updates.
High fragility risk: patches are version-specific binary offsets that break immediately when target applications update, creating a cat-and-mouse maintenance cycle. Single maintainer (huiyadanli) provides all patch data. Requires administrator privilege and DLL modification, triggering antivirus alerts. No automated test suite evident in file structure, so patch validity relies on manual user reports.
Active areas of work
No recent commit data visible in file list, but the presence of versioned patch.json files (0.7, 0.8) and build.yml workflow suggests ongoing patch maintenance as WeChat/QQ/TIM release updates. The project likely waits for user reports of broken patches, then publishes new patch offsets.
🚀Get running
Clone the repo: git clone https://github.com/huiyadanli/RevokeMsgPatcher.git. Open RevokeMsgPatcher.sln in Visual Studio (requires C# tooling and .NET Framework 4.5.2+). Build the solution. Run the compiled executable with administrator privileges. Patches are fetched at runtime from the Data/ subdirectories.
Daily commands: Execute the compiled .exe with administrator privileges. The UI prompts for WeChat/QQ/TIM install path (auto-detected from HKEY_LOCAL_MACHINE registry on installed versions). Click the 防撤回 (anti-revoke) button. No CLI interface or dev server.
🗺️Map of the codebase
- RevokeMsgPatcher.Assistant/Data/0.7/patch.json: Stores version-specific binary patch offsets and replacement instructions for WeChat 0.7; demonstrates the data-driven patching model
- RevokeMsgPatcher.Assistant/Data/0.8/patch.json: Patch dataset for WeChat 0.8+; shows how offsets evolve across versions
- .github/workflows/build.yml: CI/CD pipeline that validates builds and likely publishes releases; critical for version management
- Images/wiki/wechat/: Step-by-step visual documentation of the reverse-engineering process (finding offset via debugger, patching je→jmp, validating with dll viewer)
🛠️How to make changes
To add support for a new app version: update the relevant patch.json in RevokeMsgPatcher.Assistant/Data/{version}/ with new offset + byte-replacement pairs. To modify UI: edit the main WinForms designer in the root project. To add new target application: extend the registry detection logic and add a new patch.json dataset.
🪤Traps & gotchas
Administrator privilege is mandatory; standard user execution silently fails. DLL modifications trigger Windows Defender and third-party antivirus; users must whitelist or the patch may be rolled back. Patches are binary offsets—exact byte positions in DLL files—so even minor app updates (build number) can shift offsets, rendering old patches non-functional. No version mismatch detection; applying wrong patch.json silently corrupts the target DLL. .NET Framework 4.5.2 is a hard requirement; lower versions cause silent startup hangs or crashes.
💡Concepts to learn
- DLL Hex Patching / Binary Patching — Core technique of RevokeMsgPatcher: replacing specific byte sequences in compiled binaries to alter control flow without recompilation; critical to understand what offsets mean and why they break on updates
- Conditional Jump Instruction Mutation (je → jmp) — The specific patching strategy: converting conditional jumps (je = jump if equal) to unconditional jumps (jmp) disables the message revocation handler; understanding x86 assembly is essential to modify or debug patches
- Windows Registry for Application Discovery — RevokeMsgPatcher auto-detects WeChat/QQ/TIM install paths via HKEY_LOCAL_MACHINE registry queries; essential for supporting both installer and portable versions without user friction
- Data-Driven Patching (JSON-based Offset Configuration) — Patches are stored as version-specific JSON (patch.json) rather than hardcoded; allows rapid response to app updates by simply adding new offset/byte pairs without recompiling the tool
- Windows PE (Portable Executable) File Format — WeChat/QQ DLLs are PE binaries; understanding their structure (headers, sections, offsets) is required to safely locate and modify target code regions without corrupting the executable
- Reverse Engineering & Binary Diffing — The off-screen process: comparing consecutive WeChat/QQ versions via hex editor or disassembler to locate shifted offsets when new patches are needed; acknowledged as external work ('本人不参与方法寻找')
- DLL Hijacking / Import Address Table (IAT) Patching — RevokeMsgPatcher 2.0+ uses DLL hijacking to intercept function calls and bypass file verification; alternative to direct hex patching for newer QQNT versions
🔗Related repos
36huo/wechat_anti_revoke— Direct predecessor project acknowledged in README; early prototype for WeChat anti-revoke patching that inspired this rewriteLiteLoaderQQNT/LiteLoaderQQNT— QQNT loader framework previously used by RevokeMsgPatcher 2.0 for QQ patching; alternative DLL injection method for QQ anti-recallxh321/LiteLoaderQQNT-Anti-Recall— LiteLoaderQQNT-compatible anti-recall plugin; different approach (plugin vs. direct DLL hex patch) for QQ on newer versionsLiteLoaderQQNT/QQNTFileVerifyPatch— Companion project providing DLL hijacking method used in RevokeMsgPatcher 2.0+ to bypass file verification
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Create comprehensive patch.json schema documentation and validation
The repo contains multiple patch.json files across versions (0.7-1.8) in RevokeMsgPatcher.Assistant/Data/, but there's no documented schema or validation. A new contributor could create a JSON schema file and add validation logic to ensure patch files are correctly formatted before processing. This prevents runtime errors from malformed patch data.
- [ ] Create RevokeMsgPatcher.Assistant/Data/patch-schema.json documenting the structure of patch.json files
- [ ] Add a schema validation utility in RevokeMsgPatcher.Assistant/ to validate all patch.json files against the schema
- [ ] Add unit tests for the validator using existing patch.json files from versions 0.7-1.8
- [ ] Document the schema in the wiki or README with examples
Add GitHub Actions workflow for validating patch compatibility across versions
The .github/workflows/build.yml exists but there's no automated testing for patch file validity across the 12+ version directories. A contributor could create a new workflow that validates all patch.json files are loadable, have required fields, and tests backward compatibility assertions.
- [ ] Create .github/workflows/validate-patches.yml workflow
- [ ] Add a C# console tool to load and validate each patch.json in RevokeMsgPatcher.Assistant/Data/*/patch.json
- [ ] Verify that newer patches don't break assumptions from older versions
- [ ] Run this workflow on PR changes to Data/ directory
Document WeChat/QQ/TIM version mapping in structured format
The patch files are organized by version numbers (0.7-1.8) but there's no documented mapping showing which WeChat/QQ/TIM application versions these patches apply to. Creating a CSV or JSON mapping file would help users and contributors understand compatibility. The wiki images suggest manual version detection.
- [ ] Create RevokeMsgPatcher.Assistant/Data/version-compatibility.json mapping patch versions to WeChat/QQ/TIM release versions
- [ ] Add a README section in RevokeMsgPatcher.Assistant/ explaining the version mapping
- [ ] Document any known incompatibilities or deprecated patch versions
- [ ] Reference this mapping in the main README for user guidance
🌿Good first issues
- Add automated validation: create a unit test suite that loads patch.json files and verifies offset/bytecode formats, catching malformed patch data before runtime
- Document the reverse-engineering methodology: create a step-by-step guide showing how to extract new offsets from WeChat/QQ DLLs using a hex editor (Ghidra, IDA Free) for future maintainers when new versions break patches
- Implement version detection and warning: modify the UI to auto-detect the installed WeChat/QQ/TIM version and warn users if no matching patch.json exists, preventing silent DLL corruption
⭐Top contributors
Click to expand
Top contributors
- @huiyadanli — 94 commits
- @Constaline — 3 commits
- @1411430556 — 1 commits
- @Deali-Axy — 1 commits
- @MelodySo — 1 commits
📝Recent commits
Click to expand
Recent commits
11a71a9— 更新时间 (huiyadanli)461bb58— Merge branch 'master' of https://github.com/huiyadanli/RevokeMsgPatcher (huiyadanli)e1f6424— 支持微信 4.1.9.30 (huiyadanli)06fec29— Update README.md (huiyadanli)17591ae— 配置 (huiyadanli)5eff714— 微信 4.1.7.26、4.1.7.28、4.1.7.30 验证通过 (huiyadanli)67d184d— fixed (huiyadanli)8bb0491— fix 4.1.6.46 (huiyadanli)9beced6— Merge branch 'master' of github.com:huiyadanli/RevokeMsgPatcher (huiyadanli)e22ceea— weixin 4.1.6.46 (huiyadanli)
🔒Security observations
This application implements aggressive binary patching and process injection techniques to disable message revocation in WeChat/QQ/TIM. The codebase presents significant security concerns including process injection capabilities, lack of cryptographic integrity verification for patches, absence of version validation, and potential privilege escalation risks. The .NET implementation is vulnerable to reverse engineering. While the application may function as intended for the stated purpose, it employs techniques commonly associated with malware and lacks fundamental security controls like code signing and integrity verification. The security posture is significantly below acceptable standards for a system-level utility. Critical security hardening is required before this tool should be considered safe for production use.
- High · Binary Patching of System Applications —
RevokeMsgPatcher.Assistant/Data/*/patch.json, Core patching logic. The application performs runtime patching of WeChat/QQ/TIM executables and DLLs by modifying binary code in memory and on disk. This approach bypasses security mechanisms and could be detected as malware by antivirus software. The patch.json files contain hardcoded byte sequences and offsets that patch core functionality. Fix: Consider using official APIs or plugins provided by these applications instead of binary patching. If patching is necessary, implement code signing and integrity verification mechanisms. - High · Process Injection / DLL Injection Capability —
RevokeMsgPatcher.Assistant/FormAssisant.cs, RevokeMsgPatcher.Launcher. Based on the file structure and README references to attaching to running processes (WeChatWin.dll, process attachment in wiki screenshots), the application performs process injection which is a common privilege escalation and code execution vector. This could allow arbitrary code execution with elevated privileges. Fix: Eliminate process injection techniques. Implement legitimate plugin architectures or request permission through official channels. If unavoidable, implement robust security boundaries and sandboxing. - Medium · Lack of Integrity Verification for Patch Data —
RevokeMsgPatcher.Assistant/Data/*/patch.json files. The patch.json configuration files used to guide binary modifications lack cryptographic signatures or integrity checks. An attacker could modify these JSON files to inject malicious patches into target applications. Fix: Implement digital signatures (HMAC-SHA256 or similar) for all patch.json files. Verify signatures before applying patches. Store public keys securely. - Medium · No Version Validation or Compatibility Checking —
RevokeMsgPatcher.Assistant/Data structure. The patch data includes version-specific patches (0.7 through 2.1) but there's no evidence of robust version validation. Applying patches designed for one version to another could cause crashes, memory corruption, or security issues. Fix: Implement strict version matching with checksums of target binaries before applying patches. Add rollback functionality and backup mechanisms. - Medium · Potential Privilege Escalation —
RevokeMsgPatcher.Launcher, RevokeMsgPatcher.Assistant. The application targets system-level applications (WeChat/QQ/TIM) and modifies their behavior. If run with administrator privileges and contains vulnerabilities, it could lead to privilege escalation attacks affecting the entire system. Fix: Minimize required privileges. Implement UAC prompts with clear security warnings. Validate all user inputs before applying system-level modifications. - Low · Missing Code Obfuscation / Reverse Engineering Risk —
All .cs files. The .NET codebase (CS files visible) is easily decompilable, making it trivial to reverse engineer the patching logic and create malicious variants or understand security mechanisms. Fix: Implement .NET obfuscation tools (ConfuserEx, .NET Reactor) for production builds. Consider code signing for authenticity verification. - Low · GitHub Workflow Exposure —
.github/workflows/build.yml. The build workflow configuration (.github/workflows/build.yml) may expose build secrets, artifact locations, or deployment credentials if not properly configured. Fix: Review GitHub Actions workflows for exposed secrets. Use GitHub Secrets for sensitive credentials. Implement branch protection rules and required status checks.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/huiyadanli/RevokeMsgPatcher shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live huiyadanli/RevokeMsgPatcher
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/huiyadanli/RevokeMsgPatcher.
What it runs against: a local clone of huiyadanli/RevokeMsgPatcher — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in huiyadanli/RevokeMsgPatcher | Confirms the artifact applies here, not a fork |
| 2 | License is still GPL-3.0 | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | Last commit ≤ 33 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of huiyadanli/RevokeMsgPatcher. If you don't
# have one yet, run these first:
#
# git clone https://github.com/huiyadanli/RevokeMsgPatcher.git
# cd RevokeMsgPatcher
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of huiyadanli/RevokeMsgPatcher and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "huiyadanli/RevokeMsgPatcher(\\.git)?\\b" \\
&& ok "origin remote is huiyadanli/RevokeMsgPatcher" \\
|| miss "origin remote is not huiyadanli/RevokeMsgPatcher (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(GPL-3\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"GPL-3\\.0\"" package.json 2>/dev/null) \\
&& ok "license is GPL-3.0" \\
|| miss "license drift — was GPL-3.0 at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 33 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~3d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/huiyadanli/RevokeMsgPatcher"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.
Embed this chat in your README →
Drop this iframe anywhere — the widget runs against the same live analysis cache as the main app.
<iframe src="https://repopilot.app/embed/huiyadanli/RevokeMsgPatcher" width="100%" height="500" style="border:1px solid #d0d7de; border-radius:8px;" allow="microphone" loading="lazy" ></iframe>