Electron 应用逆向分析实战:Thief 7.2.1 VIP 验证机制拆解(涉及到修改的文件源文件放附件了)
作者:hai
板块:软件安全
平台:Windows x64
日期:2026-11-02
免责声明
本文仅用于技术学习与研究交流,记录 Electron 应用逆向工程的分析思路与方法。请勿将本文所述内容用于任何商业软件的破解、盗版、二次分发等行为。未经软件作者授权,擅自修改、分发商业软件属于侵权行为,由此产生的一切法律责任由使用者自行承担。
本文中涉及的所有软件名称、商标、版权均归原作者所有。本文不鼓励、不支持任何形式的软件盗版行为。如果觉得软件好用,请支持正版作者。
一、为什么选 Electron 练手
Electron 应用本质上是 Chromium + Node.js 运行时,打包后的业务逻辑全部是 JavaScript,以 asar 归档格式存储。这意味着:
- 没有原生二进制加密——所有业务逻辑都是可读的 JS 代码
- asar 只是容器——可以用
@electron/asar 工具直接解包
- 验证逻辑通常在前端——尤其是小型独立开发者的产品,很少做服务端二次校验
这使得 Electron 应用成为学习逆向工程的理想起点:不需要 IDA、不需要反汇编,一个编辑器就能读完全部业务逻辑。
二、目标简介
本次分析目标:Thief 7.2.1(摸鱼神器,作者 SanJin)。
这是一款基于 Electron 开发的桌面应用,核心功能是在工作环境中提供各种"摸鱼"场景:模拟股票行情、基金看板、网页模式、PDF 阅读、视频播放、AI 表情窗口、小游戏、桌面伪装文字等。
应用采用 Freemium 模式:基础功能免费,高级功能(锁屏、滚轮翻页、鼠标交互、自定义桌面文字、股票/基金/网页/PDF/视频/AI/摸鱼Hub 等)需要 VIP 会员。
三、逆向分析过程
3.1 解包 asar
npx @electron/asar extract app.asar ./app-unpacked
解包后目录结构:
app-unpacked/
├── out/
│ ├── main/index.js # 主进程(673KB,打包后单行)
│ ├── preload/index.js # 预加载脚本
│ └── renderer/ # 渲染进程(Vue 组件编译后)
├── package.json
└── node_modules/
3.2 关键词扫描
用 Python 正则在所有 JS 文件中搜索以下关键词:
login / token / vip / isVip / is_vip / checkLogin / checkAuth /
pay / payment / subscribe / unlock / trial / expired / license / 激活 / 付费 / 会员
共命中 774 个候选,过滤掉 node_modules 里的第三方库(ajv、axios、Vue、lucide、pdf.js、tfjs 等)后,真正的业务验证逻辑约 30 处。
3.3 验证机制架构
Thief 的验证架构非常简单:
┌─────────────┐ POST /api/user/login ┌─────────────┐
│ 渲染进程 │ ──────────────────────────→ │ 后端服务器 │
│ (Vue) │ ←────────────────────────── │ (API) │
└─────────────┘ { token, is_vip: "1" } └─────────────┘
│ │
▼ │
┌─────────────┐ check_token?token=xxx │
│ 主进程 │ ──────────────────────────→ is_vip === "1"
│ (Electron) │ ←────────────────────────── 决定 VIP 状态
└─────────────┘
核心发现:VIP 状态完全由服务端返回的字符串 is_vip === "1" 决定,客户端拿到后存到一个布尔位 global.login.is_。
四、VIP 验证的五个关键位置
4.1 登录弹窗触发(主进程)
// out/main/index.js
var hasLoginToken = () => String(db_default.get("token") || "").trim() !== "";
// 窗口初始化时检查
if (!hasLoginToken()) this.createUserLogin();
没有 token 就直接弹登录窗,用户必须登录才能使用。
4.2 功能入口门禁(托盘渲染进程)
// out/renderer/assets/tray-Zm22XIeF.js
onCheckIsVip() {
if (this.login?.is_login) {
this.onCheckToken();
if (this.login?.is_) return true;
else {
this.$message.info("您不是会员,请点击小皇冠!");
return false;
}
} else {
this.$message.info("您还未登录,请登录!");
return false;
}
}
所有 VIP 功能入口(股票/基金/网页/PDF/视频/AI/摸鱼Hub)都包在 if (this.onCheckIsVip()) 里。
4.3 VIP 状态判定(登录页)
// out/renderer/assets/index-DdFPfrd7.js
// 登录成功后
if (data.data.is_vip === "1") is_ = true;
唯一的 VIP 判定来源就是服务端返回的字符串 "1"。
4.4 设置项禁用(设置页)
// out/renderer/assets/setting-DWJmRd1J.js
// 非 VIP 时渲染皇冠图标
!$data.login.is_ ? createBlock(Crown, { class: "vip_model" }) : null
// 开关禁用
<a-switch disabled={!$data.login.is_} />
共 6+ 处设置项(锁屏、滚轮延时、鼠标移开、鼠标移入、摸鱼文字等)被禁用。
4.5 桌面窗口文字(桌面渲染进程)
// out/renderer/assets/desktop-CYe_a3T-.js
if (that.login.is_) that.moyu_text = db_default.get("moyu_text");
else that.moyu_text = "Hello Thief!"; // 非 VIP 只能用固定文字
五、Patch 思路(仅技术讨论)
基于以上分析,如果要绕过这些验证点,技术上的修改方向是:
5.1 跳过登录弹窗
// 改前
var hasLoginToken = () => String(db_default.get("token") || "").trim() !== "";
// 改后
var hasLoginToken = () => true;
5.2 所有功能入口直接放行
// 改前
onCheckIsVip() {
if (this.login?.is_login) {
this.onCheckToken();
if (this.login?.is_) return true;
else { /* 提示不是会员 */ return false; }
} else { /* 提示未登录 */ return false; }
}
// 改后
onCheckIsVip() {
return true;
}
5.3 VIP 状态直接为 true
// 改前
if (data.data.is_vip === "1") is_ = true;
// 改后
is_ = true;
5.4 设置页全部解锁
// 改前
!$data.login.is_ // 52 处
// 改后
!$data.login.is_ || false // 永远 false,皇冠不显示,开关不禁用
5.5 桌面文字和快捷键解锁
// 改前
if (that.login.is_) that.moyu_text = db_default.get("moyu_text");
else that.moyu_text = "Hello Thief!";
// 改后
that.moyu_text = db_default.get("moyu_text") || "Hello Thief!";
六、重新打包
npx @electron/asar pack ./app-unpacked ./app.asar
把新的 app.asar 替换到 resources/ 目录下即可。
可以实现下图效果,不登录,全功能可用。
七、技术要点总结
7.1 为什么 Thief 容易被分析
- 纯前端验证——所有 VIP 锁都在渲染进程,主进程完全没有 VIP 概念
- 服务端不二次校验——API 只要带 token 就返回数据,不校验是否 VIP
- 没有代码混淆——虽然是单行打包,但变量名、字符串都是可读的
- 没有本地加密——token 明文存在 electron-store 的 JSON 文件里
7.2 Electron 应用常见的验证模式
| 模式 |
防御强度 |
Thief 采用? |
| 纯前端 UI 锁 |
低 |
✅ 主要模式 |
| 服务端 API 鉴权 |
中 |
✅ 但不校验 VIP |
| 本地许可证文件 + 签名校验 |
高 |
❌ 没有 |
| 代码混淆 + 反调试 |
中高 |
❌ 没有 |
| 原生模块校验 |
高 |
❌ 没有 |
7.3 对开发者的启示
如果你是 Electron 应用开发者,想加强授权验证:
- 把核心逻辑放到主进程,而不是渲染进程
- 敏感功能做服务端二次校验,不要只靠前端 UI
- 用 asar 加密或原生模块保护关键代码
- 加混淆和反调试,提高逆向门槛
八、再次声明
本文仅作技术交流与学习用途。Thief 是一款优秀的国产软件,如果觉得好用,请支持正版作者。逆向工程的意义在于学习和理解,而非盗版和侵权。