ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从250KB到136KB的极致瘦身:Discord Quest Completer的Windows假游戏进程实现全解

从250KB到136KB的极致瘦身:Discord Quest Completer的Windows假游戏进程实现全解

【免费下载链接】discord-quest-completer

A Windows desktop application to complete quests on Discord without installing the full actual games.

项目地址:https://gitcode.com/gh_mirrors/di/discord-quest-completer
点击查看免费下载

Discord Quest Completer 是一款面向 Windows 的桌面应用,核心玩法很"取巧":不安装动辄几十 GB 的真实游戏,只靠一个体积极小(几 MB 甚至更小)的"假游戏进程",就能让 Discord 识别出你正在"玩某款游戏",从而完成那些需要15 分钟游戏时长的 Discord Quest(任务)。本文带你拆解它最硬核的部分——如何把代表游戏的可执行文件从 250KB 一路瘦身到 136KB,以及背后的 Windows 进程伪装原理。


一、不装游戏也能刷任务:它解决了什么痛点

Discord 会定期放出Quest(任务活动),其中不少要求你先"游玩"某款已认证的游戏并累计一定时长,才能领取奖励。可现实是:

  • 🎮 游戏太大(动辄几十上百 GB),硬盘装不下;
  • 🐌 带宽有限,下载太慢;
  • 🛡️ 不想装游戏的反作弊(anti-cheat)或它根本跑不动你的电脑;
  • 💻 只是想"挂个游戏状态"给别人看。

Discord Quest Completer 正是为此而生:它用极小的成本模拟出"某款游戏正在运行"的状态,让你省下空间和流量,照样参与任务。

这些使用场景在项目里也有明确说明,可参考 README.md 的Use Cases章节。

它只支持Discord 已认证(Verified)、且能被自动检测到的游戏。游戏清单来自 Discord 的 detectable 接口,前端会把它缓存到 src/assets/gamelist.json。


二、Discord 如何"认出"你在玩哪款游戏

理解原理前,先要知道 Discord 检测游戏的机制。Discord 通过Rich Presence / Registered Games来识别游戏,它的判断逻辑其实并不神秘:

  1. 看进程名:检查有没有一个名字与真实游戏主程序完全一致的进程正在运行;
  2. 看位置:有时还要求该进程位于"游戏本该在的"安装目录里。

换句话说,Discord 关心的是"有没有一个叫xxx.exe的进程在跑",而不太管这个进程是不是几 GB 的真游戏。

💡 这就是本项目的突破口——只要能造出一个"名字对、位置对、一直在运行"的极小进程,就能骗过检测。这套"复制模板 → 改名 → 启动"的核心逻辑,都写在 src-tauri/src/lib.rs 里。


三、一个模板,复制成任意游戏:假游戏进程的诞生

Discord Quest Completer 并没有为每款游戏各写一个程序,而是用了**"一个万能模板 + 复制改名"** 的套路:

  1. 准备模板:打包时把编译好的超小进程二进制(src-win.exe)塞进应用的 resources,运行时路径形如data/src-win.exe(见 src-tauri/src/lib.rs 的runner_resource_name)。
  2. 建目录:按games/<游戏AppID>/<子路径>/的真实安装结构创建文件夹(game_folder_path)。
  3. 复制改名:把模板复制过去,并改名为真实游戏的主程序文件名(create_fake_game)。
  4. 启动:以--title 游戏名参数启动它,让它显示游戏名并保持运行(run_background_process)。
  5. 停止:用taskkill /F /IM <进程名>结束进程(stop_process)。

这个"万能模板"启动后会弹出一个显示游戏名的小窗口并挂一个系统托盘图标——因为部分游戏/Discord 需要检测到"有可见窗口"。它的完整 Windows 实现就在 src-win/src/main.cpp。

前端按钮的"Play / Stop / Install and Play"状态切换,逻辑在 src/components/GameExecutables.vue。


四、从 250KB 到 136KB 的极致瘦身:三种方案怎么取舍

整个项目的"灵魂 KPI"只有一个字——小。作者的目标是让每个平台的假进程控制在 100KB 上下。围绕这个目标,项目实测了三条路线(数据来自 README.md):

方案体积依赖运行时取舍结论
C# / .NET~7KB需要用户装 .NET 4.7 运行时最小,但给用户加负担 ❌
Rust +windowscrate~136KB无(自包含)小巧且不依赖外部 ✅
C++ WinAPI(当前落地)~250KB无(自包含)兼容性好,目前随包发布
  • 🧬7KB 的 C# 方案体积极致,却要求终端用户额外安装 .NET 运行时——这与"开箱即用"的理念相悖,所以被放弃;
  • 🦀136KB 的 Rust 方案用windowscrate 直接调 Win32 API 建窗口,自包含、无需任何运行时,是"更小且不依赖"的理想方向;
  • ⚙️当前仓库真正打包使用的是 C++ WinAPI 版本(约 250KB),因为它无需任何运行时、兼容性最稳,代码见 src-win/src/main.cpp。

所以标题里的"从 250KB 到 136KB",正是这条"在不逼用户装运行时的前提下,把自包含进程做得尽量小"的瘦身路径。


五、拆解 Windows 假进程:构建配方与瘦身技巧

为什么一个 C++ 程序能被压到只剩几百 KB?答案藏在构建配方里。它由三部分协同完成:

1. 用 Rust 的极致压缩编译配置

项目用 Rust 的 release profile 来驱动整条编译链,关键参数(见 src-win/Cargo.toml):

  • opt-level = "z"—— 以"最小体积"为目标优化;
  • lto = true—— 链接时优化,跨编译单元删掉死代码;
  • codegen-units = 1—— 单单元生成,最大化优化空间;
  • panic = "abort"+strip = true—— 去掉错误处理与符号表,进一步瘦身。

2. 在 build.rs 里塞入"省空间"链接参数

src-win/build.rs 通过cc编译 C++ 源码,并注入了一系列链接器开关:

  • /NODEFAULTLIB:不链接默认 C 运行时,省下大量体积;
  • /ENTRY:mainEntryPoint:手动指定入口为 C++ 里的mainEntryPoint;
  • /SUBSYSTEM:WINDOWS:无控制台窗口;
  • /GS-:关闭缓冲区安全检查(减体积);
  • /ALIGN:16与/FILEALIGN:16:对齐到 16 字节,进一步压缩文件。

3. C++ 源码本身也"抠到极致"

src-win/src/main.cpp 的实现有几个典型的"瘦身手法":

  • 动态加载 API:用LoadLibraryW+GetProcAddress运行时才取user32、shell32、gdi32的函数,避免静态链接开销;
  • 手写memset:用一段十几字节的小函数替代 CRT 版本(main.cpp);
  • 自己解析--title参数:不依赖标准库的字符串处理,直接从GetCommandLineW()里取游戏名(main.cpp)。

而 src-win/src/main.rs 本身只有一行#![no_main]+#![no_std]和一个空panic_handler,真正逻辑全在 C++ 里,Rust 仅充当"编译配置外壳"。

平台模板统一由 scripts/sync-runner.mjs 驱动:编译各平台 runner 再复制到资源目录,Windows 对应pnpm build:runner:win && pnpm copy:runner:win。


六、从搜索到开玩:完整使用流程

把上面的机制串起来,普通用户的操作路径其实非常简单:

  1. 🔍搜索游戏:应用启动时从 Discord detectable 接口拉取可检测游戏清单(fetch_gamelist_from_discord),前端用 Fuse.js 做模糊搜索(src/pages/HomeView.vue);
  2. ➕加入列表:把想刷的游戏加到待办列表;
  3. ▶️点 Play:若该可执行文件"未安装",先触发install_and_play——即复制模板(create_fake_game)再启动(run_background_process),见 installAndPlay;
  4. ⏱️计时:假进程常驻,Discord 检测到后状态显示为"正在玩 X",任务时长按需累计(常见为 15 分钟);
  5. ⏹️点 Stop:调用stop_process结束进程。

小提示:假进程会持续占用游戏名,玩完记得 Stop,避免长时间挂着。


七、运行目录长这样:安装、维护与卸载

应用会在自己所在目录下生成假游戏文件。因此务必把它放在你有写入/执行权限的目录(别放C:\Program Files\这类需提权的目录),否则可能无法创建文件(见 README.md 的安装说明)。解压后的目录结构大致如下:

discord-quest-completer/ ├── discord-quest-completer.exe # 主程序 ├── data/ │ └── src-win.exe # 假游戏进程模板 └── games/ └── <game-id>/ # 按游戏 AppID 存放的假游戏

🧹日常维护:玩久了games/下会积累不少文件夹,手动删掉不用的即可;卸载更是简单粗暴——删掉整个应用目录就完事。


八、支持平台与技术栈一览

维度说明
主平台Windows 11(Windows 10 理论可用,未重点测试)
Linux / macOS暂未支持——核心原因是假进程尚未在各平台都压到足够小
技术栈🦀 Rust(后端) + 🌐 Vue.js(前端) + 🧰 Tauri(桌面框架)
渲染依赖需 WebView2(Win11 自带,更早系统需手动安装)

技术栈与依赖声明可分别在 src-tauri/Cargo.toml 和 package.json 中查看。


写在最后

Discord Quest Completer 的巧妙之处在于:它没有"硬怼"游戏本身,而是精准抓住了Discord 靠进程名识别游戏这一检测机制,再用一个被极致压缩过的自包含小进程去满足它。从 250KB 的 C++ 版本,到 136KB 的 Rust 版本,再到 7KB 却"有门槛"的 C# 版本,这条瘦身之路本质上是在**"体积"与"零依赖"**之间反复权衡。

⚠️合规提醒:本项目定位为学习与个人用途。使用此类模拟工具可能涉及 Discord 服务条款、游戏发行商与广告主的权益,后果需自行承担,请自行权衡风险。

想深入源码?可直接克隆仓库后按平台编译对应 runner:

git clone https://gitcode.com/gh_mirrors/di/discord-quest-completer cd discord-quest-completer pnpm install pnpm build:runner:win && pnpm copy:runner:win pnpm tauri dev

【免费下载链接】discord-quest-completer

A Windows desktop application to complete quests on Discord without installing the full actual games.

项目地址:https://gitcode.com/gh_mirrors/di/discord-quest-completer
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进