galgame 引擎适配与中文化工具箱 — 一个 exe,零配置,自动识别游戏引擎,注入钩子,搞定字体与汉化。
把 GalEngineKitLauncher.exe 丢进游戏目录,双击运行。启动器自动:
- 扫描目录特征文件、归档格式、可执行文件名
- 内置多种常见引擎识别规则(KiriKiri2 / YU-RIS / Ren'Py / Unity / Artemis / CatSystem2 / BGI / Majiro / Tyrano / RPG Maker VX Ace / RPG Maker MV)
- 自动选择目标 exe(排除设置程序、卸载程序)
- 自动匹配对应引擎的钩子 DLL(
hooks/<engine_id>_hook.dll) - 生成配置并直接运行,不需要写任何 ini 文件
有 GalEngineKit.ini 时自动切换到配置模式,向后兼容。
不依赖 Detours,独立实现导入表注入:
- 以挂起方式创建目标进程
- 解析 PE 头,定位导入表
- 在目标进程分配新内存,构建完整导入表(新 DLL 描述符 + 原始描述符副本 + DLL 名 + INT/IAT)
- 修改 PE 头导入表数据目录指向新内存
- 恢复主线程,Windows 加载器自动加载钩子 DLL
关键优势:注入发生在进程执行前,纯内存写入,不触发 Box64/Box86 翻译缓存失效,对 Wine/Winlator 等动态翻译环境友好。
在进程恢复前修改内存中的指令字节,应用前比对原始字节防止版本不匹配。支持 module:rva 地址格式,适用于任何引擎。
- MinGW 静态链接(
-static -static-libgcc -static-libstdc++) - 不依赖 VC++ 运行时、不依赖任何外部 DLL
- 32 位 / 64 位双版本
- 内嵌原创图标和版本信息
| 环境 | 状态 | 说明 |
|---|---|---|
| Windows 7 / 8 / 10 / 11 | ✅ | 仅使用 Windows 2000+ API |
| Wine (Linux/macOS) | ✅ | 自动检测 Wine 环境并输出版本 |
| Winlator (Android) | ✅ | 核心目标平台,导入表注入针对 Box64/Box86 优化 |
| CrossOver / Crossover | ✅ | 基于 Wine,兼容 |
启动时自动检测运行环境(原生 Windows / Wine),在日志中输出环境信息和适配提示。
从 Releases 下载:
GalEngineKitLauncher-32bit.exe— 32 位游戏用(大多数 galgame)GalEngineKitLauncher-64bit.exe— 64 位游戏用example_hook-32bit.dll/example_hook-64bit.dll— 示例钩子(验证注入链路用)
游戏目录/
├── 游戏.exe
├── GalEngineKitLauncher-32bit.exe ← 放这里
└── example_hook-32bit.dll ← 可选,验证注入用
双击 GalEngineKitLauncher-32bit.exe,启动器自动识别引擎并运行游戏。
成功标志:
- 游戏正常启动
- 目录下生成
galenginekit_hook.log(示例钩子 DLL 加载成功) logs/目录下有启动器日志,包含引擎识别结果和环境信息
| 引擎 | 识别 ID | 状态 | 文本渲染 | 推荐方案 |
|---|---|---|---|---|
| KiriKiri2 / KAG | krkr2 |
✅ verified | GDI+ | 引擎钩子 |
| YU-RIS | yuris |
✅ verified | 位图字体图集 | 引擎钩子 |
| Artemis Engine | artemis |
📝 draft | GDI | 引擎钩子 |
| Ren'Py | renpy |
📝 draft | FreeType | 字体替换 |
| Unity | unity |
📝 draft | 混合 | 引擎钩子 |
| CatSystem2 | catsystem2 |
📝 draft | GDI | 引擎钩子 |
| BGI / Ethornell | bgi |
📝 draft | GDI | 引擎钩子 |
| Majiro | majiro |
📝 draft | GDI | 引擎钩子 |
| TyranoBuilder | tyrano |
📝 draft | Web 渲染 | 字体替换 |
| RPG Maker VX Ace | rpgmaker_vxa |
📝 draft | GDI | 字体替换 |
| RPG Maker MV/MZ | rpgmaker_mv |
📝 draft | Web 渲染 | 字体替换 |
引擎档案位于 profiles/ 目录,JSON 格式,包含识别特征、文本渲染路径、字体方案、钩子目标等信息。新增引擎只需添加一个 JSON 档案。
当需要精细控制时,创建 GalEngineKit.ini:
[Launcher]
TargetEXE = game.exe
WorkingDir = .
StaySuspended = false
LogLevel = info
[Inject]
DLLCount = 1
DLL_0 = hooks/krkr2_hook.dll
InjectMethod = auto ; import_table | helper | auto
[Patch]
PatchCount = 0
; Patch_0_File = patches/fix.bp
[Environment]
; WINEDLLOVERRIDES = winmm=n,b完整配置说明见 launcher/examples/GalEngineKit.ini.example。
补丁文件(.bp)每行一条规则:
; 注释
<地址> : <原始字节> -> <补丁字节>
- 地址:
0x12345(RVA)或module.exe:0x12345 - 字节: 空格分隔的十六进制
示例:
; 将 JE 改为 JMP
game.exe:0x00012345: 74 03 -> EB 03
GalEngineKitLauncher.exe [选项] [配置文件]
-h, --help 显示帮助
-v, --version 显示版本
-c, --config <路径> 指定配置文件
-l, --log-level <级别> 日志级别: error, warn, info, debug
--no-wait 不等待目标进程退出
--dry-run 仅校验配置,不启动进程
所有钩子 DLL 遵循统一接口(hooks/include/ge_hook_api.h):
#include "ge_hook_api.h"
static const GEK_HookInfo g_info = {
GEK_HOOK_API_VERSION,
L"krkr2_font", // 钩子名称
L"0.1.0", // 版本
L"KiriKiri2", // 目标引擎
L"KiriKiri2 字体替换钩子",
0
};
extern "C" __declspec(dllexport)
const GEK_HookInfo* GEK_HookGetInfo(void) { return &g_info; }
extern "C" __declspec(dllexport)
int GEK_HookInitialize(const GEK_HookInitParams* params) {
// 安装钩子逻辑
return 0;
}
extern "C" __declspec(dllexport)
void GEK_HookShutdown(void) {
// 清理
}钩子 DLL 命名为 <engine_id>_hook.dll(如 krkr2_hook.dll),放到游戏目录的 hooks/ 子目录下,智能模式会自动匹配。
# 启动器
cd launcher
mkdir build && cd build
cmake .. -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release
cmake --build .
# 钩子 DLL
cd ../../hooks
mkdir build && cd build
cmake .. -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release
cmake --build .CI 自动构建 32 位和 64 位版本,见 .github/workflows/ci.yml。
在 profiles/ 目录添加 <engine_id>.json,参考 schemas/engine-profile.schema.json。用 tools/validate_profile.py 校验:
python3 tools/validate_profile.py profiles/new_engine.jsonGalEngineKit/
├── launcher/ # 通用钩子启动器
│ ├── include/ # 头文件
│ │ ├── ge_types.h # 公共类型
│ │ ├── ge_engine_detector.h # 引擎识别
│ │ ├── ge_injector.h # DLL 注入(导入表+辅助进程)
│ │ ├── ge_pe.h # PE 格式解析
│ │ ├── ge_patcher.h # 静态字节补丁
│ │ ├── ge_process.h # 进程管理
│ │ └── ...
│ ├── src/ # 实现
│ ├── resources/ # 图标和资源
│ ├── examples/ # 配置示例
│ └── CMakeLists.txt
├── hooks/ # 钩子 DLL 开发框架
│ ├── include/ge_hook_api.h # 统一钩子接口
│ ├── src/example_hook.cpp # 示例钩子
│ └── CMakeLists.txt
├── profiles/ # 引擎档案库(JSON)
│ ├── krkr2.json
│ ├── yuris.json
│ └── artemis.json
├── schemas/ # JSON Schema
├── tools/ # 工具脚本
├── docs/ # 文档
│ └── specs/launcher.md # 启动器规格文档
├── .github/workflows/ci.yml # CI 构建
├── THIRD_PARTY_NOTICES.md # 第三方声明
├── CONTRIBUTING.md # 贡献指南
├── LICENSE # MIT
└── README.md # 本文件
在 Winlator 等动态二进制翻译环境下:
- 内联钩子(修改函数开头字节跳转到自定义函数):修改的是已翻译的代码,可能触发 Box64 翻译缓存失效,且钩在 Wine 内置 DLL(ARM64 原生代码)上会崩溃
- 导入表注入:在进程执行前修改 PE 导入表,纯内存写入,不触发翻译缓存失效;钩子 DLL 只钩游戏自身代码,不碰 Wine 内置 DLL
- 静态字节补丁:最可靠的修改方式,不依赖任何 API 钩子
- 只钩游戏自身代码,不钩 Wine 内置 DLL
- 优先使用 IAT 钩子(修改导入地址表)和静态补丁
- 内联钩子仅用于游戏自身函数,且需验证翻译缓存行为
- 启动器自动检测 Wine 环境,在日志中输出适配提示
- 独立实现:所有代码为原创实现,未复制任何第三方项目的代码或文档
- 参考项目(仅研究功能规格,未使用代码):SimpleFontHook、VN_Localization_Tutorials(RiaLoader)
- 第三方依赖:无运行时依赖;构建使用 MinGW-w64(开源工具链)
- 许可:MIT License
详见 THIRD_PARTY_NOTICES.md 和 docs/clean-room-policy.md。
- Phase 0: 项目骨架 + 引擎档案 schema
- Phase 1: 引擎档案库(KiriKiri2 / YU-RIS / Artemis)
- Phase 2: 通用钩子启动器(导入表注入 + 静态补丁 + 智能识别)
- Phase 3: 真实引擎钩子 DLL(KiriKiri2 字体替换 → YU-RIS → 更多)
- Phase 4: GUI 版本 + 容器配置助手 + 一键部署
MIT License. Copyright (c) 2026 GalEngineKit contributors.