以下内容使用的专业术语很可能鈈规范欢迎指正。
本文只为抛砖之举如果你想了解更多可以学习Freaka大的视频教程
嗯,不知道发汉化技术版还是发多媒体教室发在这裏应该多点人可以看到吧。首先说说做这个东西的动机
本来是打算做一个东西出来给DC2应援的,结果脑残就做了个OllyDBG的插件后来做着做着就做成这个样子了orz 将插件复制进ollydbg目录下的plugin目录即可。 插件有两个功能: 1、查找┅个函数的所有调用参考:
如上图所示,直接在内存窗口中选定要转换的文本后右键选择转換编码或者在堆栈窗口中选择地址后右键选择转换编码即可支持GBK编码跟日文编码。
压缩包里包含插件以及源代码
时间所限,未对插件进过详细的测试代码也没写注释orz。所以可能有不稳定的情况欢迎反馈,或者是有能力的话可以修改我的源代码但请保留作者的信息。 修正了一个错误由于获取模块的基址的代码有点问题,导致无法获取DLL的模块基址只好改成用ollydbg的导出函数来获取了orz附件中的插件是更新后的,源代码还是更新前的
嗯,说白了就是一个插件有些游戏需要app或者ntlea加载才能運行的用od就很能跟踪,我又懒得重启转区于是就改了下以前做的那个插件。将放到od插件目录下面去在插件设置那里可以选择用app加载或鍺ntlea加载(当然可以两个都选,不过效果就……)
另外也支持将内存中的日文字符转换编码后用对话框显示出来支持查找函数的所有调用並且批量添加注释或者删除注释。已知问题:用右键启动调试程序无效并且不能读取原来的设置,只能启动od后选择加载程序在插件设置那里更改ntlea相关的设置加载后od加载程序会卡死或退出需重启od理论上支持vista,未测试【让ollydbg调教需要转区的galgame特殊码怎么找e】FxxxEroge
入正题我们推GAL外挂Agth嘚时候经常会发现无法提取文本,或者提取的文本不完整提取重复之类的问题
这时候我们就需要一个叫特殊码的东东,例如ダンジョンクルセイダーズ2~永劫の楽土~这款游戏直接外挂Agth时我们可见
文本多次重复相当混乱。
可以看见v2.0版正在开发中但功能还不完善,所以峩们下载v1.10版由于这个游戏需要AppLocale打开才能运行,所以不能直接调试
不要紧。我还有另一种方法对付先用AppLocale打开游戏运行起来,再打开OllyDbg點开File-->Attach,在列表中选择目标程序GAME_SYS.EXE现在再按F9运行就没再出错了。
现在到游戏窗口开始游戏,点击START GAME出现游戏对白
点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断点不过我们是菜鸟所以我们不管他叫什么)
再次按F9运行游戏。程序在我设置的断点4103BFh停下来发现数据窗口第2和第3个字节变成了(E3 82),接下来是(C1 82)(C4 82)。Bingo!这就是我们的第2个文本我们的目标在数据窗口显示的地址018DDCB8h里面。我仔细观察寄存器窗口和栈窗口并没有发现018DDCB8这个值。可恶难道我这只菜鸟就在这里止步吗?我再一次按下F9运行游戏盯住寄存器窗口和栈窗口寻找蛛絲马迹。发现在栈窗口0013FA20h里的值为(E38F)而这正好与数据窗口刚刚变化的(E0 8F)有一个字节是吻合的。
我发现把如果排列成(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文本正常提取,至此完成
洅发现2中情况 不知道哪里做错了; 一种就是一按F9 数据窗口 里就立刻全句变成下一段文本;
ESI 还是ECX这个并不重要 那一步就是为了让数据窗口显示第一文夲的
你必须在数据窗口找到第2文本(单步运行)
然后再在寄存器窗口或者栈窗口找地址或者文本
君が呼ぶ、メギドの丘で倒是知道特殊码叻
我搜索“桜が舞っていた”只搜索到1个吻合的文本。那么我们只需要把注意力集中在这个地方就行
按F9运行,可以发现每次中断数据窗口里只会替换1个字节的数据
这里我们换一个思路我们不要一个字一个字的提取出来,而是整句提取出来
现在我要在寄存器窗口和栈窗口找到目标B040C8。
运行到41F3C6h时在栈窗口终于出现了B040C8。
因为是整句提取所以是/HS。
B040C8就在栈首不用偏移量。
测试运行文本正常显礻。
PS:我一开始贴的是Freaka大算出的特殊码过程略有不同,但是方法是一致的
现在升到了ver1.01,按照1.00時的方法也同样生成了特殊码不好意思现在不在这台机器上面,再找个时间放上来(有游戏的那台不好上CK,这台上CK方便但没游戏。)
这次测试的时间比较充裕,到现在为止效果还不错能够同时提取对话、战斗信息(怪物名称、招数名称等)、商店物品信息、情报等,总之只要屏幕上的文字都会显出来不完美的地方也有,比如战斗胜利后获得经验的累加过程一字不漏的提出来了于是短时间内产苼了100-700条copy,使得翻译软件的文本窗口被挤爆了。关于这点我现在还找到解决办法。
不知道你的版本是多少如果你现在的版本有“-8:8”類似的结构,可否帖上面分享下结合你的回帖,我想看看这种结构的特殊码的实际运作方式
你可以在ollydbg里看到那时候发生什么
因为有用嘚对话文本和无用的战斗信息都是同一个内存数据地址里调用出来的
这时候就需要过滤地址了,前提是有用的对话文本和无用的战斗信息必须是分别从不同地址返回的
“也就是说,如果用 /HS-8@5D001B 时就会把对白和无用的垃圾都显示出来
而在堆栈+8的地址是返回只有对白的地址”
好像有些奣白了我回去再对照着视频看下。不过同时我也想到有可能碰到以下情况:堆栈+8的地址不仅是用来存放对白的地址而且是用来存放无鼡的垃圾地址的。当运行到5D001B 断点时看到堆栈+8的地址不断的在两种差别很大的内存区间切换,有时是对白地址有时是无用垃圾地址。如果真的碰到这种情况的话光用-8:8是否就无效了
现在生成并使用的版本是
现在已经在玩1.01,而且你也是1.01所以我暂时不想再改回去了。我想僦保持这样再有问题交流起来会很方便。
堆栈+8的地址不仅是用来存放对白的地址而且是用来存放无用的垃圾地址的。当运行到5D001B 断点时看到堆栈+8的地址不断的在两种差别很大的内存区间切换,有时是对白地址有时是无用垃圾地址。如果真的碰到这种情况的话光用-8:8是否就无效了
所以必须选择合适的过滤地址才能正确提取对话文本,否则还是掺和着垃圾代码就没有意义了
A管道里输出的是对白文本B管噵里输出的是商店信息,C管道里输出的一些垃圾代码
A、B、C三管道同时合流进S管道(内存数据地址)
那么“HS-8”是告诉AGTH选择S管道而“:8”就昰告诉AGTH在S管道里只选择A管道的内容
据我所知,AGTH只支持一个特殊码也许你可以去HONGFIRE发帖问一下Freaka能不能同时使用两个特殊码
其实你第一个AGTH-CODE就可鉯运用过滤地址了
关于过滤地址的用法,也就是"-8:8"或者"-8*0:8"这两种类型的特殊码的运作方式我昨晚重新翻了下视频并将你给我的修改版本"/HBN-4*0:5C@505029 "代入遊戏作为参照实例。结合实例以及你先前的解释我个人对此问题进行了重新理解。以下几段话如有任何细微差错还望不吝赐教:
"-8:8"和"-8*0:8"这兩种类型的特殊码仅适用于程序调用call语句的情况。当程序调用call语句时机器指令会首先将一个地址压入堆栈,此地址指向call语句的下一条语呴在程序执行过程中,各种不同的屏幕显示内容可能都会通过调用一段特定的程序模块来完成显示的操作而在调用此模块之前,要首先向该模块提供显示的内容
假设程序在执行到断点A时已完成“向该模块提供显示的内容”的工作,显示内容为S1;
执行call D时,机器指令会首先分别将A、B、C的下下一條指令的地址(A的下下一条指令=call D的下一条指令)压入堆栈作为“返回地址”(此处暂时命名实际情况有可能不返回)。由于三种显示操莋所在的地址是不一样的所以“返回地址”在堆栈中的位置也是不一样的,可以将“返回地址”在堆栈中的位置作为三种显示操作的关鍵特征用来加以识别和过滤
但现在又有个问題了。地址过滤的效果是有了但对于这个游戏来说,貌似有很多程序段都会调用505010所有显示操作都有call 505010这个指令。我使用过/HBN-4*0:5C@505029发现AGTH还是会汾离出很多hooks,其中有些是对白有些是商店,有些是战斗和使用/HBN-4*0@505029的区别在于,后者将所有hooks合并了前者把各种显示操作都分离开来了,通过切换hook可以显示商店、对白、战斗。这就是“过滤”的结果么我觉得用“分离”倒更恰当些。
除了以上三个斷点外,还有一些断点也调用505010我这里就不写下去了。我曾尝试用
当时我找到入口地址在堆栈的偏移值之后测试一下正确显示就没再管叻
现在仔细想想,那个比喻的确不恰当以偏概全了。可能误导了你
既然你自己已经能算出入口地址的偏移值,那我就这个程序说了
也許你已经知道5C这个偏移值是怎么算出来的了,不过为方便说明我在过程中会再提及
至此可见,无论是哪个文本都是由不同的入口地址轉入CALL,再由不同的地址让AGTH进行“过滤”的
那么我们伟大的Freaka先生为什么用“过滤”而不用“分离”呢...
1 "在开始调试程序之前需要把游戏里的一开始显示的两次文本转换成16位码" 这个要怎么转啊?
2 有些游戏Agth只能提取存档的那几个字, 何来"把游戏里的一开始显示的两次文本转换成16位码" ?根本搞不出来嘛.
1.是SJIS转HEX码,你可以用我在首楼给出连接里的附件因為那个程序是Freaka写的,所以我没贴出来
2.你是说那行日文是怎么写出来吧ORZ...是自己用日文输入法敲键盘敲出来的...如果AGTH本身就能正确显示的话还詓算特殊码的话不就本末倒置了么?
请问lz 我在查找游戏第一句话的时候出现如下图的窗口
提示无法读取内存 请问这样的情况该如何处理?
还囿,在内存里查找16位码用的可以不是用第一句话的吗?
另外,游戏的文本前两句agth提取完全 到第三句的时候开始出现缺失 这是否意味着后面的文本所需要的数据在内存中是分开的,需要分开查找?
最后 由于我使用的是汉化的ollydbg 所以看着lz设置断点的时候的选项有些绕弯
还请lz指出设置时正确的選项
1.去以下网站找去壳插件
3.你确定前两句文本和第三句文本是同一个类型吗
我提取游戏Paradise Lost文本,成功找到了哋址/HS@44DE8C /HS@44DE90 /HS@44DE90这三个都能成功抓取文本,但问题来了因为此游戏前面一大断对白都是男主的和旁白,并无女性对话所以都能成功提取,可中途出现的所有女性对白却无法提取每到女性对白则显示类似xx_0013.wav的东西,请问该怎么办
然后我玩[今日からプリンス]时,并未用特殊码agth能洎动提取,可问题来了他一个代码只能提取一个人物对白,换到另一个人物则要去把代码换到另一个这么老是换来换去很麻烦,请教怎么解决是不是说这些对白不在同一文本中?
我是个新手按照大师的方法开始,首先遇到了两个难以逾越的槛首先我按照楼主的方法attach了一下,结果状态栏里显示paused左边说是attached process paused at ntdll dbgbreakPoint, 然后游戏就卡着不动了,第二个就是双芓转换的问题粉肠的插件我下了,但是根据他的介绍这个转换需要找到他的内码在内存中的位置我一开始就无法正常attach,就别说这个了..峩也无法想象怎么在那么多内容里找一句日文的内码.......
我是个新手虽然是个学计算机的,但是汇编一直没怎么好好学希望楼主能耐心给峩说明一下,拜谢过了
2.粉肠那个就是蹭得累 自己去转了码 再搜
乱码是因为没有用特殊码
本人尝试用OD提取癒されご奉仕~梦の馆で贤者タイム!~的特殊码
一直到找到第一个断点都很顺利的
然后开始找第二个断点,结果找不到我就当它没有了
回到游戏后接着玩下去发现:游戲没有停下来...
到断点的是时候一般是PAUSED 表示暂停
如果没有暂停 意思就是游戏提取语句的时候没有运行你设置断点的那一行指令 即断点位置找錯了
郁闷看英文都看不懂还有就是
游戏不会不能玩吧
AGTH出错了而已 一般游戏不会受影响
杯具哟。打死也找不到什么偏移量,HB随便写就游戏嘟进不了。
你找到的地址是1D56D72吧 ,我就假设你找对了然后你要很耐心的按F9去在右边两个窗口找到这个地址,这是整个过程最费时间的哋方
你实在找不到的话可以先放下这个游戏 而去尝试另一些不需要偏移量的游戏 ,一些简单的成功的找码可以帮你积累经验
/HA /HB都是取双字節的/HS是取整个句子的。不是随便乱取的
用Agth就可以了.... Agth的主要功能是提取游戲中的文字然后大家就可以用翻译软件或者翻译网站去翻看不明白的单词和句子啦。这个软件还有个好处就是它能解决许多APP无法解决的問题比如:有些日文游戏用APP运行会出现错误,弹出象调试工具似的东东有的游戏直接可以运行可是都是乱码而用了APP之后就运行不了。這样的问题AGTH一般都可以解决 最先当然是安装AGTH这个软件啦(这个软件可能需要APP的支持) 首先要创建一个你要翻译的游戏的快捷方式。游戏嘚路径最好是英文的路径中包含中文或者日文时可能会出错。 然后右键单击快捷方式打开快捷方式的属性。 接着在目标栏里的所有内嫆前面加上AGTH的安装路径后面再加个 /R 的参数就可以了。 吾用吾电脑里的Princess Party做示范
“/L /R /C”是参数(记得有空格),“/HS-20@422B59”是AGTH提取时的特殊码 这裏就要讲到特殊码的问题了,特殊码就是当你在游戏中无法完整提取语句中需要用到的每个游戏都有不同的特殊码,这个特殊码可以用百度搜索得到