目录在本页左侧广告下方
众所周知,目前Galgame机翻工具提取文本的方式无非就是Hook或者OCR(光学文字识别),而相比OCR而言,Hook提取游戏文本的优势是明显的:
但Hook提取游戏文本的方式也有自己的一些瑕疵,最大的问题就是对新手不友好,如果工具不够简单易用或某些游戏暂不被支持,那么很多人会找不到文本的Hook地址,导致无法使用翻译工具。
为了帮助更多人更好地使用翻译工具,解决最基本的问题——提取到游戏里面的文本,本人制作了一款特殊码的提取工具MisakaHookFinder。
MisakaHookFinder Github:https://github.com/hanmin0822/MisakaHookFinder
软件的下载地址在Release页中。
本文将从一些易于理解的基本原理开始讲起,并附上MisakaHookFinder的使用教程来帮助大家解决问题。
Hook是Windows中提供的一种用以替换DOS下“中断”的系统机制,中文译为“挂钩”或“钩子”。在对特定的系统事件进行hook后,一旦发生已hook事件,对该事件进行hook的程序就会收到系统的通知,这时程序就能在第一时间对该事件做出响应。更多关于Hook原理的介绍百度搜索会有更详细的结果,这里不做过多赘述。
业界的很多工具诸如VNR、MisakaTranslator、YUKI等都存在特殊码的概念,我们可以使用一些工具通过特殊码抓取到游戏里面的实时文本,然后这些工具再对文本进行翻译,得到结果。
特殊码实质上是用hook技术(钩子)获取游戏中显示的文本的内存地址。
例如,对于如下特殊码:
/HWN-4@1C3C29:mashimaro.exe
简单说明一下,@ 前面部分可以指定编码类型,使用的寄存器(以及其它选项),@ 后面的地址1C3C29是相对于 mashimaro.exe 这个module 的基址的偏移地址。你给定这些信息后,工具就可以hijack对应地址,替换一条指令为跳转,每次文本显示的时候都会运行这条指令,这能使劫持到的信息传递到我们的工具上来,达到显示文本的目的。
VNR 最开始用ith获取文本,然后被jichi(VNR作者)做过很多改进的样子,vnr之前有agth,现在的是textractor,还能在源码里看到很多jichi的注释。Textractor的作者仍然在维护(不过根据最新的Release说明,作者已经对维护这个项目感到厌烦)。
Hook工具的主要变迁:agth -> ith -> vnr -> ith-vnr -> Textractor
现在的Textreactor写的的自动查找地址做得比VNR的优秀很多,很多新作旧作不用特殊码就能直接自动hook系统dll进程的函数找到文本地址,包括特定引擎如krkr,Ren'py也能自动获取。不同系统上,系统函数不同的偏移也不用你手动去减,直接精准到函数名自己就能计算地址了。
MisakaHookFinder正是在Textractor的基础上开发的,保留了其强大功能的同时变得更加易用。
同时需要注意的是,因为用到了hook这种技术,所以杀软很容易会警告并把它当作病毒处理。因此一般我们使用这类工具时,会关闭杀毒软件并以管理员身份启动这类hook软件。
最新版本V1.1更新说明:
(重要)1.修复了因为16进制转10进制的bug造成的hook移除错误问题,建议放弃使用V1.0
2.增加了使用既定特殊码直接开始的功能并自动移除其他hook
1. 首先根据你要查找hook特殊码的游戏的版本来决定启动x86版本的软件或者x64版本的软件。请注意必须使用管理员身份启动!如果你的游戏是32位的,则启动...\MisakaHookFinder 1.0\x86\MisakaHookFinder.exe,
否则如果你的游戏是64位,则启动...\MisakaHookFinder 1.0\x64\MisakaHookFinder.exe.
注:如果你不确定你的游戏版本,可默认启动x86版本查找器,如果点击注入进程后出现提示:Textractor: 架构不匹配: 请尝试使用64位版本的Textractor
则使用x64版本查找器重试。
2. 打开软件后,界面如下(后续版本可能略有区别,但所有新增用法会在附录中提到)。
左上角和右下角的按钮代表基本功能。左侧大编辑框是控制台输出,右侧大编辑框是Hook方法输出。
3. 在界面最左上角选择您游戏对应的进程(如果有多个进程请多次尝试),点击注入进程,软件会尝试注入该游戏进程,这时候左侧控制台输出会有相应提示。
4.进行游戏,刷新几次游戏文本,如果出现类似这样的提示,就可以在右侧方法输出中对应查找。
右侧上方下拉框可选择对应方法,每选择一个方法后,都要刷新一下游戏文本查找输出是否对应。如果不对应,可点击下方的“移除此钩子”按钮来移除这个Hook方法。
关于移除Hook方法的特别事项:
需要注意,某些游戏中,同一个Hook方法(即同一个特殊码)可能存在很多不同的Hook线程,例如如下方法都是WideCharToMultiByte,特殊码都是HQC@0:kernel32.dll,但存在五个不同的线程。这时如果我们需要用到的线程在这之中,则所有同名方法(即特殊码相同的方法)都不能移除,否则会影响我们需要用到的Hook方法的输出。
如图所示,这里我通过方法寻找可以直接照到我的游戏文本钩子。
注:有时候文本会包含除游戏文本之外的内容,这是正常现象,可配合MisakaTranslator的文本去重功能使用。但如果某方法包含的游戏文本内容不全,则需要重新选择。
5. 有些时候我们可能无法通过直接注入得到我们想要的结果,这时候可以考虑上网搜索这个游戏的特殊码,并通过“添加指定特殊码”功能来注入这个特殊码。
如果查找不到特殊码或者网上查找的特殊码都不正确,可以尝试以下方法搜索。
首先需要注意,该方法是不稳定的,可能会导致游戏崩溃,故使用前请做好存放备份。
接下来我们找到当前游戏对应的句子,例如此处是
我们在编辑框中输入一部分:
此处欲搜索文本不需要填写完整,包含一部分皆可,但不可字数太少,通常情况下我们建议从第一个字符开始搜索,否则之后得到的结果偏移会出问题。
代码页部分详见关于CodePage的说明:https://baike.baidu.com/item/codepage/416287
这里932代表SAP Shift-JIS,一般日语游戏的编码都是这个。
点击确认,可以观察到系统自动为我们添加了很多新方法
按照之前部分中第4点的操作,我们逐个选择来找到一个包含游戏文本的选项,例如:
至此,通过文本搜索到方法成功!
有时候根据文本搜索得到的钩子是非动态的,我们怎么刷新游戏都没有结果,这个时候尝试“查找特殊码”。
同样需要注意,该方法是不稳定的,可能会导致游戏崩溃,故使用前请做好存放备份。
例如这个游戏,注入后,软件提示:searching for hooks should work
这时候我们点击“查找特殊码”,出现:开始搜索!在接下来的20s内请刷新几次游戏内文本以供内存查找。后,我们刷新几次游戏文本,等待查询
时间到后,出现
这时候打开了结果窗口。
我们在上面输入框中填入在软件搜索hook结束前最后一次刷新的文本,例如我这里是
我们在结果框里输入 体育 因为文本中包含这个字,点击“查找下一条”
这里为我们找到了结果,对比一下,跟游戏内结果一致。
我们点击“为此结果添加自定Hook”
我们在主界面中选择刚才新添加的方法,刷新几次游戏文本,发现对应一致。
注:有时候搜索Hook会找到很多条结果,可以多次注入尝试找到最佳结果。
查找到需要的特殊码后,建议先保存,这样可以大大减少后续的工作,以免下次重新查找耗时耗力。
直接通过复制得到的特殊码需要修改一下才能供其他软件使用。
例如:复制得到的是:
1:934:7566E240:43F087:0:GetGlyphOutlineA:HA8@0:gdi32.dll:GetGlyphOutlineA
则修改为(对应上方红色内容)
/HA8@0:gdi32.dll
如果无法使用特殊码,可以直接选择“开启剪贴板更新”,这样任意支持剪贴板监视的翻译器都能使用。
(V1.1新功能)
如果你的游戏通过自动注入后获得很多hook方法导致严重卡顿或想在得到确认的特殊码后下次开启MisakaHookFinder时直接注入这个特殊码,避免复杂的查找工作,可以使用如下办法直接以指定特殊码注入进程。
1.打开游戏后,对应版本打开MisakaHookFinder。
2.选择游戏对应进程,点击“添加指定特殊码(注入)”,
弹出提示点击确认。进入自定义特殊码输入页面
这时输入我们之前保存的特殊码,注意需要做一下变化(取/和:之间的部分)。
例如我们之前保存的特殊码是
/HA8@0:gdi32.dll
则需要填入
HA8@0
又例如特殊码
/HQC@0:kernel32.dll
则需要填入
HQC@0
完成后点击OK,可以观察到软件在注入进程后,自动删除了特殊码不一致的方法。
接下来刷新一下游戏文本,在右侧方法下拉框中选择方法,后续其他步骤就跟前文提到的内容一样了。这个地方尤其需要注意前文提到的“关于移除Hook方法”的特别说明!
注意:使用附录四也就是MisakaHookFinderV1.1版本的用户,在使用指定特殊码直接注入时,如果你的特殊码是系统无法自动获取到的,那么首先需要按上述方法注入一次特殊码,再注入一次特殊码,两次不一致。
例如游戏特殊码为
/HS932#14@27D770:pix.exe
则首先使用这个注入一次HS932#14@27D770,再注入一次/HS932#14@27D770:pix.exe就可正常工作,否则出不来。
MisakaHookFinder的父项目,一款功能强大、新手友好、性能高效的翻译工具——MisakaTranslator
介绍视频:https://www.bilibili.com/video/BV1Qt4y11713
Github:https://github.com/hanmin0822/MisakaTranslator
关于特殊码的介绍:https://www.zhihu.com/question/340636914/answer/957531124
关于Hook的说明:https://baike.baidu.com/item/hook/19512231#viewPageContent