吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1226|回复: 24
上一主题 下一主题
收起左侧

[原创] Electron 应用逆向分析实战:Thief 7.2.1 VIP 验证机制拆解

[复制链接]
跳转到指定楼层
楼主
XiaoHai101 发表于 2026-11-2 15:06 回帖奖励

Electron 应用逆向分析实战:Thief 7.2.1 VIP 验证机制拆解(涉及到修改的文件源文件放附件了)

作者:hai
板块:软件安全
平台:Windows x64
日期:2026-11-02


免责声明

本文仅用于技术学习与研究交流,记录 Electron 应用逆向工程的分析思路与方法。请勿将本文所述内容用于任何商业软件的破解、盗版、二次分发等行为。未经软件作者授权,擅自修改、分发商业软件属于侵权行为,由此产生的一切法律责任由使用者自行承担。

本文中涉及的所有软件名称、商标、版权均归原作者所有。本文不鼓励、不支持任何形式的软件盗版行为。如果觉得软件好用,请支持正版作者。


一、为什么选 Electron 练手

Electron 应用本质上是 Chromium + Node.js 运行时,打包后的业务逻辑全部是 JavaScript,以 asar 归档格式存储。这意味着:

  1. 没有原生二进制加密——所有业务逻辑都是可读的 JS 代码
  2. asar 只是容器——可以用 @electron/asar 工具直接解包
  3. 验证逻辑通常在前端——尤其是小型独立开发者的产品,很少做服务端二次校验

这使得 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 容易被分析

  1. 纯前端验证——所有 VIP 锁都在渲染进程,主进程完全没有 VIP 概念
  2. 服务端不二次校验——API 只要带 token 就返回数据,不校验是否 VIP
  3. 没有代码混淆——虽然是单行打包,但变量名、字符串都是可读的
  4. 没有本地加密——token 明文存在 electron-store 的 JSON 文件里

7.2 Electron 应用常见的验证模式

模式 防御强度 Thief 采用?
纯前端 UI 锁 低 ✅ 主要模式
服务端 API 鉴权 中 ✅ 但不校验 VIP
本地许可证文件 + 签名校验 高 ❌ 没有
代码混淆 + 反调试 中高 ❌ 没有
原生模块校验 高 ❌ 没有

7.3 对开发者的启示

如果你是 Electron 应用开发者,想加强授权验证:

  1. 把核心逻辑放到主进程,而不是渲染进程
  2. 敏感功能做服务端二次校验,不要只靠前端 UI
  3. 用 asar 加密或原生模块保护关键代码
  4. 加混淆和反调试,提高逆向门槛

八、再次声明

本文仅作技术交流与学习用途。Thief 是一款优秀的国产软件,如果觉得好用,请支持正版作者。逆向工程的意义在于学习和理解,而非盗版和侵权。

image.png (37.65 KB, 下载次数: 2)

解包目录

解包目录

免费评分

参与人数 4吾爱币 +4 热心值 +3 收起 理由
HOOK_XYS + 1 + 1 用心讨论,共获提升!
buluo533 + 1 + 1 用心讨论,共获提升!
xuanle + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
jimmy5213 + 1 我很赞同!

查看全部评分

发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
chenqiaodev 发表于 2026-11-3 09:15
Electron 应用如果要加密的话,是不是也只能对打包后的js进行混淆, npx @electron/asar pack ./app-unpacked ./app.asar 这一步感觉 门槛确实很低
25#
jingg 发表于 2026-11-3 13:25
24#
y12345 发表于 2026-11-3 11:48
23#
Bruce_HD 发表于 2026-11-3 10:28
了解了解,感谢楼主分享。
22#
jamesKind 发表于 2026-11-3 10:25
楼主这个思路是不是也可以用到typora上面,我记得这个也是electron做的
21#
Yd666 发表于 2026-11-3 10:05
膜拜大佬
20#
kof21411 发表于 2026-11-3 09:19
好东西,值得收藏
18#
ningzhonghui 发表于 2026-11-3 09:04
分析头头是道,不错学习先
17#
lovexp2005 发表于 2026-11-3 09:02
大神威武
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-11-3 23:17

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表