2024-08-26 | 学习笔记 | UNLOCK | 更新时间:2024-8-26 19:15

零基础实战万壑之地的问题集合

简单介绍

如果游戏的目录下 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

UE4游戏汉化教程

替换字体

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.exednSpy-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官网 国内相关网站

下载之后打开压缩包,将“BepInEx(文件夹)”、“winhttp.dll”、“doorstop_config.ini”放入游戏根目录;首次运行游戏后,将自动在“BepInEx”目录下生成其他相关文件。至此,基础的BepInEx就已经安装完成。只需将Mod放入“BepInEx/plugins”目录中,即可使其生效。

AutoTranslator

BepInEx官网

下载 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调试程序

资源教程

UE4游戏汉化教程

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程序,需要进行脱壳处理,如果是彩色,则直接可以读取并编辑,然后修改需要需求的标题,最后

Bubbling

遇到的问题

正常来说,运气很好的时候,一切都很顺利,运气差的时候,一替换文本,打包后就报错。因为有时候有的游戏是靠文本里的字段和长度进行的逻辑判断,一但你文本替换掉了,长度和位置发生了变化,那游戏就容易报错。