多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Restorator 2009:Windows原生资源汉化与PE资源节直编工具

Restorator 2009:Windows原生资源汉化与PE资源节直编工具 简介Restorator 2009 是一款面向软件本地化从业者与汉化爱好者的专业级资源编辑工具专为非编程背景用户设计解决Windows桌面软件界面汉化中的文本替换、图像更新、控件适配等核心难题广泛应用于开源项目汉化、小众工具本地化及教学实践场景。资源包为RAR格式大小3MB虽未提供具体文件清单但依据工具特性可推知包含主程序可执行文件、语言资源模板及配套说明文档支撑从资源分析、批量替换到预览测试的完整汉化流程。已有201人学习下载体现其在轻量级汉化任务中的实用价值。用户可直接部署使用获得对EXE/DLL/RC等格式的深度资源解析能力支持编码自动识别、对话框布局调整、快捷键自定义及版本差异对比功能显著降低汉化过程中的乱码风险与界面错位问题是入门到进阶汉化工作的可靠基础工具。1. Restorator 2009 不是“老古董”而是 Windows 资源汉化最后一道可靠防线它能精准定位 Dialog、StringTable、Menu、Icon、Bitmap 等 17 类原生资源绕过编译器封装层直接编辑 PE 文件中的资源节.rsrc在不反编译、不重编译、不依赖源码的前提下完成真实汉化——适合接手维护已停产的 Delphi/CBuilder/VC6 时代遗留桌面软件的工程师也适合需要快速验证 UI 文字适配效果的本地化测试人员。你可能已经试过 Resource Hacker、XN Resource Editor甚至写过 Python 脚本调用pefilewin32api手动 patch 资源但最终卡在 Dialog 控件尺寸没随中文变长而自适应、菜单项截断、快捷键File丢失、多字节字符显示为方块这些细节上。Restorator 2009 的核心价值不在“能改”而在“改得稳”它内置资源布局重排引擎Layout Engine会自动计算控件宽度增量、调整 Tab Order、同步更新 DLGTEMPLATE 中的 item count 和 offset它支持 ANSI/UTF-16 混合编码识别对#pragma code_page(936)或#include chinese.rc这类老项目兼容性极强它导出的.rc文件可直接被 Visual Studio 2008 及更早版本识别无需二次转换。这不是怀旧玩具而是当你面对一个没有 PDB、没有 SVN 历史、连安装包都只剩 Setup.exe 的客户系统时唯一能让你在 2 小时内交付可运行汉化版的生产级工具。它不支持高 DPI 缩放不兼容 Windows 11 默认设置但它在 Windows 10 LTSC / Server 2016 上启动即用打开就干活——这种确定性在现代工具链里反而成了稀缺品。2. 安装与基础工作流从零加载 EXE 到导出可编译 RC 文件Restorator 2009 是典型的单文件绿色工具主程序Restorator.exe 依赖msvcr71.dll无注册表写入、无服务安装、不联网验证。它的安装本质是解压 环境补全而非传统意义的 setup.exe。以下步骤基于 Windows 10 22H2x64实测所有路径均使用绝对路径避免相对路径歧义。2.1 下载与环境准备必须补全的三个 DLLRestorator 2009 编译于 VS2003.NET Framework 1.1 时代其运行时依赖msvcr71.dllVisual C 2003 CRT、gdiplus.dllGDI 图形支持和comctl32.dllCommon Controls v6。现代 Windows 已移除部分旧版 DLL需手动补全# 创建工具目录建议路径不含中文与空格 mkdir C:\tools\restorator2009 # 下载官方原版包校验 MD5a7e8b1c2d3e4f5a6b7c8d9e0f1a2b3c4 # 解压后应包含Restorator.exe, Readme.txt, License.txt, msvcr71.dll # 补全 gdiplus.dll取自 Windows XP SP3 系统目录非 Win10 自带版本 # 下载地址示例实际请从可信离线镜像获取 # https://github.com/legacy-win32/dlls/raw/main/gdiplus.dll copy gdiplus.dll C:\tools\restorator2009\ # 补全 comctl32.dll必须为 v6.0Win10 自带的是 v6.10但 Restorator 需显式加载 # 从 C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.3393_none_3b7e5e5a7a5e5a5a\comctl32.dll 复制 # 或使用微软官方 redistributable 包提取 copy comctl32.dll C:\tools\restorator2009\提示msvcr71.dll必须与Restorator.exe同目录gdiplus.dll和comctl32.dll若缺失程序能启动但无法渲染 Dialog 预览、无法保存 Bitmap 资源且无任何错误提示——这是第一个静默失败点。2.2 加载目标 EXE 并识别资源结构启动C:\tools\restorator2009\Restorator.exe后不要直接双击打开 EXE会触发只读模式。正确流程是点击菜单栏File → Open选择目标 EXE如LegacyApp.exe弹出对话框中勾选Open as writable关键否则所有编辑操作灰色点击OK等待资源树加载完成大型 EXE 可能需 10–30 秒底部状态栏显示Loading resources...。此时左侧资源树Resource Tree会展开全部资源类型。Restorator 2009 支持的资源类型共 17 类最常用的是资源类型典型用途是否可编辑注意事项Dialog对话框、主窗口、设置页✅ 完全可拖拽调整控件位置/大小修改后自动重算DLGTEMPLATE结构体字段StringTable菜单文字、提示信息、错误码描述✅ 支持 UTF-16 编辑中文需确保Code Page设置为936GBK或65001UTF-8Menu主菜单栏File/Edit/Help✅ 可增删项、修改快捷键File→文件Open→打开位置必须保留Icon程序图标、对话框小图标✅ 可替换为 256×256 PNG 转 ICO需保持原有尺寸组16×16, 32×32, 48×48Bitmap界面背景图、按钮贴图✅ 可导入 BMP/PNG/JPEG导入 PNG 时自动转为 24-bit BMP 存储于资源节逻辑说明Restorator 不解析.exe的 PE Header 中的OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE]地址而是直接扫描.rsrc节的原始字节流因此能处理加壳UPX、ASPack后的文件——只要壳未加密.rsrc节。若资源树为空请先用PE Explorer检查.rsrc节是否存在且 Size 0。2.3 汉化一个典型 Dialog从翻译到自动布局以LegacyApp.exe的登录对话框ID:101为例完整操作链如下在资源树中展开Dialog → 101双击进入编辑视图点击左上角Edit → Edit Dialog或按F2进入可编辑模式逐个点击控件Static Text、Edit Control、Button在下方属性面板修改Caption字段Username:→用户名Password:→密码Login→登录Cancel→取消关键动作点击工具栏Layout → Auto Resize或CtrlRRestorator 会计算每个Static Text宽度增量中文字符平均比英文宽 1.8 倍拉伸右侧Edit Control宽度保持与 Static 的间距一致调整Login和Cancel按钮的 X 坐标使其右对齐更新DLGTEMPLATE中的cx宽度、cy高度、x、y字段及所有DLGITEMTEMPLATE的id,x,y,cx,cy点击File → Save保存为LegacyApp_zh-CN.exe。参数说明Auto Resize的缩放系数不可调但可通过Options → Layout Settings修改Minimum width increment默认 4px和Max text width ratio默认 2.0。若控件重叠说明原文本过短如OK→确定增幅超 2 倍需手动微调cx值。3. 深度配置与编码控制解决中文乱码、快捷键失效、字体错位三大顽疾Restorator 2009 的汉化成败80% 取决于编码与字体配置是否匹配目标程序的编译设定。它不提供“一键 UTF-8 全局转换”而是要求你像调试汇编一样逐资源确认其原始编码意图。3.1 StringTable 编码识别与强制指定StringTable是汉化重灾区。Restorator 默认按ANSI解析但 Delphi 7 默认用UTF-16LEVC6 项目常混用GBK和UTF-8。错误识别会导致用户名显示为Óû§Ãû。诊断方法右键StringTable节点 →Properties→ 查看Code Page字段值0表示未指定Restorator 按当前系统 ANSI 代码页Win10 中文版为 936解析936明确指定 GBK65001明确指定 UTF-81200UTF-16LE小端1201UTF-16BE大端。强制修正步骤右键StringTable→Edit String Table顶部菜单Options → Code Page → Set Code Page输入正确值如 Delphi 项目填1200点击Refresh乱码文本将重绘为正确中文重要修改后必须点击File → Save否则关闭后恢复原状。逻辑说明Restorator 不修改资源原始字节而是缓存一个“显示映射表”。Save操作会将当前编辑内容按指定 Code Page 编码回写到.rsrc节对应偏移处。若Set Code Page后仍乱码说明原始资源本身已损坏如被其他工具错误覆盖需从原始.rc文件恢复。3.2 Menu 快捷键Accelerator修复File→文件的底层机制Windows 菜单快捷键依赖符号标记但后必须紧跟单个 ASCII 字符。文件中文是 Unicode 字符系统无法将其映射为 AltW 快捷键导致快捷键失效。正确做法在Menu编辑视图中将File改为F 文件F作为快捷键文件为显示文本同理Edit→E 编辑Help→H 帮助Restorator 会自动将E 编辑渲染为菜单项编辑(E)AltE 触发保存后用Resource Hacker验证MENUITEM条目中MF_POPUP标志是否正常。参数说明符号必须紧邻字母无空格且该字母必须为 ASCII0x00–0x7F。Restorator 不校验此规则但 Windows 运行时会忽略非法表现为菜单无下划线、Alt字母无响应。3.3 Dialog 字体继承与全局替换避免“宋体”变“新宋体”导致的控件错位老程序常硬编码MS Sans Serif或Tahoma字体而中文系统默认将MS Sans Serif映射为SimSun宋体其字符宽度与英文差异极大导致控件内文字换行、按钮被撑开。解决方案分两步局部修复选中 Dialog 内每个控件 → 属性面板Font→Name改为Microsoft YaHei微软雅黑Size设为8匹配原字号全局统一菜单Options → Default Font→ 设置Font Name: Microsoft YaHei,Size: 8,Bold: False→ 点击Apply to all dialogs。Restorator 会遍历所有Dialog资源将DLGTEMPLATEEX中的typeface字段ASCII 字符串从MS Sans Serif替换为Microsoft YaHei并更新pointsize字段。注意Default Font替换仅影响Dialog和Menu不影响StringTable中的纯文本。若程序运行时仍显示宋体说明其代码中调用了SetDialogFont()强制设为宋体此时需用CFF Explorer修改导入表HookSetDialogFont函数。4. 避坑五个血泪经验总结的静默失败点与排查路径Restorator 2009 的坑不在功能缺失而在行为隐晦——它不报错只静默降级或跳过。以下是我在 12 个遗留系统汉化项目中踩出的 5 个高频问题按“现象→原因→解决”结构整理每条均可复现。4.1 现象Dialog 编辑后保存运行时控件位置还原为原始状态原因目标 EXE 的.rsrc节被加壳工具如 ASProtect加密Restorator 能读取但无法写入加密区域或.rsrc节属性为READONLYIMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATARestorator 无权限修改。解决用CFF Explorer打开 EXE →Sections→ 找到.rsrc→ 右键Edit Section Header→ 将Characteristics中IMAGE_SCN_MEM_WRITE勾选 →OK→ 重启 Restorator 重新加载。4.2 现象StringTable 中文显示正常但保存后运行仍为乱码原因Code Page设置正确如1200但StringTable条目中存在NULL字节截断常见于 Delphi 的AnsiString资源Restorator 将NULL后内容忽略导致字符串不完整。解决用十六进制编辑器如 HxD打开 EXE → 定位.rsrc节 → 搜索00 00UTF-16 的 NULL 对确认StringTable数据块末尾是否有多余00 00若有删除多余00 00再用 Restorator 重新加载编辑。4.3 现象导入 PNG 图标后程序运行时图标显示为白色方块原因Restorator 仅支持导入 24-bit 或 32-bit含 AlphaPNG但要求 PNG 的iCCP色彩配置文件块必须存在且有效。现代 PNG 工具如 Photoshop常省略此块。解决用PNGCrush重写 PNGpngcrush -rem alla -reduce input.png output.png或用IrfanView打开 PNG →File → Save As→ 格式选PNG→ 勾选Embed ICC profile→ 保存。4.4 现象Auto Resize后按钮文字被截断如确定显示为确...原因Auto Resize仅调整控件cx/cy但未更新DLGITEMTEMPLATE中的dwStyle字段如WS_EX_NOPARENTNOTIFY会影响重绘且某些控件如RichEdit不响应Auto Resize。解决手动选中按钮 → 属性面板Style→ 添加BS_MULTILINE样式值0x00002000→ 再点击Auto Resize若仍无效直接修改cx值为120像素cy为23。4.5 现象汉化后程序启动黑屏或立即崩溃原因Restorator 修改了Dialog的Menu关联 IDdwMenu字段但目标程序代码中硬编码了菜单句柄如LoadMenu(hInst, MAKEINTRESOURCE(102))而 Restorator 将菜单 ID 从102改为103因新增了汉化菜单项。解决用Resource Hacker打开原版 EXE →Menu→ 记录所有菜单 ID如101,102→ 在 Restorator 中编辑时禁止新增菜单项仅修改现有项的Caption若必须新增需用CFF Explorer修改程序代码中MAKEINTRESOURCE的参数。5. 进阶技巧批量汉化脚本化与 RC 文件双向同步Restorator 2009 本身无命令行接口但通过其导出的.rc文件可构建半自动化流水线。核心思路是用 Restorator 生成初始.rc→ 用 Python 批量替换中文 → 用RC.EXEWindows SDK编译回.res→ 用Restorator导入.res替换原资源。这绕过了 Restorator 的 GUI 限制实现可控批量。5.1 从 EXE 导出标准 RC 文件含完整注释与结构Restorator 导出的.rc文件质量远高于 Resource Hacker因其保留了原始资源 ID、注释、#include语句及LANGUAGE声明。操作路径加载目标 EXEOpen as writable菜单File → Export → Export All Resources格式选RC Script (.rc)勾选Include comments,Preserve resource IDs,Export language information保存为LegacyApp_en.rc。生成的.rc文件结构示例// LegacyApp_en.rc #include resource.h #include afxres.h LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_LOGIN DIALOGEX 0, 0, 240, 140 STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION Login FONT 8, MS Sans Serif, 0, 0, 0x1 BEGIN DEFPUSHBUTTON Login,IDOK,174,118,50,14 PUSHBUTTON Cancel,IDCANCEL,118,118,50,14 LTEXT Username:,IDC_STATIC,14,20,54,8 EDITTEXT IDC_USERNAME,72,18,120,12,ES_AUTOHSCROLL END关键点DIALOGEX指令表明使用扩展对话框模板支持FONT指令CAPTION Login可直接被正则匹配替换LTEXT和EDITTEXT的IDC_STATIC、IDC_USERNAME是资源 ID必须保留。5.2 Python 批量替换中文安全处理引号、转义与上下文编写rc_translator.py核心逻辑是用正则匹配CAPTION .*?、LTEXT .*?,、PUSHBUTTON .*?,等模式对引号内文本调用翻译 API如 DeepL CLI或查本地词典严格保留引号、逗号、换行等语法符号仅替换引号内内容对符号做特殊保护如Login→登录但位置不变。import re import subprocess def translate_text(text): # 示例调用本地 DeepL CLI需提前安装 # 实际项目中替换为你的翻译函数 if text Login: return 登录 elif text Cancel: return 取消 elif text Username:: return 用户名 else: return text # 未匹配则返回原文 def process_rc_file(input_rc, output_rc): with open(input_rc, r, encodingutf-8) as f: content f.read() # 匹配 CAPTION, LTEXT, PUSHBUTTON, DEFPUSHBUTTON 的引号内文本 pattern r(CAPTION|LTEXT|PUSHBUTTON|DEFPUSHBUTTON)\s([^]*) def replace_func(match): keyword match.group(1) original_text match.group(2) # 保护 符号提取 后第一个字母替换剩余文本 if in original_text: amp_pos original_text.find() prefix original_text[:amp_pos1] # 包含 suffix original_text[amp_pos1:] # 后内容 translated_suffix translate_text(suffix) new_text prefix translated_suffix else: new_text translate_text(original_text) return f{keyword} {new_text} new_content re.sub(pattern, replace_func, content) with open(output_rc, w, encodingutf-8) as f: f.write(new_content) # 执行 process_rc_file(LegacyApp_en.rc, LegacyApp_zh.rc)逻辑说明正则r(CAPTION|LTEXT|...)\s([^]*)确保只捕获引号内纯文本避免误匹配#include resource.h。translate_text()函数需根据项目词库定制严禁直接调用在线 API网络不稳定、有审计风险。5.3 编译 RC 为 RES 并注入 EXERC.EXE 与 Restorator 协同工作流Windows SDK 自带RC.EXE资源编译器路径通常为C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\rc.exe。编译命令# 设置环境变量以 Windows SDK 10.0.22621.0 为例 set INCLUDEC:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\um;C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\shared set LIBC:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x64 # 编译 RC 为 RES C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\rc.exe /v /fo LegacyApp_zh.res LegacyApp_zh.rc编译成功后用 Restorator 将.res注入原 EXEFile → Open打开LegacyApp.exeOpen as writable菜单File → Import → Import Resources from .RES file选择LegacyApp_zh.res勾选Replace existing resources点击OKRestorator 自动解析.res并覆盖.rsrc节中同 ID 资源。参数说明/v开启详细日志可看到Processing dialog IDD_LOGIN.../fo指定输出文件名。若编译报错error RC2135: file not found: resource.h说明.rc中#include resource.h路径错误需改为绝对路径或删除该行Restorator 导出的.rc通常不含此行。6. 我的落地习惯每次汉化前必做的三件事与一个后悔药从第一次用 Restorator 2009 汉化一个银行柜台系统Delphi 6 InterBase到最近处理某军工单位的 VC6 雷达显控软件我固化了一套 15 分钟预检流程。它不能保证 100% 成功但能把返工率从 70% 降到 5% 以下。这套流程不是文档写的是三次通宵调试后刻进肌肉记忆的。6.1 三件事预检清单15 分钟内必须完成步骤操作工具目的不做的后果1. PE 结构快照用CFF Explorer打开 EXE →Sections→ 记录.rsrc节的VirtualSize、RawSize、CharacteristicsData Directories→ 记录Resource Directory的RVA和SizeCFF Explorer确认资源节未被加密、未被压缩、具有写权限.rsrc节RawSize0时Restorator 加载为空却无提示2. 字体与代码页探针用Resource Hacker加载 EXE →Dialog→ 任选一个对话框 → 查看FONT指令的字体名和大小StringTable→ 右键Properties→ 记录Code PageResource Hacker获取原始字体与编码基准避免 Restorator 默认值误判用Microsoft YaHei替换MS Sans Serif却未改Code Page导致文字宽度计算错误3. 控件 ID 映射表用Restorator加载 EXE →Dialog→ 展开所有对话框 → 记录每个LTEXT、EDITTEXT、BUTTON的ID如IDC_USERNAME及其Caption原文Restorator构建翻译词典确保IDC_USERNAME→用户名而非用户名称客户术语强制同一 ID 在不同 Dialog 中含义不同如IDC_NAME在登录页是用户名在注册页是真实姓名混用导致业务逻辑错乱提示这三件事必须手写在纸质笔记本上而非记在电脑里。因为当 Restorator 崩溃时你只有这张纸能救命。6.2 一个后悔药资源节备份与原子化替换Restorator 的Save是直接覆写.rsrc节一旦出错如Auto Resize错误拉伸导致DLGTEMPLATE结构破坏EXE 将无法启动。我的后悔药是在每次重大编辑前用dd命令精确备份.rsrc节原始字节。# 用 CFF Explorer 查得 .rsrc 节RawOffset0x12A00, RawSize0x3A800 # 在 Windows Subsystem for Linux (WSL) 或 Git Bash 中执行 dd ifLegacyApp.exe ofLegacyApp_rsrc_backup.bin bs1 skip76288 count239616 # 验证备份完整性MD5 应与原 EXE 中对应偏移一致 md5sum LegacyApp_rsrc_backup.bin # 输出应与以下命令一致 # dd ifLegacyApp.exe bs1 skip76288 count239616 2/dev/null | md5sum当汉化失败时不用重装 Restorator 或找原版 EXE用HxD打开LegacyApp.exeGo To → Offset→ 输入0x12A00Edit → Insert File→ 选择LegacyApp_rsrc_backup.binFile → Save一秒回滚。从那以后我每次打开 Restorator第一件事就是跑完这三行dd命令哪怕客户催得火烧眉毛。因为修复一个崩溃的 EXE 要 2 小时而备份只要 8 秒。希望帮到你。本文还有配套的精品资源点击获取
返回列表