浏览器运行环境异常,请检查是否开启本站的JavaScript权限或下载最新版浏览器
科普文章【MisakaHookFinder使用方法】关于如何提取一个文字游戏的文本钩子以供翻译的方法

科普文章【MisakaHookFinder使用方法】关于如何提取一个文字游戏的文本钩子以供翻译的方法

本文对HOOK进行科普

背景介绍

众所周知,目前Galgame机翻工具提取文本的方式无非就是Hook或者OCR(光学文字识别),而相比OCR而言,Hook提取游戏文本的优势是明显的:

  • 无视游戏文本字体,直接读内存拿文本,解决OCR方式遇到的部分游戏字体怪异或背景不固定导致无法很好地识别文字的情况
  • 完全离线,不用担心提交在线OCR时造成的隐私泄露问题,无延时

但Hook提取游戏文本的方式也有自己的一些瑕疵,最大的问题就是对新手不友好,如果工具不够简单易用或某些游戏暂不被支持,那么很多人会找不到文本的Hook地址,导致无法使用翻译工具。

为了帮助更多人更好地使用翻译工具,解决最基本的问题——提取到游戏里面的文本,本人制作了一款特殊码的提取工具MisakaHookFinder。

MisakaHookFinder Github:网页链接(github.com)

软件的下载地址在Release页中。

本文将从一些易于理解的基本原理开始讲起,并附上MisakaHookFinder的使用教程来帮助大家解决问题。

 

Hook原理

Hook是Windows中提供的一种用以替换DOS下“中断”的系统机制,中文译为“挂钩”或“钩子”。在对特定的系统事件进行hook后,一旦发生已hook事件,对该事件进行hook的程序就会收到系统的通知,这时程序就能在第一时间对该事件做出响应。更多关于Hook原理的介绍百度搜索会有更详细的结果,这里不做过多赘述。

 

特殊码

业界的很多工具诸如VNR、MisakaTranslator、YUKI等都存在特殊码的概念,我们可以使用一些工具通过特殊码抓取到游戏里面的实时文本,然后这些工具再对文本进行翻译,得到结果。

特殊码实质上是用hook技术(钩子)获取游戏中显示的文本的内存地址

例如,对于如下特殊码:

/HWN-4@1C3C29:mashimaro.exe

简单说明一下,@ 前面部分可以指定编码类型,使用的寄存器(以及其它选项),@ 后面的地址1C3C29是相对于 mashimaro.exe 这个module 的基址的偏移地址。你给定这些信息后,工具就可以hijack对应地址,替换一条指令为跳转,每次文本显示的时候都会运行这条指令,这能使劫持到的信息传递到我们的工具上来,达到显示文本的目的。

 

一些Hook工具的故事

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软件

 

MisakaHookFinder使用

版本更新日志

最新版本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的说明:网页链接(baike.baidu.com)

这里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

介绍视频:网页链接(www.bilibili.com)

Github:网页链接(github.com)

引用

关于特殊码的介绍:网页链接(www.zhihu.com)

关于Hook的说明:网页链接(baike.baidu.com)

补充下,如果用提取器查到游戏的特殊码,不算/,从左往右数第3位是数字的话,去除一下()里内容,这样一来,特殊码就能正常在VNR的【文本设定】用 比如 【/HS(932#)-1C@31510:DC.EXE】× VNR的「文本设定」不能直接使用这个特殊码【/HS-1C@31510:DC.EXE】√ 去掉932#后,特殊码可正常在VNR的「文本设定」使用

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得UP主同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理: DMCA投诉/Report
赞 2
按踩
4
收藏
4条评论

看不懂,但还是支持一下,大佬nb

2021-2-16

支持,支持

2021-6-11

CY

2021-8-10

谢谢大佬,正好想看这类文章

2021-11-16
我是有底线的
内容滑到底啦,去看看别的风景吧