- 精华
- 0
- 帖子
- 478
- 威望
- 0 点
- 积分
- 629 点
- 种子
- 12 点
- 注册时间
- 2008-3-13
- 最后登录
- 2024-8-5
|
楼主 |
发表于 2012-10-19 20:13 · 吉林
|
显示全部楼层
有同学想知道如何处理敌我共用的代码,下面就简单说一下:
其实处理这样的代码跟普通的没什么大的区别,最主要的是要找出识别敌我的关键点,而实现这一切则依靠分析数据的能力。
当跟踪到计算HP减少的程序段时,要注意计算所需参数,这些参数与相关对象密切相关,一般为间接寻址的偏移量,基址可在
附近的程序指令中获得。利用这些参数我们可以访问到相关对象的内存数据,用以识别是否为敌人或我方。
在本游戏中,HP减少子程序中访问对象HP的指令是
LDA $7e0002,x
$7E0002为基址,寄存器X为偏移量,所以寄存器X就是用以识别敌我的关键参数。
通过前期对游戏运行数据的分析得知,主角的HP内存地址是一成不变的,所以可直接用寄存器X的值识别出该次计算中的对象是否为主角;
但是这还是不够的,因为游戏中主角还会雇佣保镖来加强战力,虽然同样是固定内存分配,但游戏中有N个角色可以雇佣,每个人的地址都
不同,总不能把所用可雇用的人的地址都建个列表来识别吧,这样效率也太低下了,不得不回头再次分析数据。
经过细致观察发现,每个被雇佣的人的HP内存地址的前一字节都是#$80,敌人和主角都是#$00,现在终于可以识别出谁是同伴了。
现在万事具备,后面的事情就简单了,在ROM中找到一段空闲的空间,写一个子程序来判断敌我,这样HACK就成功了,当然还需要深入测试,
还不能保证上面分析的结果100%正确。
一个Hacker所做的事情就是分析程序的功能,在理解了程序的逻辑之后将程序改为自己期望的行为,获得需要的数据。
这一切的前提是对数据的分析,不掌握关键的数据,不了解其意义,修改就无从谈起。
附:
此HACK中我写的子程序:
A6EDE0:
- CPX #$359C
- BEQ PLAYER:
- LDA $7E0001,X
- CMP #$80
- BEQ PLAYER:
- LDA $7E0002,X
- SEC
- JML $8086BF
- PLAYER:
- JML $8086EB
复制代码 子程序的入口地址:
8086BB:
JML $A6EDE0(原始程序为:LDA $7E0002,X)
=================================EOF
|
|