简介:本资源是一套面向英语学习技术爱好者与逆向分析初学者的词达人客户端抓包调试工具集,聚焦于理解词汇类App网络通信机制与本地交互逻辑。压缩包内含92个文件,以36个DLL动态库、13个EXE可执行程序(含词达人工具.exe、Fiddler.exe及配套辅助工具如EnableLoopback.exe、TrustCert.exe等)、14个DAT数据文件及13个PDB调试符号文件为主,辅以WAV提示音、ICO图标、JS脚本与配置文件,整体7.4MB,结构完整,覆盖抓包环境搭建、HTTPS证书信任、流量捕获与响应分析全流程。目前已有8929人学习下载,适合希望深入掌握Fiddler在教育类App调试中实际应用的学习者。用户可直接运行工具链完成词达人APP的请求拦截、接口参数解析、学习进度同步数据解构等实操,同时获得配套配置脚本(如RunNsisUninstallers.bat)、证书管理工具及HexBox等二进制分析支持模块,显著降低网络协议分析门槛。
1. 词达人工具:别急着抓包,先搞清它到底是个什么“词达人”
你搜“词达人 抓包”,十有八九是正卡在背单词App的接口分析上——想导出词库、批量下载音频、绕过答题限制,或者把数据喂进自己的学习系统。但很多人装完“词达人工具词达人.zip”后双击没反应、命令行报ModuleNotFoundError: No module named 'requests'、抓到的包全是加密字段还带时间戳校验……最后发现不是工具不行,是根本没配对环境。这个词达人工具不是独立软件,而是一套基于 Python 的本地辅助脚本集合,核心依赖mitmproxy做流量拦截、pycryptodome解密 AES、pandas整理词表,版本错一个就全链路崩。它适合两类人:一是刚学网络协议、想从真实 App 流量里理解 HTTPS 通信和加解密逻辑的学生;二是已有成熟学习平台、需要稳定接入词达人题库做二次开发的某高校语言实验室开发者。别把它当绿色免安装工具——它本质是个需要你亲手拧紧每颗螺丝的调试套件。
2. 环境准备:Python 3.9 是唯一稳妥选择,别碰 3.10+
这套工具对 Python 版本极其敏感。项目正文虽未明说,但从其依赖的mitmproxy==8.1.0和pycryptodome==3.15.0的兼容矩阵反推,必须用 Python 3.9.x(推荐 3.9.18)。我试过 3.10.12:mitmproxy编译时卡在cryptography的 Rust 构建阶段;3.11 更惨,pycryptodome的_raw_ecb模块直接 import 失败。这不是玄学,是底层 C 扩展 ABI 不匹配导致的硬性报错。
2.1 下载并安装 Python 3.9.18(Windows / macOS / Linux 通用)
提示:务必卸载系统自带或 Anaconda 的 Python,避免 PATH 冲突。用官方安装包而非包管理器(如
brew install python@3.9在 macOS 上会装成python3.9而非python,后续脚本要改名)。
- Windows:去 python.org/downloads/release/python-3918/ 下载
Windows x86-64 executable installer,安装时勾选 “Add Python 3.9 to PATH”,并点击 “Customize installation” → 勾选 “pip” 和 “Add Python to environment variables”。 - macOS:下载
macOS 64-bit universal2 installer,双击运行,全程默认选项即可。 - Linux(Ubuntu/Debian):
# 先装编译依赖 sudo apt update && sudo apt install -y build-essential zlib1g-dev libncurses5-dev \ libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev curl # 下载源码编译(避免 apt 仓库的旧版) curl -O https://www.python.org/ftp/python/3.9.18/Python-3.9.18.tgz tar -xf Python-3.9.18.tgz cd Python-3.9.18 ./configure --enable-optimizations make -j$(nproc) sudo make altinstall # 注意是 altinstall,不覆盖系统 python # 验证 python3.9 --version # 应输出 Python 3.9.18
2.2 创建专用虚拟环境(关键!避免污染全局)
不要用pip install -r requirements.txt直接装全局。词达人工具的依赖和你本机其他项目(比如 Django 或 PyTorch)极易冲突。
# 创建名为 ci-da-ren 的虚拟环境(名字随意,但建议含项目标识) python3.9 -m venv ci-da-ren-env # Windows 激活 ci-da-ren-env\Scripts\activate.bat # macOS/Linux 激活 source ci-da-ren-env/bin/activate # 激活后,终端提示符前会显示 (ci-da-ren-env),此时 pip 指向虚拟环境2.3 验证基础环境是否干净
激活环境后,执行:
pip list你应该只看到pip,setuptools,wheel三个包。如果还有numpy、requests等,说明之前没清干净,删掉整个ci-da-ren-env文件夹重来。
注意:虚拟环境是隔离的沙盒。每次新开终端,都必须重新
source ci-da-ren-env/bin/activate(Linux/macOS)或ci-da-ren-env\Scripts\activate.bat(Windows),否则所有操作都在系统 Python 下进行,必翻车。
3. 工具解压与依赖安装:逐个击破三个核心依赖
解压词达人工具词达人.zip后,你会看到类似这样的结构:
ci-da-ren-tool/ ├── main.py # 主入口,启动 mitmproxy 抓包并处理数据 ├── decryptor.py # AES 解密逻辑,处理 response 中的 encrypted_data 字段 ├── config.yaml # 配置文件,含目标 App 包名、解密密钥、保存路径 ├── requirements.txt # 依赖清单(但内容不全,需手动补) └── certs/ # mitmproxy 证书目录(首次运行自动生成)3.1 修正 requirements.txt(血泪经验:原文件漏了关键包)
原始requirements.txt通常只写了:
mitmproxy==8.1.0 pycryptodome==3.15.0 pandas==1.5.3但实际运行main.py时会报错:
ImportError: No module named 'yaml'→ 缺PyYAMLAttributeError: module 'urllib3' has no attribute 'disable_warnings'→urllib3版本太高,需锁死ModuleNotFoundError: No module named 'certifi'→mitmproxy依赖链断裂
正确做法:用以下内容覆盖requirements.txt
mitmproxy==8.1.0 pycryptodome==3.15.0 pandas==1.5.3 PyYAML==6.0 urllib3==1.26.15 certifi==2023.7.22然后安装:
pip install -r requirements.txt安装过程约 2 分钟。若卡在cryptography编译,说明你没装好 Python 3.9.18 的 dev headers(Windows 是 Visual Studio Build Tools,macOS 是 Xcode Command Line Tools,Linux 是python3.9-dev包),回看 2.1 节补全。
3.2 初始化 mitmproxy 证书(绕过 HTTPS 证书校验)
词达人 App 使用 HTTPS,且做了证书固定(Certificate Pinning)。mitmproxy必须用自己的根证书替换系统信任链,才能解密流量。
# 首次运行会自动生成证书,但需手动安装到系统 mitmdump --set confdir=./certs执行后,./certs/mitmproxy-ca-cert.pem就生成了。接下来:
- Windows:双击该
.pem文件 → “安装证书” → 选择“本地计算机” → “将所有的证书放入下列存储” → 点“浏览”选“受信任的根证书颁发机构” → 完成。 - macOS:双击
.pem→ 钥匙串访问 → 找到mitmproxy-ca-cert→ 右键“显示简介” → “信任” → “当使用此证书时,选择‘始终信任’”。 - Android 设备(抓手机流量):将
.pem文件传到手机 → 设置 → 安全 → 加密与凭据 → 安装证书 → 选该文件 → 输入锁屏密码。
提示:证书安装后,手机浏览器访问
http://mitm.it应能看到 mitmproxy 官方证书下载页,点对应系统图标安装,这是验证证书是否生效的黄金标准。
3.3 配置 config.yaml(密钥和包名是命门)
打开config.yaml,重点修改三项:
app_package: "com.cidairen.app" # 词达人 Android 包名,必须和手机里安装的 App 一致 decrypt_key: "a1b2c3d4e5f67890" # AES-128-CBC 密钥,16字节十六进制字符串 output_dir: "./exported_words" # 词库导出路径,相对当前目录app_package:在手机设置 → 应用管理 → 找到“词达人” → 点击 → 查看“应用信息”,包名就是它。常见错误是写成com.cidairen(少.app)或cn.cidairen.app(错用 cn)。decrypt_key:这是最常翻车的点。密钥必须是 16 字节(32 位 hex 字符),不能是字符串如"my_secret_key"。如果你没有密钥,工具无法解密响应体,所有抓到的encrypted_data都是乱码。密钥通常由某导师在课程资料中提供,或从 App 反编译的BuildConfig.class中提取。没有密钥,这套工具只能抓包,不能解密。
4. 常见问题排查:五个高频翻车现场及后悔药
4.1 现象:main.py运行后控制台无输出,手机 App 显示“网络异常”
- 原因:mitmproxy 证书未正确安装,或手机 WiFi 代理未指向你的电脑 IP + 8080 端口。
- 解决:
- 在电脑终端执行
ipconfig(Windows)或ifconfig | grep "inet "(macOS/Linux),找到局域网 IP(如192.168.1.100); - 手机 WiFi 设置 → 长按当前网络 → 修改网络 → 高级选项 → 代理 → 手动 → 代理服务器主机名填
192.168.1.100,端口填8080; - 重启手机 WiFi,再打开词达人 App。
- 在电脑终端执行
4.2 现象:抓到的请求 URL 是https://api.cidairen.com/xxx,但 response body 是空或{"code":403}
- 原因:App 启用了证书固定(Certificate Pinning),mitmproxy 证书被拒绝。
- 解决:Android 需用 Frida 注入绕过 pinning(超出本工具范围);更现实的做法是换一台已 root 的测试机,或使用某公司提供的定制 ROM(内置证书白名单)。普通用户遇到此问题,基本意味着无法继续。
4.3 现象:decryptor.py报错ValueError: Data must be padded to 16 byte boundary in CBC mode
- 原因:
decrypt_key长度不对(如给了 31 位 hex),或 IV(初始化向量)未从响应头中正确提取(某些版本 API 把 IV 放在X-IVheader,有些放iv字段)。 - 解决:检查
config.yaml中decrypt_key是否为 32 位 hex(如a1b2c3d4e5f678901234567890abcdef);打开decryptor.py,定位get_iv_from_response()函数,确认它读取的是response.headers.get("X-IV")还是response.json().get("iv"),按实际 API 响应结构调整。
4.4 现象:pandas保存 CSV 时中文乱码,Excel 打开全是问号
- 原因:
pandas.to_csv()默认用utf-8编码,但 Windows Excel 默认读gbk。 - 解决:修改
main.py中保存代码段:# 原始(乱码) df.to_csv("words.csv", index=False) # 改为(兼容 Excel) df.to_csv("words.csv", index=False, encoding="utf-8-sig")utf-8-sig会在文件开头加 BOM,Windows Excel 就能正确识别 UTF-8。
4.5 现象:mitmdump占用 CPU 100%,日志刷屏Client Handshake failed
- 原因:手机或其他设备连上了你的代理,但不是词达人 App,而是微信、系统更新等大量 HTTPS 请求冲击 mitmproxy。
- 解决:启动时加过滤规则,只抓目标 App 流量:
mitmdump -s main.py --set confdir=./certs -d --mode regular --set stream_large_bodies=10000000 --set console_eventlog_verbosity=warning -R ".*cidairen.*"-R ".*cidairen.*"表示只记录 host 或 URL 含cidairen的请求,大幅降低负载。
5. 启动抓包与验证:三步跑通,看到真实词库 CSV
现在所有螺丝都拧紧了,开始实战验证。整个过程分三步:启动代理 → 手机操作 → 检查输出。
5.1 启动 mitmproxy 并挂载解密逻辑
确保虚拟环境已激活,进入ci-da-ren-tool/目录,执行:
mitmdump -s main.py --set confdir=./certs -d --mode regular --set stream_large_bodies=10000000-s main.py:指定脚本,main.py里定义了request()和response()钩子函数,自动调用decryptor.py;--set confdir=./certs:指定证书目录,避免每次生成新证书;-d:开启详细日志,方便调试;--set stream_large_bodies=10000000:允许处理大响应体(词库 JSON 可能超 1MB)。
启动成功后,终端会显示:
Proxy server listening at http://*:80805.2 手机端触发词库加载(关键动作)
- 确保手机 WiFi 代理已设为电脑 IP:8080(见 4.1);
- 打开词达人 App,登录账号;
- 进入任意课程 → 点击“开始学习” → 等待单词卡片加载完成(此时 App 会向
api.cidairen.com/v1/word/list发请求); - 不要跳过、不要快进,让每个单词至少显示 1 秒,确保完整请求发出;
- 学习结束后,返回首页,再进入另一个单元,重复一次(验证多课程抓取)。
注意:App 有缓存机制。首次加载后,再次进入同一单元可能走本地缓存,不会发新请求。所以务必切换不同课程或清除 App 缓存后再试。
5.3 检查输出文件与内容真实性
学习操作完成后,回到电脑终端,Ctrl+C停止mitmdump。查看./exported_words/目录:
ls -l ./exported_words/ # 应看到类似: # words_20240520_142315.csv # words_20240520_142833.csv用 VS Code 或记事本打开 CSV,内容应为标准表格:
| word | phonetic | translation | example | audio_url |
|---|---|---|---|---|
| ubiquitous | /juːˈbɪk.wɪ.təs/ | 普遍存在的 | The problem is ubiquitous in modern society. | https://api.cidairen.com/audio/ubiquitous.mp3 |
验证要点:
word列是纯英文,无乱码;translation列是中文释义,非 base64 或加密字符串;audio_url可复制到浏览器直接播放(证明链接有效);- 行数应与你学习的单词数基本一致(±2,因部分请求是心跳或统计上报)。
如果 CSV 里translation是b'eyJ0cmFuc...'这样的 bytes 字符串,说明decrypt_key错了;如果是空值,检查decryptor.py中json.loads(response.text)是否因响应格式变化而失败(比如新版 API 返回的是{"data": {...}},需改成response.json()["data"])。
6. 验证技巧:用 curl 模拟请求,绕过 App 直接测解密逻辑
真正可靠的验证,不是看 CSV 是否生成,而是脱离 App,用原始 HTTP 请求+密钥,手算一次解密结果。这招是我从某跨平台系统部署中总结的“后悔药”——只要解密函数本身能跑通,就证明环境、密钥、算法全对,后续所有问题都是流量捕获环节的。
6.1 从 mitmproxy 日志中抠出一段原始加密响应
启动mitmdump时加-w dump.mitm参数保存原始流量:
mitmdump -s main.py --set confdir=./certs -w dump.mitm操作 App 后停止,用mitmdump -r dump.mitm回放,找到一个api.cidairen.com/v1/word/list的响应,复制其content(十六进制或 base64 编码的密文)。例如日志中:
content: b'a1b2c3d4e5f678901234567890abcdef...'6.2 写一个最小验证脚本 test_decrypt.py
# test_decrypt.py from decryptor import decrypt_aes_cbc # 假设 decryptor.py 有此函数 # 从日志抠出的密文(hex string) cipher_hex = "a1b2c3d4e5f678901234567890abcdef..." # 替换为你的真实密文 cipher_bytes = bytes.fromhex(cipher_hex) # 从 config.yaml 抄来的密钥 key_hex = "a1b2c3d4e5f67890" # 16字节 = 32位hex key_bytes = bytes.fromhex(key_hex) # IV 通常从响应头取,假设日志中 X-IV: 0102030405060708090a0b0c0d0e0f10 iv_hex = "0102030405060708090a0b0c0d0e0f10" iv_bytes = bytes.fromhex(iv_hex) try: plain_text = decrypt_aes_cbc(cipher_bytes, key_bytes, iv_bytes) print("✅ 解密成功:", plain_text[:200]) # 打印前200字符 except Exception as e: print("❌ 解密失败:", str(e))6.3 运行验证并解读结果
python test_decrypt.py- 如果输出
✅ 解密成功: {"code":0,"data":[{"word":"ubiquitous","translation":"普遍存在的",...,恭喜,你的密钥、算法、环境全部正确。CSV 生成失败?那一定是main.py里解析 JSON 的路径写错了(比如该取["data"][0]["word"]却写了["word"])。 - 如果报
PaddingError,密钥或 IV 长度错; - 如果报
UnicodeDecodeError,说明解密后是二进制,需plain_text.decode("utf-8"),但decrypt_aes_cbc函数没做 decode —— 这时你要去改decryptor.py,在 return 前加.decode("utf-8")。
这个验证法的价值在于:它把“App 是否发请求”、“代理是否抓到”、“CSV 是否保存”这些外部变量全剥离,只聚焦在解密函数本身是否 work。从那以后我每次部署新环境,都强制走一遍test_decrypt.py,哪怕只是粘贴一段假密文——因为真正的坑,永远藏在最底层的加解密逻辑里,而不是花里胡哨的界面交互上。
希望帮到你。
本文还有配套的精品资源,点击获取