利用 Recaf 修改字节码进行内核汉化
Recaf 是一款现代化的开源 Java 字节码编辑器。它支持多种反编译方式,拥有相对较高的性能,在开发者界广受推崇。本文将会简要介绍软件的使用方法,并教授如何利用 Recaf 修改字符串达到汉化代码的目的。
阅前注意
本章节使用到的工具(Recaf-gui)可以从这里下载:
https://github.com/Col-E/Recaf-Launcher/releases
01. 打开编辑器
Recaf 是以 jar 的形式分发的,它像 Minecraft 的开服核心一样,既可以直接点击打开,又可以通过 bat 脚本启动。
在 jar 文件旁边新建一个 bat 文件,并将如下内容放入:
@echo off
java -jar recaf-2.21.14-J8-jar-with-dependencies.jar
pause信息
实际指向的 jar 名称会因下载途径或版本不同而产生变化,请在放入运行前自行修改。
01. 定位字符串
首先需要准备好待汉化的插件或模组。
将 jar 文件拖入左侧空栏,或点击左上角“文件”,再点击“加载”,选择你需要的文件。
打开文件后,鼠标点击展开类,双击打开类文件,右侧会显示出反编译得到的插件代码。以 AdvancedCrates 为例,打开 Recaf 后,定位到需要汉化的字符串位置。
信息
字符串通常以英文单引号(')或双引号(")包裹,且 Recaf 自带的编辑器会以淡蓝色将其高亮标出。
信息
如果你的编辑器是英文,请参考本文最后的后记部分找到解决方案。

02. 打开表编辑模式
在选项卡上右键点击类名,点击“类查看方式”,将其切换为“Table”。

03. 找到方法名
切换后,点击二级选项卡右侧的“方法”,你会看到一些表格。
根据上图,我们需要找的内容就藏在这里。右键第二个类,点击“编辑汇编代码”,程序会弹出一个新的窗口供你编辑。
这里的代码有点类似 Minecraft 中的指令。我们要做的,就是找到与之前看见过的字符串相同格式的代码,并定位它。
如果你没能找到你需要汉化的字符串,你可以按 Ctrl+F 唤起搜索框,将需要翻译的文本粘贴至此。
如果搜遍整块汇编代码都没有找到,那有可能是因为你没有找对地方。请回到表格的其他类里再次重复上述步骤并唤起搜索。
如果成功找到了字符串,就将其替换为中文,并记得保存。改动后的字符串会实时显示在代码中。
修改字节码的一大优势就在于,它不需要引入外部库文件,便可以直接修改字符串。



警告
记得随时保存你的改动!出于某些原因,Recaf 并不能像大多数编辑器一样快速保存你的改动,也就是说,如果你在极短的时间之内先改动了字符串并按下了 Ctrl+S 保存,那么你的这些改用很有可能不会被记入。
因此,如果要防止这种情况出现,最好多按几下 Ctrl+S。Recaf 每次保存代码后,窗口边框都会闪烁提醒。
04. 导出
回到程序主界面,点击左上角菜单的“文件”,选择“导出程序”,为文件命名好后保存即可。
ex. 后记
01. 切换 Recaf 的显示语言
Recaf 一开始可能是英语状态。
点击上方工具栏的“配置(Config)”,在里面找到“语言(Language)”一项,在展开式列表中找到 zh-cn(简体中文),关闭 Recaf 重启后即可将界面改为中文。
02. 修改 Recaf 显示字体
Recaf 一开始的字体并不是非常令人满意。如果你需要修改字体,点击上方工具栏的“配置”,再找到“UI 字体”与“等宽文本(如编辑器)字体”这两项,在右侧的展开式列表中选择你需要的字体即可。个人推荐 Maple Mono NF CN。
03. 为什么不直接修改代码
很简单,如果你能找到导入代码中所需的库,那么这种直观快捷的修改方式是最合适的。然而,对于 Forge/NeoForge 等经过了映射的模组而言,找到能够导入的 jar 依赖库相当困难。有些时候还不如直接修改汇编代码。不过在插件范围内,找到前置库还是相对简单的。
04. 为什么有些字符串在表格里不显示
这是 Java 的编译机制使然。通常来讲,这些看似无法修改的代码可以比作子类的“投影”,可以在 同名类$xxx 等类似的地方找到。修改后者的字符串后,前者显示的内容会一起改变。
SnowCutieOwO