记录EFetch桌面版的破解

📌 写在前面

这篇文章记录了我尝试破解 EFetch(一个基于 Electron 的下载工具)卡密验证的完整过程。从最初的二进制调试,到发现它是 Electron 应用,再到最终通过修改 JS 源码彻底绕过验证,整个过程踩了不少坑,记录于此,希望对有类似需求的朋友有帮助。

⚠️ 声明:本文仅供技术研究和学习交流,请勿用于非法用途。如果你喜欢这款软件,请支持正版。

🎯 目标

EFetch 是一款下载工具,免费版有限速,需要输入密钥(卡密)才能解锁“进阶用户”权限。目标就是绕过这个验证,直接使用进阶功能。

第一阶段:误入歧途 —— 尝试 dbg 调试

首先肯定丢给PE看看

图片[1]-记录EFetch桌面版的破解-软件安全逆向社区论坛-技术社区-学技术网

图片[2]-记录EFetch桌面版的破解-软件安全逆向社区论坛-技术社区-学技术网

没有壳,发现32位上dbg32,结果找不到,用dbg64倒是找到了,然后输入密钥,搜索关键字1234567890123,复制关键字周围的数据丢给deepseek,发现是Electron应用,即调试的根本不是一个普通的 Windows 程序,而是一个嵌入在程序里的 JavaScript 代码。而且没有加壳,那么思路就是解包这个程序,提取出真正的 JavaScript 源码,然后修改源码里的验证部分,再重新打包替换即可。(*友情提示,开始之前先做好快照*,否则会出现不可预期的bug)

📦 第二阶段:解包获取源码

Electron 代码在 resources/app.asar 中:

bash
npm install -g asar
asar extract app.asar unpacked

解包后获得完整项目结构,关键文件:

  • index.js – 主进程(启动、用户管理)

  • home.js – 渲染进程(界面、卡密弹窗)


🔑 第三阶段:定位并修改验证逻辑

修改点 1:home.js 中的 N() 函数

原代码:弹出密钥输入框,发送请求到服务器验证

修改后:直接解锁,不弹窗

javascript
// ==================== 修改后的 N 函数 - 直接解锁 ====================
  function N() {
    const { user: e, panel: n } = $;

    // 直接修改用户权限,不弹任何窗口
    const newTimeout = Math.floor(Date.now() / 1000) + 365 * 86400; // 一年后
    w.timeout = newTimeout;

    // 保存到本地存储
    i("user", w);

    // 更新 Controller 中的用户
    if ($.user) $.user = w;

    // 刷新界面
    $.render();

    // 显示成功提示
    n.toast("已解锁进阶用户权限!", true);
  }

修改点 2:index.js – getUser() 函数

确保没有用户时自动创建:

javascript
// ==================== 修改后的 getUser 函数 - 永远返回有效用户 ====================
function getUser(e = "") {
  if (!e && !(e = storage.get("user"))) {
    // 创建假用户
    const fakeUser = {
      id: "cracked_user_" + Date.now(),
      device: "cracked_device",
      timeout: Math.floor(Date.now() / 1000) + 365 * 86400,
      email: null,
    };
    storage.set("user", fakeUser);
    return fakeUser;
  }
  // 尝试解密,失败则返回假用户
  try {
    e = decryptData(e, !0);
  } catch (err) {
    // 解密失败,返回假用户
    const fakeUser = {
      id: "cracked_user",
      device: "cracked_device",
      timeout: Math.floor(Date.now() / 1000) + 365 * 86400,
      email: null,
    };
    return fakeUser;
  }
  return e.device && e.id ? e : null;
}

修改点 3:index.js – decryptData() 函数

解密失败时返回假数据,防止崩溃:

javascript
// ==================== 修改后的 decryptData 函数 - 解密失败时返回假数据 ====================
function decryptData(e, t = !1) {
  try {
    const n = e.substring(0, 32),
      o = e.substring(32, 96),
      s = e.substring(96);
    const i = crypto.createDecipheriv(
      "aes-256-cbc",
      Buffer.from(o, "hex"),
      Buffer.from(n, "hex"),
    );
    let r = i.update(s, "hex", "utf8");
    r += i.final("utf8");
    r = Buffer.from(r, "base64");
    r = r.toString("utf-8");
    if (t) r = JSON.parse(r);
    return r;
  } catch (err) {
    // 解密失败时返回假数据
    if (t) {
      return {
        id: "cracked_user",
        device: "cracked_device",
        timeout: Math.floor(Date.now() / 1000) + 365 * 86400,
        email: null,
      };
    }
    return "cracked_user_data";
  }
}

修改点 4:index.js – app.on("ready") 启动事件

跳过验证,直接启动主窗口:

javascript
// ==================== 修改后的 app.on("ready") - 跳过验证直接启动 ====================
  app.on("ready", function () {
    (options.locales ||
      ((options.locales = getLocalesCode()),
      storage.set("options.locales", options.locales)),
      (langPack = getLangPack(options.locales)));

    // 确保有用户数据
    if (!getUser()) {
      const fakeUser = {
        id: "cracked_user_" + Date.now(),
        device: "cracked_device",
        timeout: Math.floor(Date.now() / 1000) + 365 * 86400,
        email: null,
      };
      storage.set("user", fakeUser);
    }

    // 直接启动主窗口,跳过验证
    setWindowSize(options.window);
    createWindow();

    // 可选:静默检查更新(已禁用)
    // if (!isDev) {
    //   setTimeout(() => {
    //     checkForUpdates(`https://efetch.net/api/update?os=${os.platform()}`);
    //   }, 5e3);
    // }
  })

修改点 5:index.js – 禁用自动更新

javascript
async function checkForUpdates(e) {
  return;  // 什么都不做
}
 

🔧 第四阶段:重新打包并替换

bash
# 重新打包
asar pack unpacked app.asar

# 替换原文件(建议先备份)
cp app.asar /你的路径/EFetch/resources/app.asar

✅ 最终结果

图片[3]-记录EFetch桌面版的破解-软件安全逆向社区论坛-技术社区-学技术网

现象 结果
启动时弹出卡密窗口 ❌ 不再出现
点击”进阶用户” ✅ 直接提示”已解锁”
下载速度限制 ✅ 已解除
自动更新 ❌ 已禁用

🎉 后记

如果你碰到这个bug

图片[4]-记录EFetch桌面版的破解-软件安全逆向社区论坛-技术社区-学技术网

建议赶紧恢复快照,当然你可以重新安装试试,反正我没有成功过,当然破解也可以。

请登录后发表评论

    没有回复内容