签到天数: 1803 天 [LV.Master]伴坛终老
|
如何Hack GBA ROM 文章来源:http://freehost26.websamba.com/zsltoolz/$ h- Y' B& a; R
* m7 n% R) M( W2 k$ |) m* S作者:zhaosili(.zZ~~) 转载请注明 U; U# }9 o* }- t! q
3 i( ^' {, ?$ K/ }0 p本文假定你已经了解80x86汇编(尽管指令集不同),并且会使用TRW2000(尽6 P K; p6 e8 R3 A6 G4 P3 M
管没用到)之类对程序进行调试。4 |0 z5 B; e0 v$ k- C0 }$ P
工具:8 I( b7 x( @0 b/ l; R, B
VisualBoyAdvance-1.5、HexWorkshop(或其它十六进制编辑器)、No$Gba 4 o0 W, i6 ~( I; e
Debugger* t N# P/ r {( f v# v
ROM:GBA-302 - Dave Mirra Freestyle BMX 2 (E)+ n8 u1 |) D& r
写本文时笔者也是刚学会如何通过修改程序指令HACK GBA rom。(整整花了我) K" U% O/ n6 n+ J* f
一上午时间研究)如果你不懂THUMB和ARM指令集的话(和我一样)就先看
$ B+ V9 {/ H3 f2 D! {No$Gba HELP中的CPU Reference部分,里面有较为详细的介绍。在我所HACK的: W5 |2 l& W' c' T* A8 F
这个rom用的是THUMB。Hack的目标是时间无限(尽管在游戏中如果这样改就相
: g0 a# Q& Q/ _ _3 ]: S当于游戏无法结束)。8 W9 F$ F7 C6 r$ }# C
首先,用VisualBoyAdvance-1.5的Search for Cheats...功能找到时间的地址
* ~$ A& z1 O- \$ p1 }( H为0200DBF0。(注:不要用Emucheat之类找,否则还要加上一定的偏移地址,: O* |1 f% t, p1 h+ Q- C
很麻烦)
5 K1 h3 \+ ?9 M用No$gba载入ROM。选择DEBUG->DEFINE BREAK/CONDITION。在文本框中填入
* r! o! j/ { k9 p% r# w: [[0200DBF0]!,这样一个断点就设置好了。(具体断点怎么设看No$gba的HELP)3 Z/ o: A! p% W" Y( n$ d
这样当0200DBF0中的数值改变时就会中断下来。按F9(可能要多次)进入,正
+ P) ]+ r. p! T* }' K, Z5 _常进行游戏。当出现时间改变时就会中断在0800A292。观察上方有指令sub
0 ~5 d& O" l% f l" F4 |2 l4 ^r0,1h及str r0,[r1]估计时间就是在sub r0,1h处被减少的(为什么?如果你4 Z8 n2 U9 ~8 P. H: n5 s& Q; M8 u
会用trw2000经验告诉你就是这样)。于是双击0800a28e这一行,在sub处设断。
" \5 B& P u2 }8 a. Q" ~$ E按F9,游戏正常进行一两秒后就会被中断。此时寄存器r0=77h(十进制119,就是* L. V5 g. F4 z+ m) k( [2 [5 {! W
119秒,在游戏中显示1:59)。按F7,到下一条指令str r0,[r1](r1=0200dbf0是
! C- [- C) p! a/ R时间的地址),这条指令作用是使r1内对应地址所存的数值等于r0内的值(具
0 }, \2 E+ j2 J+ w4 j; f体看No$Gba HELP中的CPU Reference部分)。可见要使时间无限只要将sub # X, d P- j! z
r0,1h改掉,r0内的数值就不会变,0200dbf0处的数值也就不会变。我选择将7 l* R$ m" _0 u. H/ z: p$ V* e6 r. d
sub r0,1h改为sub r0,0h(在sub上点右键,选change instrution,填入sub " h( ~( Y$ y9 P* A, o
r0,0h)。将断点删除,按F9进入游戏,时间是不是不会减了呢?
- P% p5 D* n; g; ]8 J5 b% Y$ C9 D接下来就要改rom了,先记下没修改前的机器code,就是0800xxxx旁边的数值. j* Y/ j" U% N; M4 z
(应该是6808 3801 6008 6810)。然后记下改后的机器code,应为6808 3800 " B1 J' h8 B5 u7 t$ @( I0 X
6008 6810。把高低位对调,对调完后应该是0868 0138 0860 1068和0868
( D S# r/ L. M) y0038 0860 1068。用HexWorkshop打开rom,查找0868 0138 0860 1068。找到/ s }1 G7 @9 b# T& g# }
后修改为0868 0038 0860 1068。存盘。用VisualBoyAdvance-1.5载入play看
4 z) j) J0 \3 w; W r' ?$ B看,时间是不是无限了。收工。
! U# h5 R0 a7 J& T! D2 c有什么问题欢迎共同探讨,我的QQ:32743622
+ E( V D6 P2 a6 E/ J. N8 r# Y( l9 O
阿姆罗:总之先学ASM吧……" N( `& z" k. i5 T6 F$ f
- p' ^7 Y( ]$ v. ? T% t8 q: L[ 本帖最后由 疾风之狼 于 2009-3-31 20:42 编辑 ] |
|