//用NCTOOLS修改 黄金英雄坛说
大家一定很羡慕那些会修改游戏的朋友,其实学了汇编后,这些都是些雕虫小技,你完全可以
做到,下面我们就来实现修改 黄金英雄坛
这里我修改的目的有三个:
1. 不需要攒够经验值,就可以向 独行大侠 请教
2. 拜了一个师傅后,还可以拜另外的师傅,从而学习更多的武功
3. 搬一次石头,得10000经验值 和 10000潜能
这些修改其实是很简单的过程,下面我们来实现它们:
1.由于当你经验不足时,独行大侠 说 "去去去,攒够经验再来吧!"
所以我们根据这一线索,就可以找到相关的程序
我们进入 NCTOOLS,用 S C 命令查找 "去去去"
S C 4000BFFF040F,按 = 号,输入 "去去去"
在我的机子上,是在 0B 页码的地址 7BDC
我们应该知道,要显示这一文字,是要调用子程序的,而入口参数应该就是该段文字的开始地址
所以我们判断,应该有这样的程序,
LDA #$DC A9 DC
STA ?? 85 ??
LDA #$7B A9 7B
STA ?? 85 ??
我们输入 S C 4000BFFF0B,输入查找内容 A9 DC 85
结果找到了,在地址7BC9
7BC9: A9 DC 85 A6 A9 7B 85 A7
7BD1: 20 D9 62 60
我们反汇编
7BC9: LDA #$DC
7BCB: STA $A6
7BCD: LDA #$7B
7BCF: STA $A7
7BD1: JSR $62D9
7BD4: RTS
这里我们应该知道,前面一定有条件跳转指令,当不满足某些条件时,程序才转到地址7BC9执行
当满足条件时,独行大侠 才教你.
我们往前面看,看到下面数据
7B99: C9 07 D0 38 A9 03 85 82
7BA1: A9 00 85 83 A9 40 85 80
7BA9: A9 0D 85 81 AD B3 2E C5
7BB1: 83 D0 13 AD B2 2E C5 82
7BB9: D0 0C AD B1 2E C5 81 D0
7BC1: 05 AD B0 2E C5 80 B0 0C
7BC9: A9 DC 85 A6 A9 7B 85 A7
7BD1: 20 D9 62 60
我们反汇编下:
7B99: CMP #$07
7B9B: BNE $7BD5
7B9D: LDA #$03 ;03送地址82
7B9F: STA $82
7BA1: LDA #$00 ;00送地址83
7BA3: STA $83
7BA5: LDA #$40 ;40送地址80
7BA7: STA $80
7BA9: LDA #$0D ;0D送地址81
7BAB: STA $81
7BAD: LDA $2EB3 ;地址2EB3的内容和地址83的内容比较
7BB0: CMP $83
7BB2: BNE $7BC7 ;不同,则转 $7BC7
7BB4: LDA $2EB2 ;地址2EB2的内容和地址82的内容比较
7BB7: CMP $82
7BB9: BNE $7BC7 ;不同,转地址 7BC7
7BBB: LDA $2EB1 ;地址2EB1的内容和地址81的内容比较
7BBE: CMP $81
7BC0: BNE $7BC7 ;不同,转地址 7BC7
7BC2: LDA $2EB0 ;地址2EB0的内容和地址80的内容比较
7BC5: CMP $80
7BC7: BCS $7BD5 ;若地址2EB0的内容 > 地址80的内容,转地址7BD5
7BC9: LDA #$DC ;这里就应该是显示"去去去,攒够经验再来吧!"
7BCB: STA $A6
7BCD: LDA #$7B
7BCF: STA $A7
7BD1: JSR $62D9
7BD4: RTS
我们知道,只有经验值到了 20万,独行大侠才教你基本工夫,我们通过计算器得知,20万用16进制表示是 00 03 0D 40
这里地址2EB0-2EB3是经验值的地址,一共4个字节,所以经验值最大是 FF FF FF FF,即10进制的4294967295,在这个程序里
比较经验值是否 > 20万,如果是,程序就转地址 7BD5,我们为了达到我们的目的,只要这样做
7B9D: JMP $7BD5
就可以,即无条件转到地址 7BD5,这样不管经验值是多少,都可以向独行大侠 请教了.
2.当你已经有师傅的时候,你再拜师傅,师傅就会说:"你已另有名师,还想来我这儿偷师学艺吗?"
这句话就是线索,我们就可以找到相关的程序.
我们 S C 4000BFFF040F
输入查找数据 "你已另有名师"
结果我们找到了,这里我是在 0B 页码的地址 802B
根据前面的经验,我们知道有这样的指令 LDA #$2B
STA ??
LDA #$80
STA ??
我们找到机器码是 A9 2B 85
然后我们查找 S C 4000BFFF0B
输入查找数据 A9 2B 85,结果找到了,在0B 页码的地址 7B37
7B37: A9 2B 85 A6 A9 80 85 A7
7B3F: AD A9 2E C9 00 F0 07 CD
7B47: 91 2F F0 02 D0 28 A5 50
这里我一眼就能看出是改那里,但大家可能不懂机器码,所以也要反汇编
这里我建议大家还是学些机器码,要不这些字节在你眼里是数据,但在我的
眼中却是程序,而且反汇编的时候,你由于不懂机器码,不知道从那里开始反汇编
不能分辨出数据与代码.这里我们反汇编
7B37: LDA #$2B
7B39: STA $A6
7B3B: LDA #$80
7B3D: STA $A7
7B3F: LDA $2EA9
7B42: CMP #$00
7B44: BEQ $7B4D
7B46: CMP $2F91
7B49: BEQ $7B4D
7B4B: BNE $7B75
7B4D: LDA $50
这里我们看到,程序判断地址 2EA9的内容是不是0,如果是,说明你还没有师傅,那么就可以拜师
所以我们改这里为
7B3F: JMP $7B4D
机器码为 4C 4D 7B
就可以拜很多师傅,学很多东西了.
3. 那工地管事说"你是干什么的,别在工地乱跑"
我们就查找,结果我在 0D 页码地址7B45找到了
当你把石头搞丢了,工地管事说"你真粗心一定是半路上把石料丢了",该文字开始地址 7B60
当你搬来了石头,工地管事说"多谢你大老远把石料送过来,辛苦了 你被奖励了...",该文字开始地址 7B81
我们查找 S C 4000 0D ,输入查找数据 A9 45 85,找到了,在地址 7A84
我们于是知道,当你和 工地管事说话,如果你没有接受搬石头任务,会执行地址7A84开始的程序
当你搬了石头,会执行 7AB1那里的程序,因为那里有 A9 81 85,即 LDA #$81 STA ??
所以我们直接在7A84那里写上 JMP $7AB1,即 E C 7A84, 输入 4C B1 7A
就可以了,你每次和工地管事说话,他都给你经验值和潜能,不过每次给的也太少了,我们可以
修改的多一些,我们 V 7AB1,看到下面数据:
由于数据较多,我就不反汇编了,我直接告诉大家吧.
前面我们已经知道,2EB0-2EB3是经验值地址,通过看这里程序,我们又知道 2ECF-2ED0 是潜能的地址
既然我们知道地址了,那么我们想怎么改都可以,用计算器算出 10000的十六进制是2710,那么我们只要修改
地址 7B0A: AD B0 2E 69 10 8D B0 2E AD B1 2E 69 27 8D B1 2E EA EA
7B27: AD CF 2E 69 10 8D CF 2E AD D0 2E 69 27 8D D0 2E EA EA
然后我们还需要修改信息,因为已经是10000了呀
V 7B81
按 输入法 ,输入"Thank you! 你被奖励了1万经验值和潜能",然后后面多出的字用20代替
我们进入GMUD,看看效果