简单介绍
如果游戏的目录下 assets\bin\Data\Managed
出现了 Assembly-CSharp.dll
,那么说明是 mono
类型的,游戏逻辑就在 Assembly-CSharp.dll
和其它同路径下的文件里,此时用 dnspy
逆向。
如果没有看到Assembly-CSharp.dll
, 但是在 lib
目录下看到了 il2cpp_data
那么说明是 IL2CPP
类型的,需要使用 Il2CppDumper
进行逆向。
所以万壑之地是 IL2CPP
类型的,下载 Il2CppDumper
。
正统解包
打开 Il2CppDumper
执行 Il2CppDumper.exe
, 选择游戏文件 GameAssembly.dll
,然后再次选择 Vagrus_Data\il2cpp_data\Metadata
目录下的 global-metadata.dat
;等待执行完。
执行完成后 文件会被解压到 Il2CppDumper/DummyDll
目录下。
(好像没必要解包)
查找资源
打开 AssetStudio
选择载入目录
正统解包汉化
查看是否加壳
查看Unity资源
AssetStudio
可以通过 AssetStudio
打开游戏里的资源文件,预览各个资源。
替换Unity资源
AssetStudio
替换字体
1:查找
打开
AssetStudio
软件,选择加载游戏目录XXXXX_Data
,通过筛选,查找Font
文件在哪个资源文件里面。
打开UnityL10nTool
软件,选择加载游戏目录XXXXX_Data
,通过筛选,可以直接看到Font
文件在哪个资源文件里面。
2:导出
打开
UnityEX
软件,
学习扩展
大部分游戏汉化,替换的都是游戏里的字体和文本,游戏里字体分三种(TTF,TMP,UGUI)。
TTF为动态字体,大部分游戏不用,TMP静态字体,大部分不支持中文。UGUI为位图字体,需要制作位图。
- data/
- level x :多为一些场景资源
文本资源一般有以下框架类型
- UGUI
- NGUI
- IMGUI (默认禁用)
- TextMeshPro
- TextMesh (默认禁用, 文本通常漂浮在3D空间中)
- FairyGUI for Unity
- Utage (VN 游戏引擎)
AssetBundleExtractor
可以通过 AssetBundleExtractor
替换各个资源
1:替换TMP字体文件
通过 AssetStudio
查找字体名称带 SDF
文字的字体资源(MonoBehaviour
类型)(这是可以改名称的,但大部分是默认)。然后查看当前游戏的Unity
版本号,通过差不多的版本号制作TMP
字体,打包成demo,然后打开UABEA
,提取制作的TMP
字体,然后导出需要替换字体的原字体资源,然后打开字体的绑定包,修改绑定的字体路径和GUID。最后替换字体。替换完成后,通过另存为保存为游戏文件并进行替换测试。(注意:记得备份游戏文件)
反编译Unity
如果游戏的目录下 assets\bin\Data\Managed
出现了 Assembly-CSharp.dll
,那么说明是 mono
类型的,游戏逻辑就在 Assembly-CSharp.dll
和其它同路径下的文件里,此时用 dnspy
逆向。如果没有看到Assembly-CSharp.dll
, 但是在 lib
目录下看到了 libil2cpp.so
那么说明是 IL2CPP
类型的,需要使用 Il2CppDumper
+ ida
+ 其它进行逆向。
dnSpy
https://github.com/dnSpy/dnSpy
备份游戏,下载游戏对应版本的
dnSpy
防止修改导致的文件损坏,。dnSpy
有64位版本和32位版本,分别为dnSpy.exe
及dnSpy-x86.exe
,请根据游戏版本进行选择
下载调试版本mono.dll
下载完成后,替换mono.dll
文件,根据游戏位数选择替换的mono.dll
// 不同游戏版本下的文件路径
\XXX_Data\Mono\mono.dll
\XXX_Data\Mono\EmbedRuntime\mono.dll
\XXX_Data\MonoBleedingEdge\EmbedRuntime\mono-2.0-bdwgc.dll
\Mono\EmbedRuntime\mono.dll
\MonoBleedingEdge\EmbedRuntime\mono-2.0-bdwgc.dll
添加环境变量
DNSPY_UNITY_DBG:
--debugger-agent=transport=dt_socket,server=y,address=127.0.0.1:55555,defer=y,no-hide-debugger
DNSPY_UNITY_DBG2:
--debugger-agent=transport=dt_socket,server=y,address=127.0.0.1:55555,suspend=n,no-hide-debugger
打开dnSpy,进行断点调试
iLSpy
https://github.com/icsharpcode/ILSpy
插件方法汉化
BepInEx + AutoTranslator
BepInEx
下载之后打开压缩包,将“BepInEx(文件夹)”、“winhttp.dll”、“doorstop_config.ini”放入游戏根目录;首次运行游戏后,将自动在“BepInEx”目录下生成其他相关文件。至此,基础的BepInEx就已经安装完成。只需将Mod放入“BepInEx/plugins”目录中,即可使其生效。
AutoTranslator
下载 XUnity.AutoTranslator-BepInEx-5.3.0
解压放入 BepInEx
。启动游戏,然后退出。
打开 \BepInEx\config\AutoTranslatorConfig.ini
找到 [General] 将下面的Language=en
改成Language=zh
FromLanguage=ja
改成 FromLanguage=en
然后保存重新打开游戏
[Service]
Endpoint= ;//首选翻译项目
FallbackEndpoint= ; //备选翻译项目
[General]
Language=en ; //目标语言 en英语 ja日语 zh中文 zh-TW 繁中
FromLanguage=ja ; //原语言,游戏是什么就填什么
MaxCharactersPerTranslation =200 ; //每个要翻译的文本的最大字符数。最大 2500。
IgnoreWhitespaceInDialogue =True ; //是否忽略对话键中的空格,包括换行符
ForceSplitTextAfterCharacters =0 ; //一旦翻译文本超过此字符数,将文本拆分为多行
OverrideFont = ; //更新文本组件时覆盖用于文本的字体。注意:仅适用于 UGUI
OverrideFontTextMeshPro = ; //考虑改用 FallbackFontTextMeshPro。更新文本组件时覆盖用于文本的字体。注意:仅适用于 TextMeshPro
CopyToClipboard=False ;//是否将挂钩的文本复制到剪贴板上
-----------------------------------------------------------------------
[Baidu] 如果这里天百度翻译API
BaiduAppId= ;
configuredBaiduAppSecret= ;
学习扩展
思路:
1:看看游侠汉化组的ttf字体和otf字体有没有改变(没有改变)
2:通过英文字体制作TMP中文字体替换(不显示中文)
3:通过带空格的文本制作TMP中文字体(英文字体还是只显示一个单词)
4:不替换ttf,只替换tmp试试(英文字体还是只显示一个单词)
5:把原版的ttf字体删除,看看原版是不是用的ttf字体(不是用的ttf)
6:把TMP字体删了,看会不会使用TTF(会使用,但使用的是Arial)
文本在 level0 文件中,找游戏文本可以在里面找 MonoBehaviour 类型
换个字库制作TMP字体
通过doSpy调试程序
资源教程
https://www.cnblogs.com/guobaoxu/category/1616009.html
https://www.perfare.net/archives/1366
https://mod.3dmgame.com/read/3
I2 Localization 文本提取
CJK宏包对中文字体的支持比较麻烦,已经不再推荐使用。
xeCJK以及luatexja宏包在CJK基础上封装了对汉字排版细节的处理功能。
ctex宏包和文档类进一步封装了CJK、xeCJK、luatexja等宏包,使得用户在排版中文时不再考虑排版引擎等细节
插件翻译
首先找个能上 GitHub 的工具,然后搜索 BepInEx 和 XUnity.AutoTranslator
游戏是 64 位的,所以下64位的 BepInEx 和 XUnity.AutoTranslator,下载完成后放入到游戏根目录中,就是跟HELLION.EXE 同一级目录,然后打开一次游戏关掉。
进入\BepInEx\config\找到文件 AutoTranslatorConfig.ini ,打开后找到 [General] 将下面的Language=en改成zh
FromLanguage=ja 改成 en 然后保存重新打开游戏,现在应该能自动帮你翻译了,不能就按ALT+0选一下翻译引擎。就提示这么多,其他实在不懂的请自己想办法去解决。
相关软件
https://github.com/sinai-dev/UnityExplorer
https://github.com/Perfare/Il2CppDumper
软件汉化
查壳脱壳
查壳工具的作用是能够查询出来exe程序是否加壳,如果exe程序加壳了,就要先脱壳才能找到需要汉化的英文内容,还能查询exe程序使用那些编程语言编写的,才能够对症下药,使用不同的汉化工具,比如:有些NET语言写的软件,就要用到NET反编译工具才能够汉化。 脱壳的一般流程:查壳(PEID、FI、PE-SCAN)—>寻找OEP(OD)—>脱壳/Dump(LordPE、PeDumper、OD自带的脱壳插件、PETools)—>修复(Import REConstructor)。常见的三种壳:压缩壳、保护壳、捆绑壳
PEID
查壳工具:仅支持32位执行程序,不支持64位。ExeinfoPe
查壳工具:直接将需要查看的可执行exe程序拖入软件
使用
ExeinfoPe
查壳工具,将可执行exe
程序拖入软件。
简单汉化
1:有些没有加壳的执行文件,可以通过NotePad++
直接打开二进制文件,进行文本替换
2:推荐使用 SDL Passolo
进行汉化。打开 SDL Passolo
,新建项目,设置源文件,设置目标语言,然后设置字符串提取,提取出的字符串进行翻译,翻译完成后,点击右上方的保存,将目标保存起来
3:PE Explorer
基础汉化,用PE Explorer
软件汉化导致无法保存语言包,而且PE Explorer
v1版本只能用于汉化32位执行程序。v2版本目前好像只能读取。 在汉化软件的时候,很少有人会用到这个软件去汉化英文exe程序。V1版本教程: 使用PE Explorer
打开exe
软件,点击菱形的资源编辑器功能,如果是灰色,代表是加壳的exe程序,需要进行脱壳处理,如果是彩色,则直接可以读取并编辑,然后修改需要需求的标题,最后
遇到的问题
正常来说,运气很好的时候,一切都很顺利,运气差的时候,一替换文本,打包后就报错。因为有时候有的游戏是靠文本里的字段和长度进行的逻辑判断,一但你文本替换掉了,长度和位置发生了变化,那游戏就容易报错。