首页/文章/教程

教程

DRtokenTool 使用说明:读取小程序登录 token

2026-09-23相关工具

DRtokenTool 会定位微信小程序的运行时、注入调试 hook、开启本地调试通道, 然后把你的登录 token 和账号数据直接打印出来。拿到 token 就能在网页端跳过扫码登录, 直接测接口。

下载见 工具详情页。


安装

从详情页下载 DRtokenTool_v1.0.2_setup.exe,双击运行。

中文向导会打开,一路下一步即可。默认安装位置不用改,安装是当前用户级的, 不会弹管理员授权窗口。

勾上「创建桌面快捷方式」会方便一些。装完后开始菜单里会有 DRtokenTool、 使用教程、卸载 DRtokenTool 三项。

首次运行会被拦一下

程序没有做代码签名,所以第一次运行时 Windows SmartScreen 会弹 「Windows 已保护你的电脑」。

点 「更多信息」→「仍要运行」 就行。签名证书要付费,不是程序有问题。

环境要求

项目 要求
系统 Windows 10 / 11(64 位)
微信 已安装并登录(4.x)
Node.js 不需要,运行时已内嵌进 exe
空余端口 9421 和 62000

上手

需要记住的唯一一件事:顺序

先启动 DRtokenTool,再打开小程序。

启动工具之前就已经在运行的小程序接不上调试通道,必须关掉重开一次。

三步

1. 准备微信

启动微信并确认已登录。小程序如果开着,先关掉。

2. 启动 DRtokenTool

双击桌面图标。会出现一个命令行窗口:

=== DRtokenTool ===

[*] 进程 pid 53244
    启动器: ...\RadiumWMPF\WeChatAppEx.exe
[*] 正在确认目标模块...
    flue.dll: 已加载 @ 0x7ff82f8c0000 (229 MB)
    路径: ...\RadiumWMPF\25715\extracted\runtime\flue.dll
[*] WMPF 版本 25715 (来源: 版本目录 file_component.xml)
[*] 偏移来源: 内置配置
[*] 调试通道已开启:
      9421  小程序私有协议
      62000 CDP 代理
[*] 等待小程序接入........

看到 等待小程序接入 就说明准备好了。

3. 打开目标小程序

在微信里打开小程序,几秒后 token 就出来了:

================ TOKEN ================
WXXCX...(约 100 字符)
=======================================

账号数据:
{ "studentId": "STU-...", "studentName": "...", ... }

[*] 已写入 DRtokenTool.json

窗口不要关,关掉调试通道就没了。要退出按 Ctrl+C。


输出怎么看

token 两个地方都能拿:

{
  "token": "WXXCX...",
  "userInfo": { "studentId": "STU-...", "studentName": "..." },
  "capturedAt": "2026-09-23T19:30:00.000Z"
}

每次的 token 都不一样

这是正常的。 token 是会话级的,小程序每次重新打开都会换一个,旧的自动失效。


命令行选项

在命令行里跑能得到更多控制:

选项 说明 什么时候用
--auto-detect 强制重新扫描 hook 偏移 内置配置对不上、行为异常时
--output <文件> 指定结果 JSON 的路径 想写到别处
--no-file 只打印,不写文件 不想留文件
--no-browser 不打印 DevTools 地址 不需要调试页面
--debug-port <n> 调试端口,默认 9421 端口被占用时换一个
--cdp-port <n> CDP 代理端口,默认 62000 端口被占用时换一个
--capture 额外抓一次真实请求头 想知道 token 怎么传的
-h, --help 显示帮助 —

在安装目录的地址栏输入 cmd 回车,就能在那个目录打开命令行。


进阶用法

看 token 到底怎么传的

DRtokenTool.exe --capture

它会临时包装 wx.request,抓一次真实请求,把 token 在请求头里的位置打印出来。

这里有个坑:wx.request 在小程序的 wx 对象上不是普通属性,而是带 getter/setter 的访问器属性。直接用 wx.request = fn 赋值会被 setter 吞掉、 拦截不生效;用 delete wx.request 还原则会把方法整个删掉,导致这个小程序会话 此后再也发不出任何网络请求。所以必须保存并还原完整的属性描述符。

端口被占用

netstat -ano | findstr :9421

然后换个端口:

DRtokenTool.exe --debug-port 9521 --cdp-port 63000

用浏览器继续调试

启动时会打印 CDP 地址(形如 http://127.0.0.1:62000)。把它填进 Chrome 的 DevTools 前端,就能用完整的 Network / Console 面板调试小程序,跟调网页一样。

微信以管理员身份运行

微信是「以管理员身份运行」启动的,DRtokenTool 也必须以管理员身份运行,否则权限不够。

反过来,微信没用管理员时,DRtokenTool 也别用——两边权限不一致反而容易失败。


常见问题

等待小程序接入超时

两个原因,按顺序排查:

  1. 小程序没打开 → 打开它
  2. 小程序在工具启动之前就打开了 → 关掉重新打开

未找到小程序逻辑层

小程序还在加载中就连了 CDP。保持 DRtokenTool 运行,把小程序关掉重新打开一次。

未找到 WeChatAppEx.exe 进程

微信没开。启动微信并登录,再运行本工具。

无法确定 WMPF 版本

把窗口里的完整输出发给开发者——里面每个来源读到的版本号都打出来了, 是定位问题的关键线索。

提示「没有加载 flue.dll」

你这台机器的 WMPF 版本比较老,代码还在 WeChatAppEx.exe 里而不是 flue.dll, 而且不在内置的 52 个版本配置内。这种情况需要手工适配。

检测偏移时微信卡死或闪退

先看提示里有没有这一行:

[!] 检测到可能触发自我保护/反篡改的模块: WMPFDrm.dll

有的话说明这个版本带了反篡改保护,长时间附加会被它强制结束进程, 不要再走自动检测。

没有这一行但仍然卡死,说明遇到了旧版检测脚本的问题——它会因为大规模 JS 回调风暴 拖垮目标进程。现在的版本已改成 scanSync 一次性取回结果,实测检测在约 7 秒内完成。

小程序闪退

两个原因:

  1. 顺序反了 → 确认是「先起 exe、再开小程序」
  2. 开全局代理了 → 关闭 Clash、yakit 之类。已确认它们会触发 WebSocket 帧错误

无法加载 frida:找不到 frida_binding.node

exe 不完整,多半是传输中被杀软改过或复制中断。重新复制一份。

杀毒软件报警

工具会注入进程、开本地端口,行为特征和恶意软件相似,误报是常见的。

确认来源可信后再放行;介意的话可以自己从源码构建。


它是怎么做到的

DRtokenTool.exe
  │
  ├─ 1. 用 frida 定位 WeChatAppEx.exe 主进程
  │     (被其他子进程指向为父进程的那个)
  │     并向进程查询实际加载的 flue.dll 路径,据此确定版本号
  │
  ├─ 2. 取 hook 偏移:内置配置 → 上次缓存 → 特征扫描
  │
  ├─ 3. 启动两个服务
  │      9421  小程序私有调试协议
  │      62000 标准 CDP 代理
  │
  ├─ 4. 注入 hook:强制 debug_flag = 1、把 scene 改成 1101、
  │     把 CDP 过滤器的返回值 6 改成 0 → 小程序连上 9421
  │
  ├─ 5. 等小程序接入,连 62000 发 CDP:
  │     Runtime.enable / Debugger.enable → 定位「逻辑层」上下文
  │
  └─ 6. 读 wx storage,输出 token 与账号数据

版本号为什么不能只看 exe

RadiumWMPF 的目录布局差别很大,路径里不一定带版本号。见过两种:

布局 A(exe 在版本目录内)
...\RadiumWMPF\25560\extracted\runtime\WeChatAppEx.exe

布局 B(启动器在插件根目录,运行时在「同级」版本目录里)
...\RadiumWMPF\WeChatAppEx.exe                      ← 正在运行的进程
...\RadiumWMPF\25715\extracted\runtime\flue.dll     ← 真正的运行时

布局 B 是陷阱:进程路径没有版本号,而且它所在目录里也没有 flue.dll, 必须去同级的版本目录找。

更反直觉的是,WeChatAppEx.exe 只是启动器,版本资源会滞后。实测某台机器插件 是 25560 时,该 exe 仍报告 2.5.6.25558。所以程序不优先采信它,而是按 「进程实际加载的 flue.dll → 路径 → 清单 → dll 版本资源」的顺序探测, 并把每个来源读到的值都打印出来。

token 为什么只在「逻辑层」

小程序有多个 JS 上下文。视图层虽然也有 document / localStorage, 但没有 wx,里面只有广告之类的 WebView 数据。程序通过探测 typeof wx.getStorageInfoSync === 'function' 来锁定逻辑层。


安全须知

token 等于你的登录态,拿到的人可以直接以你的身份调用后端接口,不需要密码、 不需要扫码。

只对你拥有或已获明确授权的小程序与账号使用。 拿别人的小程序做这件事属于 未授权访问。

工具会修改目标进程内存(hook 的必需步骤),并开启监听 9421 和 62000。 调试通道是本地回环的,不对局域网开放。用完后按 Ctrl+C 退出即可。


开源

以 GPL-2.0-only 发布,源码在 GitHub。

许可证不是随便选的:它基于 WMPFDebugger (作者 evi0s,同样是 GPL-2.0-only),并内嵌了其 hook 脚本、检测脚本、偏移配置与 协议模块。GPLv2 要求衍生作品同样以 GPLv2 分发。