CheatMaker 论坛

注册

 

发新话题 回复该主题

实践《模拟器调试教程》中所遇到的断点问题求助! [复制链接]

1#
银河漫步兄这次的《模拟器调试教程》“干货”太多,这些天来一直在努力消化中。将视频反复观看了多次后,为了加深理解便开始动手实践教程中所演示的功能。可是刚开始就遇上无法解决的问题了,不得已只得发帖求助。原因是这样的:FC调试教程的最后是关于如何找到机器人大战相关精神数值的ROM实际地址,由于本人也非常喜欢机器人大战系列,尤其是SFC版的第四次机器人大战,再加上个人认为虽然机种不同,但思路应该是相通的,因此就想用FC版的思路来找一下SFC版的精神数值地址。

按照FC调试教程所说的那样,先分两次搜索当前角色的当前精神值,用找到的地址如(阿姆罗=7E18ED)下写入断点,重新使用一次精神后为断在$82/C6F0 9DE5 18    STA $18E5,x[$82:18ED]这条代码处,而上面一条就是导致精神减少的SBC $0EC0  [$82:0EC0]。成功找到这条代码后,接下来就需要继续查找$0EC0这个地址的来源。可是进行到这里后,问题出现了。不管是用7E0EC0还是000EC0下写入断点或执行断点,回到游戏后无论怎么使用精神都无法被断下。而下读断点后第一次会断在$80/AC57 CD C0 0E    CMP $0EC0  [$82:0EC0]处(看了上下之间的一些代码,感觉这里应该与精神值无关),点击“RUN”一次后则会又被断在SBC $0EC0这条减法指令处,导致再也无法查找下去。

后来又尝试其他各种方法,比如按个人估计直接搜索精神数值排列组合(20 20 30或30 40 50等等),把搜索到的地址全部改动后看效果,看能否找到一点蛛丝马迹;再比如,为了防止软件版本不对,重新到国外下载各个网站下载Snes9x 1.51 Dev,结果都是徒劳的。因此,还请银河漫步兄或其他能解决此问题的高手多多指教(像这样连续的失败实在太打击自学的热情与信心了)。

PS:说个题外话,在视频教程中,曾经偶尔提到当前寄存器处理的值是低8位的,那么,要如何区分当前寄存器或内存地址处理的是低8位、高8位或者是16位呢
分享 转发
TOP
2#

1.sfc那模拟器不支持条件读断点,所以遇到下读断点立刻被断下的地址,只能从其他方向来做程序跟踪
如果你对pc寄存器的运作方式很了解的话,用od和ce也可以辅助到

2.怎么识别低位高位关键是看汇编代码,大多数汇编对地位和高位的操作是不同的,比如strh、strb 就是对高、低位操作的区别,sfc的65816汇编对于是高位还是低位操作,有一个检测寄存器P,P寄存器的第5个bit位判断当前的a寄存器是单字节还是双字节操作,为1表示按照双字节,为0则为只操作1字节(即低位)

这套教学只是告诉你模拟器调试器的用法
至于模拟器所用到的汇编语言
请自行找资料学习
我没有能力也没有必要详细的教
TOP
3#

这里先谢过银河兄的回复,不过,请恕在下愚鲁,关于第一条主楼也许没说清楚,我想请教的是:既然是系列游戏,为什么按照FC版的思路到SFC版中不适用了?即,为何FC可对当前所使用的精神值下写断点后继续往下追踪,到SFC版中却行不通?为什么对7E18ED下断点无用?虽然,相关的地址不同,使用的调试器不同,但个人总感觉这个思路是对的,也许只是自己没有掌握正确的使用方法,导致断点断不下来或者哪一步还做的有缺陷。因此,主楼才会提到为了解开这个疑惑,曾经模拟器之外下过许多不必要的功夫。

而银河兄后面的一句话“所以遇到下读断点立刻被断下的地址,只能从其他方向来做程序跟踪,如果你对pc寄存器的运作方式很了解的话,用od和ce也可以辅助到”则更让人增加许多疑惑:比如我现在就已经开始怀疑这个思路是不是有问题?“其他方向来做程序跟踪”?正是因为Snes9x与NO$SNS(为什么其他的NO$系列的断点就那么强呢)都不支持条件断点,所以才导致本人现在有点像走到“死胡同”里,感觉靠自己的力量很难走出来了。此外,这里怎么还有CE或者OD的事(虽然曾偶尔看到高手用过IDA分析SFC程序)?

而关于高低位判断的回答则有些让我出乎意料,比我想象的要复杂。不过也好,这也提醒了我还得去把以前收集到的《65816参考资料》、《65816 ASM 教程》、《狼组RomHack文章》等等文档再好好看看,继续加深基础才行。
TOP
4#

今天无聊看了下
sfc第四次的精神内存在80:B1BE的位置
断点位置可以下在 7F:7C00

至于为什么
你可以再练习下
TOP
5#

再次得到指点后重新试了一下,这次果然成功找到精神所在的ROM地址了。其实在银河大指点之前,本人已经通过其它方法找到相关的数据了,虽然结果有了,但必竟不是用逆向追踪的方法实现的,对进一步了解Snes9x Debug的操作与熟悉65816的运行机制没有多大帮助,算是另一种形式的“歪门邪道”吧。

这次成功通过Debug手段找到精神地址,说起来突破口居然是主楼最后那个关于如何分辨8位、16位的题外话,真是太让本人想不到了。仅就这一点而言,不得不让人承认,不管在哪个群体中,总有一些人在想法等各方面总是要异于常人的,而类似这种“天份”的东西很可能是后天努力也难以追上的。

经过这次的事件后,本人可谓是收获良多,也有动力与信心继续深入研究下去了,真是非常感谢银河大的提醒。在此还想就之前找精神地址过程中所遇到的几个小问题继续请教一下:

断下来的代码中,P寄存器里显示的内容,如:P:envMXdizC,这里的字母大小写应该分别表示1和0吧(例如M大写则表示16位,小写表示8位)?点击“Edit Registers”按钮后,各项Flags又该怎么看?不钩表示0,钩选表示1?再有就是,点击此按钮所显示的内容是基于当时的断点吗?

此外,在逆向追踪时,总要不断的查看当前断点地址上面的代码,在Snes9x这个调试器中,除了点击“Disassemble”反汇编按钮来获得外,还有没有更好的方法呢?不知为何,在本人的电脑上,使用此按钮来获取代码时经常会失去响应。与上一条有些关联的是,所获取代码中显示的寄存器或内存地址的值是可以参考的吗?

最后一点同样是在获取反汇编代码后,要某些需要计算地址的地方,调试器会贴心的附上结果。比如:LDA [$20],y[$CB:C233],而最右边这个中括号里的内容该如何正确理解呢?除了知道[7E:XXXX]与[7F:XXXX]是查看RAM,[CX:XXXX]是查看ROM外,其它像[00:000X]、[80:XXXX]、[82:XXXX]与没有前缀只有4位数值的[XXXX]又该怎么理解以及到调试器中查看呢?

最后一条可能与65816的寻址方式有关,而这方面正是本人很大一块短板,曾经努力研究了很长一段时间,就像前说的,天资所限,总是没办法很好的融会贯通,希望这次能在银河大的指点下,弥补这方面的遗憾吧。这里顺便附上几种8086的寻址方式,这是本人以前为了更好地了解65816的寻址方式所列出来的,也算是一点心得吧。

8086的六种寻址方式:

1.立即寻址
mov eax,65h
作用:通常用于赋值。

2.直接寻址
mov eax,[12346578H]
作用:通常用于处理变量。

3.寄存器寻址
mov eax,[ecx]
作用:地址在寄存器中。

4.寄存器相对寻址
mov eax,[ecx+34H]
作用:常用于访问数组或结构。

5.基址加变址寻址
mov eax,[ebp+esi]  //注意EBP与ESI寄存器的定义及原始作用。
作用:常用于访问数组。

6.相对基址加变址寻址
mov eax,[ebx+edi-10H]
作用:常用于访问结构。
最后编辑zsyf 最后编辑于 2014-09-18 16:05:10
TOP
发新话题 回复该主题