您的位置:首页 > 博客中心 > 数据库 >

【教材】用OllyDbg找出Agth提取GAL文本的特殊码(详细新人版)

时间:2022-03-14 03:09

【教材】 用Cheat Engine查找特殊码(简易版)

 

 

以下内容使用的专业术语很可能不规范,欢迎指正。

本文只为抛砖之举,如果你想了解更多可以学习Freaka大的视频教程

看不懂英文 问题集: 问:果てしなく続く、螺旋状の階段。 89 CA 82 C4 82 B5 82 C8 82 AD 91 B1 82 AD 81 41 97 86 90 F9 8F F3 82 CC 8A 4B 92 69 81 42 这句话怎么转换成16位码的? 答:两个方法: 1.下载插件。

【六角SJIS-converter_2008_03_05】

下载地址:

 

【六角SJIS转换器- php】

hex-sjis-converter-php】

下载地址:

 

 

 嗯,不知道发汉化技术版还是发多媒体教室。发在这里应该多点人可以看到吧。首先说说做这个东西的动机。   本来是打算做一个东西出来给DC2应援的,结果脑残就做了个OllyDBG的插件,后来做着做着就做成这个样子了orz   将插件复制进ollydbg目录下的plugin目录即可。   插件有两个功能:   1、查找一个函数的所有调用参考:
  如上图所示,可以在插件的对话框上添加、删除断点和注释,也可以批量添加或删除注释,也支持用F2来设置断点。使用方法是在反汇编窗口中选中一条语句后右键点击“查找所有调用参考”选项。至于这个功能有什么用?例如调试一个程序的时候,程序会频繁地申请内存,而这个函数很复杂,用这个插件就可以找到所有调用这个函数的地方添加注释或者是断点,方便以后调试的时候可以跳过去。    2、将内存中的文本转换编码显示:
  如上图所示,直接在内存窗口中选定要转换的文本后右键选择转换编码或者在堆栈窗口中选择地址后右键选择转换编码即可。支持GBK编码跟日文编码。

【OllyDBG插件OllyGal1.10(附带源代码)】6485c8b2-ec82-3712-a827-3b6f726b36b5

下载地址:

 

 

  压缩包里包含插件以及源代码。   时间所限,未对插件进过详细的测试,代码也没写注释orz。所以可能有不稳定的情况,欢迎反馈,或者是有能力的话可以修改我的源代码,但请保留作者的信息。   修正了一个错误,由于获取模块的基址的代码有点问题,导致无法获取DLL的模块基址,只好改成用ollydbg的导出函数来获取了orz附件中的插件是更新后的,源代码还是更新前的。

嗯,说白了就是一个插件。有些游戏需要app或者ntlea加载才能运行的用od就很能跟踪,我又懒得重启转区,于是就改了下以前做的那个插件。将放到od插件目录下面去,在插件设置那里可以选择用app加载或者ntlea加载(当然可以两个都选,不过效果就……) 另外也支持将内存中的日文字符转换编码后用对话框显示出来,支持查找函数的所有调用并且批量添加注释或者删除注释。
已知问题: 用右键启动调试程序无效,并且不能读取原来的设置,只能启动od后选择加载程序 在插件设置那里更改ntlea相关的设置加载后od加载程序会卡死或退出,需重启od 理论上支持vista,未测试
【让ollydbg调教需要转区的galgame】FxxxEroge

下载地址:

 

 

入正题,我们推GAL外挂Agth的时候经常会发现无法提取文本,或者提取的文本不完整,提取重复之类的问题 这时候我们就需要一个叫特殊码的东东,例如ダンジョンクルセイダーズ2~永劫の楽土~这款游戏 直接外挂Agth时我们可见
文本多次重复,相当混乱。 而现在再用命令(WIN+R打开运行窗口输入CMD)X:\agth /c /HB28@4103B8 /pnGAME_SYS.EXE 外挂Agth时文本就正常显示了。
现在我们去弄清楚这个/HB28@4103B8是怎么得出来的。 首先,我们需要OllyDbg这个调试软件。下载请去官网:
可以看见v2.0版正在开发中,但功能还不完善,所以我们下载v1.10版。
在开始调试程序之前,我需要把游戏里的一开始显示的两次文本转换成16位码,因为我们在调试窗口将不可能看到日文。
果てしなく続く、螺旋状の階段。 89 CA 82 C4 82 B5 82 C8 82 AD 91 B1 82 AD 81 41 97 86 90 F9 8F F3 82 CC 8A 4B 92 69 81 42 
上っても上っても終わりが見えず、 8F E3 82 C1 82 C4 82 E0 8F E3 82 C1 82 C4 82 E0 8F 49 82 ED 82 E8 82 AA 8C A9 82 A6 82 B8 81 41 
这里要注意一个双字(4位)才是一个日文。
Fine.现在打开OllyDbg开始调试程序。 点开菜单栏的File-->Open.选择ダンジョンクルセイダーズ2~永劫の楽土~的游戏主程序GAME_SYS.EXE 之后按F9运行游戏。这时发生了一个错误游戏终止了。

由于这个游戏需要AppLocale打开才能运行,所以不能直接调试。 不要紧。我还有另一种方法对付。 先用AppLocale打开游戏运行起来,再打开OllyDbg,点开File-->Attach,在列表中选择目标程序GAME_SYS.EXE 现在再按F9运行就没再出错了。

现在到游戏窗口,开始游戏,点击START GAME,出现游戏对白

回到OllyDbg,ALT+M打开内存窗口(Memory map),CTRL+B搜索我们看到的那一句游戏对白。 也就是89 CA 82 C4 82 B5 82 C8 82 AD 91 B1 82 AD 81 41 97 86 90 F9 8F F3 82 CC 8A 4B 92 69 81 42
点OK得到第一次搜索结果。

可以看到灰色所选16位码跟文本转换后的16位码完全吻合。 然后我在第一个字节(89)那里点一下选中,右击-->Breakpoint-->Hardware,on access-->Byte 这样就设置了一个断点。断点就像做记号一样,它会在程序运行到这个地方时就暂停下来,让你看清楚发生了什么。 我们可以在菜单栏-->Debug-->Hardware breakponits里看到所设置的断点。在设置断点前请保证这里是清空的。

继续在Dump窗口搜索下一个吻合的字符串(CTRL+L), 发现底部状态栏亮起一条黄边,这表示已经没有再多的搜索结果了。
之后,我们回到内存窗口(Memory map)继续搜索下一个(CTRL+L)吻合的字符串。 同样,我设置了第2个断点。
之后继续搜索内存窗口,发现底部亮起了黄边,那搜索完成了。
断点已经设置好了,我们看看游戏什么时候发生中断。 回到游戏,点击鼠标显示下一句游戏对白。
这时候游戏没响应了(别以为死机了 - =)而OllyDbg的界面提前到眼前。 Good!这表示游戏在读取下一段文本的时候被中断了,我们正是需要在这个时候让Agth把文本抽取出来。 之后只要把地址拿到就行了。 程序在41031Ah中断了。 信息窗口显示ECX=018DDCB8 我们看看里面有什么? 选中它,右击选择Follow value in Dump

发现了吗,里面除了第1个字节是00外,正好是游戏第一句文本。 看来我们找对地方了! 回来看41031Ah的反汇编指令,如果你懂汇编的话可以发现这貌似一段清0指令。 我们是菜鸟所以我们不管它。 我点单步运行,发现指令在410317h到410320h里跳转,这是一个循环。 我没有耐性,直接按了F9运行游戏。
第2次中断发生在4103BF

这时候我发现数据窗口第1个字节变成了(8F)! 这正好是第2个文本的第1个字节!我没猜错的话已经离胜利不远了! 我选中4103BFh ,按F2设置下一个断点,那里变得通红。 我们可以按ALT+B看到我们的另一个断点窗口。(这叫做INT3断点,不过我们是菜鸟所以我们不管他叫什么)

我点开菜单栏-->Debug-->Hardware breakponits,把两个硬件断点删掉(Delete),我已经不再需要它们了。 再次按F9运行游戏。程序在我设置的断点4103BFh停下来。 发现数据窗口第2和第3个字节变成了(E3 82),接下来是(C1 82),(C4 82)。 Bingo!这就是我们的第2个文本。我们的目标在数据窗口显示的地址018DDCB8h里面。 我仔细观察寄存器窗口和栈窗口,并没有发现018DDCB8这个值。 可恶,难道我这只菜鸟就在这里止步吗?
我再一次按下F9运行游戏,盯住寄存器窗口和栈窗口寻找蛛丝马迹。 发现在栈窗口0013FA20h里的值为(E38F),而这正好与数据窗口刚刚变化的(E0 8F)有一个字节是吻合的。

继续按下F9,栈窗口0013FA20h里的值为(C182),(C482),(E082),(498F) 我发现把如果排列成(82 C1)(82 C4)(82 E0)(8F 49)的话正是我们的第2个文本接下来那一段! (大概因为压栈的时候是低位压进高位,所以反过来了)
OK!特殊码出来了! /H表示Agth的特殊码模式,之后我们可以选择三个命令/HA /HB /HS ,/HA /HB都是取双字节的,/HS是取整个句子的。 由于这里我们是每运行一次游戏,而后发生中断,在数据窗口里都只是改变1个双字节,所以我先用/HB碰运气。 之后需要让Agth获得这个双字节,需要一个偏移量。

在栈窗口第一个地址那里双击,变成了一列偏移量的值。我们找到(498F)对应的值是+28,所以就/HB28了。 之后写的就是我最后所设置的断点地址。用@连接。于是得出/HB28@4103BF 。 测试运行,Agth文本正常提取,至此完成。

 

 

 

恩 还是 搞不出 特殊码的!  以DC2PC 为例子 紧跟LZ操作 发现搞好了 第一个断点后,怎么也找不到第二个相同的 【嘛~~!算啦当它没了 继续就是了】  接着问题来了 !  信息窗口出现 ESI=00B040CA (UPDATE.00B040CA) [和LZ的说的不一样了 是ESI 不是ECX] 不明白 不理 再继续 选择Follow value in Dump 00B040CA 
[strike 接着发生第2次中断 先F2 其他按着流程做,发现第二 第三文本可以对的上了 
再发现2中情况 不知道哪里做错了; 一种就是一按F9 数据窗口 里就立刻全句变成下一段文本;  另一种每按F9 就改变一个双字,要按完所在的那一段文本 游戏才从暂停转为运行;点一下游戏 中断 接着连按F9可以看见数据窗口的改变;   但寄存器和堆栈 里我依然就找不出那里了 
继续跳过  查得以前-[Circus] Da Capo 系列的特殊吗: /HBC*0@为开头,直接代入 但在出现的 USERHOOKB 但数据对不上~~ 

ESI 还是ECX这个并不重要  那一步就是为了让数据窗口显示第一文本的 你必须在数据窗口找到第2文本(单步运行) 然后再在寄存器窗口或者栈窗口找地址或者文本 DC2PC我已经在下载了 ... 不过7G......起码要一天才下好 ...我的网速很渣的 君が呼ぶ、メギドの丘で倒是知道特殊码了
DC2PC:/HS8@41B710 /F

桜が舞っていた。 8D F7 82 AA 95 91 82 C1 82 C4 82 A2 82 BD 81 42 
我搜索“桜が舞っていた。”只搜索到1个吻合的文本。那么我们只需要把注意力集中在这个地方就行。 正如11楼那图,断点在41B8F2h 。数据窗口首地址为B040C8。
这里有一个小技巧。 我习惯把这样的由中断返回的断点(Hardware Breakpoints,硬件断点)按F2设置成一个新的断点(INT3断点)。 然后把硬件断点删除。 这样按ALT+B显示的断点窗口里,我可以右击它,选择Disable ,从而使这个断点在以后测试运行里不再令程序中断。
按F9运行,可以发现每次中断数据窗口里只会替换1个字节的数据。 这里有一个问题,我在首楼也重点指出过,1个日文必须是1个双字。 所以这个地址不能用!
这里我们换一个思路。我们不要一个字一个字的提取出来,而是整句提取出来。 我按F9,一直等整个文本显示完全。

现在我要在寄存器窗口和栈窗口找到目标B040C8。 按F8单步运行。 运行到41F3C6h时,在栈窗口终于出现了B040C8。

OK.特殊码出来了。 因为是整句提取,所以是/HS。 B040C8就在栈首,不用偏移量。 特殊码就是 /HS@41F3C6 测试运行,文本正常显示。
PS:我一开始贴的是Freaka大算出的特殊码。过程略有不同,但是方法是一致的。 只要能正确提取文本,特殊码不是唯一的。

 

 

"HS-8:8的意思应该是文本内容(a character)在ECX 而过滤文本地址(filter subcontent)在堆栈+8的位置 很不幸我的君呼丘已经升级成ver1.01 所以我也无法运行程序解答你上面的问题
现在升到了ver1.01,按照1.00时的方法也同样生成了特殊码。不好意思现在不在这台机器上面,再找个时间放上来。(有游戏的那台不好上CK,这台上CK方便但没游戏。。。)
这次测试的时间比较充裕,到现在为止效果还不错,能够同时提取对话、战斗信息(怪物名称、招数名称等)、商店物品信息、情报等,总之只要屏幕上的文字都会显出来。不完美的地方也有,比如战斗胜利后获得经验的累加过程一字不漏的提出来了,于是短时间内产生了100-700条copy,使得翻译软件的文本窗口被挤爆了。。。关于这点我现在还找到解决办法。

不知道你的版本是多少。如果你现在的版本有“-8:8”类似的结构,可否帖上面分享下。结合你的回帖,我想看看这种结构的特殊码的实际运作方式。

你可以在ollydbg里看到那时候发生什么 因为有用的对话文本和无用的战斗信息都是同一个内存数据地址里调用出来的
这时候就需要过滤地址了,前提是有用的对话文本和无用的战斗信息必须是分别从不同地址返回的 也就是说,如果用 /HS-8@5D001B 时就会把对白和无用的垃圾都显示出来 而在堆栈+8的地址是返回只有对白的地址
我找到的v1.01 AGTH-code是 /HS4@5CDEDE 但我在5D001B附近找不到任何东西,事实上程序根本没执行那一段,也许我哪里出错了,或者这个补丁改动很大 >_> 如果你还有镜象的话可以截图v1.00在5D001B的ollydbg的图给我看吗? 我的镜象已经删掉了...

 

“也就是说,如果用 /HS-8@5D001B 时就会把对白和无用的垃圾都显示出来 而在堆栈+8的地址是返回只有对白的地址” 好像有些明白了,我回去再对照着视频看下。不过同时我也想到有可能碰到以下情况:堆栈+8的地址不仅是用来存放对白的地址,而且是用来存放无用的垃圾地址的。当运行到5D001B 断点时,看到堆栈+8的地址不断的在两种差别很大的内存区间切换,有时是对白地址,有时是无用垃圾地址。如果真的碰到这种情况的话光用-8:8是否就无效了?
现在生成并使用的版本是                  /L /C /KF /HBN-4*0@505029 另外找到仅提取纯对话文本的                  /HBN-8*0@4FE410 和仅提取商店信息的                  /HBN-8*0@500159 曾尝试合并/HBN-8*0@4FE410和/HBN-8*0@500159,就象这样:                  /L /C /KF /HBN-8*0@4FE410 /HBN-8*0@500159 但发现这种合并结构的确是矛盾的,AGTH只识别后者。这样情况是否可认为是AGTH本身的限制。也就是说,假如碰到(我是说假如)/HS-8@5D001B 把对白、商店信息和无用的垃圾这三种都显示出来了,而我们需要的是其中的两种(对白、商店信息),这时就超出了AGTH的适用范围。使用AGTH顶多可以提供其中的一种信息而无法将两种不同的特殊码融合起来。就算是这三种信息的地址分别存放在堆栈不同的位置,使用/HS-8:8@5D001B这种结构的特殊码也无法满足需求了。
现在已经在玩1.01,而且你也是1.01,所以我暂时不想再改回去了。我想就保持这样,再有问题交流起来会很方便。

 

 

 

堆栈+8的地址不仅是用来存放对白的地址,而且是用来存放无用的垃圾地址的。当运行到5D001B 断点时,看到堆栈+8的地址不断的在两种差别很大的内存区间切换,有时是对白地址,有时是无用垃圾地址。如果真的碰到这种情况的话光用-8:8是否就无效了?

所以必须选择合适的过滤地址才能正确提取对话文本,否则还是掺和着垃圾代码就没有意义了 我再打个比喻: A管道里输出的是对白文本,B管道里输出的是商店信息,C管道里输出的一些垃圾代码 A、B、C三管道同时合流进S管道(内存数据地址) 那么“HS-8”是告诉AGTH选择S管道,而“:8”就是告诉AGTH在S管道里只选择A管道的内容

请用attach钩EXE

大脑完全当机中 ...... 额 完全不知道用agth提出来的是乱码 然后用App的时候 又用不了agth的问题.... 额  大概是个这个吧 。。。 不过 头晕 完全 理解不能啊

乱码是因为没有用特殊码 用APP加载了游戏后 用CMD命令行运行AGTH

 

 

本人尝试用OD提取癒されご奉仕~梦の馆で贤者タイム!~的特殊码 一直到找到第一个断点都很顺利的 然后开始找第二个断点,结果找不到,我就当它没有了 回到游戏后接着玩下去发现:游戏没有停下来...

 

看右下角的状态 到断点的是时候一般是PAUSED 表示暂停 运行的时候是 RUNNING 表示正在运行 如果没有暂停 意思就是游戏提取语句的时候没有运行你设置断点的那一行指令  即断点位置找错了

郁闷看英文都看不懂还有就是 这个代码填错 游戏不会不能玩吧 

 

AGTH出错了而已 一般游戏不会受影响

杯具哟。。打死也找不到什么偏移量,HB随便写就游戏都进不了。。。 HS也是。。杯具

我试着提示一下 你找到的地址是1D56D72吧 ,我就假设你找对了,然后你要很耐心的按F9去在右边两个窗口找到这个地址,这是整个过程最费时间的地方  你实在找不到的话,可以先放下这个游戏 而去尝试另一些不需要偏移量的游戏 ,一些简单的成功的找码可以帮你积累经验 /HA /HB都是取双字节的,/HS是取整个句子的。不是随便乱取的

 

 

 

 

【分享】VNR翻译日语游戏汉化简易图解教材

 

 

热门排行

今日推荐

热门手游