适用环境:Windows x64 / QQNT 9.9.33-52230(wrapper.node 9.8.0.23961) 方案:QQNT.dll 文件校验绕过 + LiteLoaderQQNT 1.4.1(源码部署)+ QQNT-Toolbox(防撤回/本地贴纸) 部署日期:2026-08-25,已实测跑通(QQ 正常启动、插件加载、防撤回与贴纸模块就绪) 本仓库随附全套文件(加载器源码 + 插件安装包 + QQ 官方安装包),全程无需解压任何 zip
所有命令可直接复制到 PowerShell 执行;本仓库已部署完成时,此节仅用于换机/重装。
- 64 位(本方案实测版本):
https://qqdl.gtimg.cn/qqfile/QQNT/9.9.33/release/497e2f1f/QQ_9.9.33_260813_x64_01.exe - 32 位(备选,未实测):
https://qqdl.gtimg.cn/qqfile/QQNT/9.9.33/release/497e2f1f/QQ_9.9.33_260813_x86_01.exe(文件确认存在于官方 CDN;但补丁/部署流程仅针对 x64 验证,32 位如需使用请先自行验证,见二.5) - 安装包已归档于本仓库
installers\目录(随仓库同步,可免下载) - 安装完成后确认版本目录为
versions\9.9.33-52230
Get-Process -Name "QQ*" -ErrorAction SilentlyContinue | Stop-Process -Forcepip install pefile capstone
python "E:\Github\QQNT_LiteLoader_Help\tools\AutoQQNTFileVerifyPatch-main\patch_qqnt.py" "I:\QQNT\versions\9.9.33-52230\QQNT.dll"- 特征码匹配恰好 1 处 = 成功;0 处或多处 = 版本不适用,勿强打(见二.3)
- 自动备份
QQNT.dll.bak,可--restore还原 - 脚本搜索约需 1 分钟,耐心等待
加载器本体 = 本仓库
LiteLoaderQQNT\(源码形式,已含 store.js 修复与设置页定制)
$appDir = "I:\QQNT\versions\9.9.33-52230\resources\app"
$encNoBOM = New-Object System.Text.UTF8Encoding $false # 必须无 BOM(见二.1)
New-Item -ItemType Directory -Force -Path "$appDir\app_launcher"
$content = "require(String.raw``E:\Github\QQNT_LiteLoader_Help\LiteLoaderQQNT``);"
[System.IO.File]::WriteAllText("$appDir\app_launcher\liteloader.h.js", $content, $encNoBOM)
Copy-Item "$appDir\package.json" "$appDir\package.json.ll.bak" -Force
$orig = Get-Content "$appDir\package.json" -Raw
$modified = $orig -replace '"main":\s*"[^"]*"', '"main": "./app_launcher/liteloader.h.js"'
[System.IO.File]::WriteAllText("$appDir\package.json", $modified, $encNoBOM)Start-Process "I:\QQNT\QQ.exe" -WorkingDirectory "I:\QQNT"- QQ 出主窗口(8~10 个进程正常),设置页左侧出现「LiteLoaderQQNT」标签
- 验证:
LiteLoaderQQNT\data\出现qqnt_toolbox\目录 = 插件初始化成功 - 安装插件:设置页 → LiteLoaderQQNT → 插件 → 「安装新插件」→ 选择
plugins\下的 zip(如QQNT-Toolbox-v0.10.12.zip)→ 列表即时刷新 → 重启 QQ 生效 - 卸载插件:设置页 → 插件 → 该插件「管理」→ 「卸载」按钮 → 确认后立即删除本体与数据
PowerShell 5.1 的 Set-Content -Encoding UTF8 会写 UTF-8 BOM,Node 的 JSON.parse 不认 → QQ 启动无窗口卡死(无报错)。必须用 [System.IO.File]::WriteAllText(..., $encNoBOM)。验证:文件前 3 字节不应是 EF BB BF。
官方 src\main\store.js 有 dirent.path bug(应为插件目录变量),会报:
TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received undefined
本仓库已修复;若从官方重新下载源码需注意。
- 匹配 恰好 1 处 = 成功;0 处或多处 = 版本不适用,勿强打
- 这是本地静态校验绕过(SHA256 哈希比对),不联网;与"封号检测"是两回事(见八)
- 防撤回:QQNT-Toolbox「阻止撤回」为主力;xh321 qq-anti-recall 已停更,仅作备选,切勿同时启用(同类功能冲突)
- 本地贴纸:Toolbox 与 lite-tools 同为文件夹方式,启用时只开其中一个
官方 CDN 确认存在 32 位安装包(QQ_9.9.33_260813_x86_01.exe),但本方案的 QQNT.dll 补丁偏移(VA 0x180514D12 等)与 wrapper.node 均针对 x64 验证。32 位如需使用,请先自行验证补丁可用性,勿照搬 x64 步骤。
腾讯检测为三层组合、概率性触发。风险真实但非必然;建议小号测试、主号谨慎。切勿尝试反汇编/删除/patch TP 安全组件(详细见第八章)。
LiteLoaderQQNT\ 以源码形式随仓库同步(免解压);.gitignore 仅排除用户本地运行状态:LiteLoaderQQNT\data\(插件配置、撤回记录、贴纸等,含个人路径)、LiteLoaderQQNT\plugins\(已安装的第三方插件)。installers\(QQ 安装包)与 plugins\*.zip(插件安装包)随仓库同步。
针对官方 1.4.1 终版的痛点做了两处体验优化 + 一处官方 bug 修复:
| 痛点/问题 | 官方行为 | 本仓库改动 |
|---|---|---|
| 安装插件后必须重启 QQ 才在列表显示 | 列表是启动时的静态快照,安装只解压文件 | 新增 refresh API(主进程重扫插件目录),安装成功自动重渲染列表;每次打开设置页也实时拉取最新数据(不再使用启动快照,关闭重开不丢变化);新装插件默认停用(在「管理」中启用后重启生效),缺依赖时弹窗提示(功能生效仍需重启,主进程注入在启动时加载) |
| 插件没有"卸载"按钮 | 管理弹窗只有"删除本体/删除数据"两个开关,且要重启才真删 | 管理弹窗新增**「卸载」按钮**:确认后立即删除插件本体+数据、同步移除其左侧设置页面并刷新列表 |
| 插件扫描报错 | store.js 使用 dirent.path(官方 bug) |
已修复为插件目录变量 |
改动文件:
src/main/api.js— 新增LiteLoader.api.plugin.refreshsrc/preload/api.js— 桥接暴露refreshsrc/main/store.js— 修复 dirent.path +deletePlugin支持立即删除(兼容原"重启后删除"流程)src/renderer/settings/renderer.js— 列表可重渲染 + 安装后自动刷新 + 卸载按钮逻辑src/renderer/settings/view.html— 管理弹窗新增「卸载」按钮
启用/停用插件仍按官方机制在下次启动时生效(架构限制,未改动)。
新版 QQNT(9.9.2x 之后)收紧了文件完整性校验,并阉割了本地表情包编辑,导致传统方案全部失效:
| 传统方案 | 失效原因 |
|---|---|
| RevokeMsgPatcher v2.1 | 补丁服务器只支持 wrapper.node 9.8.0.19000~19307(9.9.20 时代),9.9.33 的 9.8.0.23961 不支持(issue #1216 仍是 open) |
| NTQQAntiRecall | 兼容表只测到 9.9.20-37625 |
| LiteLoaderQQNT 官方 dbghelp.dll 绕过 | 官方项目已归档(1.4.1 终版);老式绕过 9.9.21+ 失效;新式 DLL 只在 TG 群分发 |
本方案通过静态补丁 QQNT.dll 跳过文件校验,在 9.9.33 上完整恢复插件能力,无需降级、无需 TG 群文件。
| 组件 | 版本 | 项目地址 | 用途 |
|---|---|---|---|
| QQNT 9.9.33 安装包 | 9.9.33.52230 | 见第一章第 0 步 | QQ 本体(x64/x86) |
| AutoQQNTFileVerifyPatch | main (2026-08-08) | https://github.com/771835/AutoQQNTFileVerifyPatch | QQNT.dll 校验绕过补丁(Python,实测 9.9.32/9.9.33) |
| LiteLoaderQQNT | 1.4.1(终版) | https://github.com/LiteLoaderQQNT/LiteLoaderQQNT/releases | 插件加载器 |
| QQNT-Toolbox | v0.10.12 (2026-08-18) | https://github.com/MeiYongAI/QQNT-Toolbox/releases | 防撤回 + 本地贴纸 + 工具箱(活跃维护) |
| lite-tools | v4.0.3 (2026-08-08) | https://github.com/xiyuesaves/lite-tools/releases | 本地贴纸/表情 + 防撤回 + 界面调整(可选) |
| qwqnt-ipc-interceptor | v1.2.1 (2025-11-09) | https://github.com/qwqnt-community/qwqnt-ipc-interceptor/releases | lite-tools 的前置框架插件 |
| qq-anti-recall (xh321) | 0.3.0 (2025-08-01 起停更) | https://github.com/xh321/LiteLoaderQQNT-Anti-Recall/releases | 备选防撤回(已停更,仅保留备用) |
依赖:Python 3.x + pip install pefile capstone
部署 = 修改了 QQ 安装目录(I:\QQNT)的 2 个文件 + 新增 1 个文件 + 外部放置加载器:
| 文件 | 改动 | 备份 | 还原方法 |
|---|---|---|---|
I:\QQNT\versions\9.9.33-52230\QQNT.dll |
文件校验函数 call → jmp(VA 0x180514D12,e839c4ffff → e967010000),跳过完整性检查 |
QQNT.dll.bak(同目录) |
python patch_qqnt.py --restore "...\QQNT.dll" |
I:\QQNT\versions\9.9.33-52230\resources\app\package.json |
"main" 从 ./application.asar/app_launcher/index.js 改为 ./app_launcher/liteloader.h.js |
package.json.ll.bak(同目录) |
复制备份覆盖回去 |
| 文件 | 内容 |
|---|---|
...\resources\app\app_launcher\liteloader.h.js |
require(String.rawE:\Github\QQNT_LiteLoader_Help\LiteLoaderQQNT); ——加载器入口 |
| 位置 | 内容 |
|---|---|
E:\Github\QQNT_LiteLoader_Help\LiteLoaderQQNT\ |
加载器本体(源码随仓库同步,已含定制改动) |
| 运行数据 | 自动创建于 LiteLoaderQQNT\data\(撤回记录、贴纸、插件配置,不随仓库同步) |
跳过的检测 = QQNT 启动时的「文件完整性校验」(SHA256 哈希比对),纯本地静态校验,不联网。
原理(来自 QQNTFileVerifyPatch 原项目作者逆向笔记):
- QQ 启动时,用 SHA256 计算
QQNT.dll、package.json、launcher.json等关键文件哈希 - 与内置的官方哈希比对:
if (memcmp(Buf1, Buf2a, Size))—— 哈希一致返回 1(通过),不一致返回 0 - 若校验失败,WinMain 不加载 GUI,直接弹「文件损坏」拒绝启动(这就是为什么改了 package.json 后 QQ 会报损坏)
- 本补丁把校验函数入口的
call 校验函数改成jmp 跳过,让校验永远不执行,于是改过的 package.json、补丁过的 QQNT.dll 都能被接受
补丁前:
0x180514D0A: 4c89f1 mov rcx, r14
0x180514D12: e839c4ffff call 0x180511150 ← SHA256 校验逻辑
0x180514D19: 0f855f010000 jne 0x180514e7e
补丁后:
0x180514D12: e967010000 jmp 0x180514e7e ← 直接跳过校验
重要区分:这个校验 ≠ "检测你加载了什么插件"。它只是防文件篡改的本地静态检查。插件/内存层面的检测是另一套机制(见第八章「封号机制」)。
- 官网安装包
QQ_9.9.33_260813_x64_01.exe的版本信息 = 9.9.33.52230 - 文件名里的
260813是构建日期(2026-08-13),不是 build 号 - 安装后
versions\9.9.33-52230与安装包完全一致,没有偷偷更新 - 补充:wrapper.node 文件版本 9.8.0.23961 与 QQ 文件夹版本 9.9.33-52230 是两套编号(前者是内部模块版本),不影响本方案
对比结论:现阶段装 QQNT-Toolbox 的防撤回就够了,不需要再装别的防撤回插件。
| 对比项 | QQNT-Toolbox 阻止撤回 | xh321 qq-anti-recall |
|---|---|---|
| 最近更新 | v0.10.12 (2026-08-18) | 0.3.0(2025-08-01 后停更) |
| 拦截撤回 | ✅ 保留原消息+标记 | ✅ 基础拦截 |
| 黑白名单(按好友/群) | ✅ | ❌ |
| 拦截自己的撤回 | ✅ | 可选 |
| 撤回记录持久化+独立查看器 | ✅(搜索/预览/定位) | 仅 DB 存储,无查看器 |
| 撤回图片恢复归档 | ✅(CDN 回退拉图) | 简单图片补全 |
| 群文件防撤回下载 | ✅ | ❌ |
xh321 版已停更一年多,仅保留在
plugins\qq-anti-recall.zip作备选,切勿与 Toolbox 同时启用(同类功能冲突)。
使用:悬浮工具箱 / 设置页 →「阻止撤回」→ 启用。
重要说明:两个插件的"本地贴纸"都是「自定义文件夹 → 贴纸包 → 发送」模式,不是 QQ 原版表情包的 DB 存储集成(原版 DB 表情功能在新版 QQNT 已阉割,目前无插件能完整还原 DB 方式)。
A. QQNT-Toolbox「本地贴纸」(推荐先用)
- 图片放
LiteLoaderQQNT\data\qqnt_toolbox\stickers\(png/jpg/gif/webp,按子文件夹分组) - 入口三选一:右键表情按钮 / 替换表情按钮 / 独立贴纸按钮;点击直发(Alt+单击)
- 支持 Telegram 贴纸包下载(需 FFmpeg)
B. lite-tools「本地贴纸」(默认未安装;需要时先装前置 plugins\ipc_interceptor-v1.2.1.zip,再装 plugins\lite-tools.v4.0.3.zip)
- 同样文件夹方式:设置页选择贴纸目录、拖拽排序贴纸集、以图片形式发送、调整面板尺寸
- 额外:解除商城表情限制、自定义背景、界面精简、阻止撤回(含"重定向撤回图片保存路径")
⚠️ 作者实测版本 42086/49599(52230 未测,本次部署已确认加载正常,功能请按实际使用为准)
两个插件同类功能默认全关,启用时只开其中一个的贴纸/防撤回,避免冲突。
QQ 的图片机制:收到图片消息默认只下载缩略图缓存,原图要点开才下载。撤回时如果原图没下载过:
- Toolbox 已内置解决方案:撤回时优先尝试 QQ 原生下载,并通过腾讯图片 CDN + rkey(
rkey.furrycloud.top服务)回退拉取原图,归档到插件数据目录,恢复后的图片可在撤回查看器中打开原图/原文件。 - 天花板限制:如果 QQ 完全离线、消息压根没到客户端(人不在线),任何防撤回都无能为力——客户端方案只能救"已收到"的消息。建议保持 QQ 在线接收。
- 专门的"自动下载原图"插件(qqnt-msg-autodownload)已废弃不可用;lite-tools 的"重定向撤回图片保存路径"(v5 开发版)可作补充。
腾讯的检测是三层组合,机制不透明、概率性触发:
- 本地文件完整性校验(已被本方案绕过):SHA256 哈希比对关键文件(见第六章),纯本地、不联网。失败=拒绝启动。
- 运行时行为/内存检测(TP 安全组件):QQ 内置安全组件(
TSSafeEdit.dat、TPDataTransport.dll等)会检测进程模块列表、hook 特征(Detours/MinHook 痕迹)、异常调用等。这就是为什么老式 dbghelp.dll 劫持/DLL 注入"可能被标记",而 LiteLoaderQQNT 的 JS 层 hook 相对隐蔽。检测结果可能经安全通道回传,也可能直接表现为登录后闪退/"文件损坏"提示。 - 服务端风控:异常行为模式(消息频率、设备指纹、自动回复特征等)触发,封号/封三天/限制社交由服务端决定。
为什么群友在用没事? 检测是触发式/概率性的,不是"用了必封"。触发条件不透明(可能与插件特征强度、账号价值、行为模式、是否被举报有关)。参考案例:RevokeMsgPatcher #892(安装后警告冻结)、LiteLoaderQQNT #864(封号警告,导致 v2.1 移除安装器)、#1063(封三天)、#1051(限制社交)。
看到上面提到 TP 组件(TSSafeEdit.dat、TPDataTransport.dll 等)会做运行时检测,千万不要试图去反汇编、删除、patch 或禁用它们!原因:
- 动了必出事:TP 深度集成在 QQ 启动与运行流程中,删除/破坏 = QQ 拒绝运行或闪退;而 TP 缺失本身就是一个比加载插件显眼一百倍的异常信号,等于主动告诉腾讯"我有问题"。
- 猫鼠游戏打不赢:TP 随 QQ 版本更新,今天 patch 明天失效,永远在追。
- 法律风险:绕过/破坏安全组件违反反规避条款,比用插件严重得多。
- 根本没必要:本方案的隐蔽性已经足够——LiteLoaderQQNT 是 JS 层 hook(代理 Electron 模块),不注入任何额外 DLL,TP 扫进程模块列表时看不到"可疑外挂 DLL";最容易暴露的静态文件痕迹(改过的 package.json / QQNT.dll)已被本方案的文件校验补丁处理掉。
正确姿势:只要不封号,TP 爱怎么检测、怎么汇报随它去——检测和汇报本身不产生风险,风控处罚(封号/冻结/限制)才是风险,而那取决于行为特征而非"被检测到"。保持低调使用(别开自动回复等行为特征明显的功能)、QQ 更新后重打补丁,就是最优策略。
结论:风险真实存在但非必然。建议小号测试、主号谨慎,别在 QQ 官方渠道露插件痕迹,更别去碰 TP。
python patch_qqnt.py --restore "…\QQNT.dll"package.json.ll.bak覆盖回去- 删除
app_launcher\liteloader.h.js - 即完全还原为官方原版
📦 Git 同步策略:
LiteLoaderQQNT/以源码形式随仓库同步(免解压)。.gitignore只排除用户本地运行状态:LiteLoaderQQNT/data/(插件配置、撤回记录、贴纸等,含个人路径)、LiteLoaderQQNT/plugins/(已安装的第三方插件)。installers\(QQ 安装包)与plugins\*.zip(插件安装包)随仓库同步。
✅ 拿到项目即可直接用:clone 仓库后(无需解压任何 zip),按第一章第 0~4 步操作,再用设置页「安装新插件」按钮安装
plugins\下的 zip 即可。
E:\Github\QQNT_LiteLoader_Help\
├── README.md ← 本手册(部署/注意事项/改动说明)
├── .gitignore ← 只排除 data/ plugins/ 等本地运行状态
├── installers\ ← QQ 官方安装包(随仓库同步)
│ └── QQ_9.9.33_260813_x64_01.exe ← 官方安装包(9.9.33.52230,64 位)
├── tools\
│ ├── AutoQQNTFileVerifyPatch.zip ← 补丁工具原包
│ └── AutoQQNTFileVerifyPatch-main\ ← 补丁工具源码(patch_qqnt.py)
├── plugins\ ← 插件原包归档(设置页「安装新插件」用)
│ ├── QQNT-Toolbox-v0.10.12.zip
│ ├── lite-tools.v4.0.3.zip
│ ├── ipc_interceptor-v1.2.1.zip
│ └── qq-anti-recall.zip ← 备选(已停更)
└── LiteLoaderQQNT\ ← 加载器本体(源码随仓库同步)
├── src\main\store.js ← 已修复 dirent.path bug + 支持立即卸载
├── src\renderer\settings\ ← 定制:安装后即时刷新 + 卸载按钮
├── data\ ← 运行数据(.gitignore 忽略,不同步)
└── plugins\ ← 已安装插件(.gitignore 忽略,不同步)
└── QQNT-Toolbox\ ← 防撤回 + 本地贴纸(主力,经「安装新插件」安装)
换机/重装流程:装 QQ 9.9.33(installers\ 内或第一章第 0 步链接)→ clone/拷贝仓库(含 LiteLoaderQQNT 源码,无需解压)→ 第 0~4 步 → 设置页「安装新插件」安装 plugins\*.zip → 完成。