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

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

http://867258173.diandian.com/post/2014-06-24/40062052342



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

本文只为抛砖之举,如果你想了解更多可以学习Freaka大的视频教程
http://www.hongfire.com/forum/showthread.php?t=80401

 看不懂英文http://translate.google.com.hk/translate?hl=zh-CN&ie=UTF8&prev=_t&sl=en&tl=zh-CN&u=http://www.hongfire.com/forum/showthread.php/80401-Advanced-AGTH-Tutorials-(Ollydbg-Videotutorials-Ep-1-3)-Up-2009-03-01
问题集:
问:果てしなく続く、螺旋状の階段。
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】

下载地址:http://www.400gb.com/file/57128647


【六角SJIS转换器- php】

hex-sjis-converter-php】

下载地址:http://www.400gb.com/file/57128929




 


2.安装OLLYDBG蹭得累的插件  感谢粉肠

OllyDBG插件OllyGal1.10(附带源代码)

 嗯,不知道发汉化技术版还是发多媒体教室。发在这里应该多点人可以看到吧。首先说说做这个东西的动机。
  本来是打算做一个东西出来给DC2应援的,结果脑残就做了个OllyDBG的插件,后来做着做着就做成这个样子了orz
  将插件复制进ollydbg目录下的plugin目录即可。
  插件有两个功能:
  1、查找一个函数的所有调用参考:


  如上图所示,可以在插件的对话框上添加、删除断点和注释,也可以批量添加或删除注释,也支持用F2来设置断点。使用方法是在反汇编窗口中选中一条语句后右键点击“查找所有调用参考”选项。至于这个功能有什么用?例如调试一个程序的时候,程序会频繁地申请内存,而这个函数很复杂,用这个插件就可以找到所有调用这个函数的地方添加注释或者是断点,方便以后调试的时候可以跳过去。
   2、将内存中的文本转换编码显示:


  如上图所示,直接在内存窗口中选定要转换的文本后右键选择转换编码或者在堆栈窗口中选择地址后右键选择转换编码即可。支持GBK编码跟日文编码。


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

下载地址http://www.400gb.com/file/57128645




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




 这个是改版 感觉还是蹭得很累...

让ollydbg调教需要转区的galgame

嗯,说白了就是一个插件。有些游戏需要app或者ntlea加载才能运行的用od就很能跟踪,我又懒得重启转区,于是就改了下以前做的那个插件。将放到od插件目录下面去,在插件设置那里可以选择用app加载或者ntlea加载(当然可以两个都选,不过效果就……)
另外也支持将内存中的日文字符转换编码后用对话框显示出来,支持查找函数的所有调用并且批量添加注释或者删除注释。

已知问题:
用右键启动调试程序无效,并且不能读取原来的设置,只能启动od后选择加载程序
在插件设置那里更改ntlea相关的设置加载后od加载程序会卡死或退出,需重启od
理论上支持vista,未测试

【让ollydbg调教需要转区的galgame】FxxxEroge

下载地址:http://www.400gb.com/file/63689545


 



入正题,我们推GAL外挂Agth的时候经常会发现无法提取文本,或者提取的文本不完整,提取重复之类的问题
这时候我们就需要一个叫特殊码的东东,例如ダンジョンクルセイダーズ2~永劫の楽土~这款游戏
直接外挂Agth时我们可见



文本多次重复,相当混乱。
而现在再用命令(WIN+R打开运行窗口输入CMD)X:\agth /c /HB28@4103B8 /pnGAME_SYS.EXE 外挂Agth时文本就正常显示了。

现在我们去弄清楚这个/HB28@4103B8是怎么得出来的。
首先,我们需要OllyDbg这个调试软件。下载请去官网:
http://www.ollydbg.de/
可以看见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文本正常提取,至此完成。






出现问题1:

恩 还是 搞不出 特殊码的! 
以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 但数据对不上~~ 


解决方法1

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大算出的特殊码。过程略有不同,但是方法是一致的。
只要能正确提取文本,特殊码不是唯一的。



出现问题2:

"HS-8:8的意思应该是文本内容(a character)在ECX
而过滤文本地址(filter subcontent)在堆栈+8的位置
很不幸我的君呼丘已经升级成ver1.01
所以我也无法运行程序解答你上面的问题


现在升到了ver1.01,按照1.00时的方法也同样生成了特殊码。不好意思现在不在这台机器上面,再找个时间放上来。(有游戏的那台不好上CK,这台上CK方便但没游戏。。。)

这次测试的时间比较充裕,到现在为止效果还不错,能够同时提取对话、战斗信息(怪物名称、招数名称等)、商店物品信息、情报等,总之只要屏幕上的文字都会显出来。不完美的地方也有,比如战斗胜利后获得经验的累加过程一字不漏的提出来了,于是短时间内产生了100-700条copy,使得翻译软件的文本窗口被挤爆了。。。关于这点我现在还找到解决办法。

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

解决方法2


你可以在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管道的内容


AGTH只识别后者

解答:
据我所知,AGTH只支持一个特殊码,也许你可以去HONGFIRE发帖问一下Freaka能不能同时使用两个特殊码

其实你第一个AGTH-CODE就可以运用过滤地址了
/HBN-4*0:5C@505029   就是提取纯对白文本了




提问1:



关于过滤地址的用法,也就是"-8:8"或者"-8*0:8"这两种类型的特殊码的运作方式,我昨晚重新翻了下视频并将你给我的修改版本"/HBN-4*0:5C@505029 "代入游戏作为参照实例。结合实例以及你先前的解释,我个人对此问题进行了重新理解。以下几段话如有任何细微差错,还望不吝赐教:  

"-8:8"和"-8*0:8"这两种类型的特殊码仅适用于程序调用call语句的情况。当程序调用call语句时,机器指令会首先将一个地址压入堆栈,此地址指向call语句的下一条语句。在程序执行过程中,各种不同的屏幕显示内容可能都会通过调用一段特定的程序模块来完成显示的操作,而在调用此模块之前,要首先向该模块提供显示的内容。

假设程序在执行到断点A时已完成“向该模块提供显示的内容”的工作,显示内容为S1;
再假设程序在执行到断点B时亦已完成“向该模块提供显示的内容”的工作,显示内容为S2;
再假设程序在执行到断点C时亦已完成“向该模块提供显示的内容”的工作,显示内容为S3;
那么,在执行完A、B、C指令后,程序都会调用call D。就像以下这三种显示操作:

                    显示操作1                            显示操作2                              显示操作3
相对地址1           A  指令                                  B  指令                                    C 指令
相对地址2                      call D                                    call D                                      call D
相对地址3                      A的下下一条指令        B的下下一条指令         C的下下一条指令
...                                   ...                                            ...                                              ...

执行call D时,机器指令会首先分别将A、B、C的下下一条指令的地址(A的下下一条指令=call D的下一条指令)压入堆栈作为“返回地址”(此处暂时命名,实际情况有可能不返回)。由于三种显示操作所在的地址是不一样的,所以“返回地址”在堆栈中的位置也是不一样的,可以将“返回地址”在堆栈中的位置作为三种显示操作的关键特征用来加以识别和过滤。
如果我们仅需要显示操作 1 的显示内容,那么在显示操作1  的call D语句执行过程中,将“返回地址”在堆栈中的位置标注出来,然后以“:堆栈中的位置”的形式提交给AGTH。AGTH会根据这个关键特征识别出显示操作1 ,从而达到地址过滤的效果。

以上。

但现在又有个问题了。地址过滤的效果是有了,但对于这个游戏来说,貌似有很多程序段都会调用505010,所有显示操作都有call 505010这个指令。我使用过/HBN-4*0:5C@505029,发现AGTH还是会分离出很多hooks,其中有些是对白,有些是商店,有些是战斗。和使用/HBN-4*0@505029的区别在于,后者将所有hooks合并了,前者把各种显示操作都分离开来了,通过切换hook,可以显示商店、对白、战斗。这就是“过滤”的结果么?我觉得用“分离”倒更恰当些。

调试中发现断点4FE92F处会调用call 505010,call 505010之前,EDX存放对白地址;
断点500220处会调用call 505010,call 505010之前,EDX存放商店地址,ECX存放显示字节数;
断点5568FD处会调用call 505010,call 505010之前,EAX存放战斗地址。

4FE92F处的堆栈偏移位置是5C,这应该就是/HBN-4*0:5C@505029的生成方式吧。
500220处的堆栈偏移位置是-668;
5568FD处的堆栈偏移位置是348。

除了以上三个断点外,还有一些断点也调用505010,我这里就不写下去了。我曾尝试用
/HBN-4*0:-668@505029     和 /HBN-4*0:348@505029     
目的是想分别过滤出商店和战斗,但无一例外,结果上看和/HBN-4*0:5C@505029   无本质差别  。各种显示操作都分离开来了,这里面对白、商店和战斗的内容都有,切换一下就行。所以,我越发觉得不对,"-8:8"和"-8*0:8"这两种类型的特殊码到底是用来过滤的么??


解答1:

当时我找到入口地址在堆栈的偏移值之后,测试一下正确显示就没再管了
现在仔细想想,那个比喻的确不恰当,以偏概全了。可能误导了你。
既然你自己已经能算出入口地址的偏移值,那我就这个程序说了

也许你已经知道,5C这个偏移值是怎么算出来的了,不过为方便说明我在过程中会再提及。
首先说一下我对这个游戏程序“提字”的理解:(下面我用的“硬盘”“内存”只是为了方便说明文本是分开存放的,也许是内存里设了数据缓存区,也有可能是CPU CACHE,这些东西搞深入了还真是没完没了,也远远超出我的知识水平了)
1.程序先从硬盘以一次仅读取一个字节的方式将目标文本写入内存(可能是对话,可能是商店,也可能是其他)
   [我们知道一个日文是一个双字,所以这里将无法用来HOOK]
2.全部写入完成后会确定文本输入完毕(计数器为0),并在末尾写入“0A 00”作为结束符
   [我的特殊码就是在这里HOOK的]
3.然后程序再在内存里以一次读取一个双字的方式将文本显示到屏幕上
   [即使是程序自身,也必须是一个双字才能显示一个日文]

这里只讨论第3步。
我以对白和商店情报为例,其他都是以此类推的。
1.对白完成从硬盘到内存后,在4FE930  CALL 505010 ,把4FE935(+5)压入堆栈
   然后在505029由EAX作为指针,每次读取一个双字。这时4FE935的位置在堆栈+5C
2.商店情报完成从硬盘到内存后,在 500221 CALL 505010 ,把 500226 (+5)压入堆栈
   然后在505029同样由EAX作为指针,每次读取一个双字。这时 500226的位置同样在堆栈+5C

至此可见,无论是哪个文本,都是由不同的入口地址转入CALL,再由不同的地址让AGTH进行“过滤”的
回来看505010的信息窗口 ,写着 Local calls from ... ,后面是一串地址,这些都是入口地址。
AGTH就是这样根据每一个入口地址将所有文本“分离”开来的
在AGTH界面你同样可以看到各个文本都被标注了入口地址,
如 0x00000001:004FE935  UserHookB  , 0x00000001:00500226  UserHookB

那么我们伟大的Freaka先生为什么用“过滤”而不用“分离”呢...?
(好吧...其实我在想是不是我英语水平太差了翻译错了 =v=)
这是因为君呼丘这个游戏“特殊”了
一般游戏只有一个文本,所以有垃圾掺和的时候就会显示成“这A个B文C本D有E垃F圾G有垃圾ABC”这种形式
所以“过滤”后在AGTH里就显示3个文本:
“这个文本有垃圾”
“ABCDEFG”
“有垃圾ABC”
这么一看的话不就是“过滤”了吗?
所以事实上“过滤”和“分离”在AGTH里都是同一个操作,只不过我们怎么去称呼它而已
在Freaka的视频里Local calls from ... 后面跟着4个入口地址,演示AGTH的时候下拉也有4个文本,我们从中可以得到同样的理解。




提问2:

1 "在开始调试程序之前,需要把游戏里的一开始显示的两次文本转换成16位码"  这个要怎么转啊?
2  有些游戏Agth只能提取存档的那几个字, 何来"把游戏里的一开始显示的两次文本转换成16位码" ?根本搞不出来嘛.


解答2:

1.是SJIS转HEX码,你可以用我在首楼给出连接里的附件,因为那个程序是Freaka写的,所以我没贴出来
2.你是说那行日文是怎么写出来吧?ORZ...是自己用日文输入法敲键盘敲出来的...如果AGTH本身就能正确显示的话还去算特殊码的话不就本末倒置了么?


提问3:

请问lz 我在查找游戏第一句话的时候出现如下图的窗口

提示无法读取内存 请问这样的情况该如何处理?

还有,在内存里查找16位码用的可以不是用第一句话的吗?

另外,游戏的文本前两句agth提取完全 到第三句的时候开始出现缺失 这是否意味着后面的文本所需要的数据在内存中是分开的,需要分开查找? 

最后 由于我使用的是汉化的ollydbg 所以看着lz设置断点的时候的选项有些绕弯

还请lz指出设置时正确的选项


解答3:

1.去以下网站找去壳插件
http://www.openrce.org/downloads/browse/OllyDbg_Plugins
我用的是Olly Advanced和Hide Debugger (复制到根目录就行,别问我怎么设置参数,我忘了,你搜搜网上的教程)

2.任意一句话都可以

3.你确定前两句文本和第三句文本是同一个类型吗?
有时候不同的文本是放在不同的内存地址里 
例如商店信息和人物对白就是分开存放的
无论怎样`agth只能显示一个文本`一般找到对白文本就行

4.用英文版有益健康
你那图`我猜应该是硬件访问->字节


提问4:

我提取游戏Paradise Lost文本,成功找到了地址/HS@44DE8C  /HS@44DE90  /HS@44DE90,这三个都能成功抓取文本,但问题来了,因为此游戏前面一大断对白都是男主的和旁白,并无女性对话,所以都能成功提取,可中途出现的所有女性对白却无法提取,每到女性对白则显示类似xx_0013.wav的东西,请问该怎么办,   
  然后我玩[今日からプリンス]时,并未用特殊码,agth能自动提取,可问题来了,他一个代码只能提取一个人物对白,换到另一个人物则要去把代码换到另一个,这么老是换来换去很麻烦,请教怎么解决,是不是说这些对白不在同一文本中??


解答4:


1.[Light]Paradise Lost: /x3 /v /HAN-4@40CD70 /FText@1
这是别人找的AGTH CODE ,我没有游戏也无法解答你的问题

2.如果想合并文本则在特殊码/HA /HS后面加N   即/HAN /HSN之类
AGTH好像没有专门合并文本的参数,你可以阅读一下AGTH的帮助



提问5:

我是个新手,按照大师的方法开始,首先遇到了两个难以逾越的槛,首先我按照楼主的方法attach了一下,结果状态栏里显示paused,左边说是attached process paused at ntdll dbgbreakPoint,  然后游戏就卡着不动了,第二个就是双字转换的问题,粉肠的插件我下了,但是根据他的介绍这个转换需要找到他的内码在内存中的位置,我一开始就无法正常attach,就别说这个了..我也无法想象怎么在那么多内容里找一句日文的内码.......
我是个新手,虽然是个学计算机的,但是汇编一直没怎么好好学,希望楼主能耐心给我说明一下,拜谢过了。

解答5:

1.按F9 不行就装解答3的

http://www.openrce.org/downloads/browse/OllyDbg_Plugins

 我说的去壳插件
2.粉肠那个就是蹭得累 自己去转了码 再搜

提问6:

我用OLLYDBG打开RealLive.exe(那个游戏是ナツユメナギサ)的时候,弹出了下面那一段话:
Bad or unknown format of 32-bit executable file "E:\SAGAPLANETS\NATUYUME\RealLive.exe"
然后我无视他按F9,然后弹出了下面一段话:
Please turn off debugge!and try again
怎么办??

解答6:

请用attach钩EXE

提问7:

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

解答7:

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



提问8:

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

解答8:


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

提问9:

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

解答9:


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

提问10:

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


解答10:

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



心得体会。
第一步,先用日文TXT文字SJIS转为HEX码。
第二步,用OLLYDBG开启游戏,然后当游戏出现我们转HEX码相同的文字时,查内存,取断点。然后再运行游戏,只要我们取对了断点,游戏就会在显示下一句话时,中断。(然后是不是我们查出这两个中断之间的特殊码就可以了。说实话,这一部分,楼主讲得比较略,不是很清楚,能不能我举几个例子啊)
第三步,我分析得出的特殊码为HS HB HA +偏离值@ 单步运行停止的那条指令



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

http://867258173.diandian.com/post/2014-06-26/40062099618

 

你可能感兴趣的:(教程类)