签到天数: 1997 天 [LV.Master]伴坛终老
|
准备东西:68K指令集资料、REGEN DEBUG、十六进制编辑器
( ?: t6 E1 F7 F6 E+ C4 |" o% {: }( N6 [3 t. F: F
REGEN DEBUG官网下载页面:http://aamirm.hacking-cult.org/www/regen.html
- Z5 h7 R7 m$ {& y" L$ K5 m" T M8 M0 h: a8 `8 K3 v
以前写的MD HACK教程是用MD调试器,但这MD调试器在使用过程发现有点缺点,显示机械码只显示前2位,后面地址或数值却没有显示,有可能造成后来新手在修改ROM时寻找不到要修改的数据。
1 a! u1 p- X% d2 |/ k+ |3 h9 E6 f( u: f/ [' C5 E& K# j
本篇教程考虑改用REGEN 0.972 Debug版来调试跟踪,现在的REGEN DEBUG很强大,可以考虑放弃MD调试器。5 ]9 m' s( b# `& w. n" Z. O* f
J$ m( I; `: F6 ?6 R' X/ `以《魂斗罗:铁血军团》日版为例,修改目标:体力值不减! m; d* r! U0 k4 S) H6 l7 Q! Z
6 p, Y% D, P' \$ X2 P
1。先找到《魂斗罗:铁血军团》体力值存放地址,可通过REGEN自带的作弊码查找功能来找,我找到了,存放地址是0xFFFA0D。+ ]$ n- _* X( K2 k# b1 q
, s" H3 ^( A/ J8 ?+ n1 d
2。选择人物进入游戏后,点击Tools->68000 Debugger进入68000调试器界面,图1:+ D1 k2 y& f8 p
0 E' y; D/ S" E. B+ d$ }& U+ c, M# Y ]) e+ a
左上角框是显示汇编指令,右边是寄存器显示' b; _! A& J5 I, E; |- {$ \. i; g1 @
3 v- j' W! d! w: x* P, l
Address Breakpoints是地址断点
5 k( o6 z( m, B! i6 T' p, Z7 TAddress Range是对一定范围地址设置断点+ m E: I* X' [
Register breakpoints是寄存器断点! ]1 k) o+ d- E6 Z( p1 E. J2 f' S
VDP Breakpoint Range是对VDP一定范围地址设置断点
+ G4 b. W( P. UVRAM breakpoints是VRAM断点) p. s4 _7 P. j* ]* _- O# I+ O0 }
Go to address是转到指定的地址
+ }. E6 V3 a& Bshow disassembly是对指定的地址反汇编6 \) a+ t6 H2 x9 o* D. [0 Z+ P
Debug step是进行单步或N步调试 |$ A9 r. [5 z r
ROM MEMORY是ROM Viewer z) R" q# J' y1 E) |
68000 MEMORY是RAM Viewer
& ~1 X3 e" t) W* L" R1 ZZ80 Debug是Z80调试器# ~& I4 k+ w" K. F% D
; {$ ~8 Q2 F n! P. d$ o- ]Read是读,Write是写,PC表示是PC地址,Trace是跟踪(选择该项会在模拟器目录下生成ASM文件)
6 H" I, x1 @- K4 i) Y: U- Z
1 Q( @+ T5 I, RRESET是重启游戏,RESET68K是68K重启,RESETZ80是Z80重启+ t2 f4 \1 U, y
% P" J! y& W+ [& R6 w4 I3。在Address Breakpoints的Set Breakpoint右边框输入地址FFFA0D,Write选项加勾,再在Set Breakpoint左边框打勾,图2:
9 D2 c# \8 E/ @5 ^. x
1 R8 a3 Y8 {9 R9 A& |, K9 {; I+ e9 d0 u7 ~7 W- t0 W' Y
4。点击OK返回游戏,当被敌人攻中时调试器发生中断,图3:
4 Q% r' I5 m+ N" ?0 K* P
: R4 I) ]+ G$ \4 w4 i) s# Q- }& s4 a+ X& K6 Y
指令停在011DEE 1C2A000D move.b ($d,A2),D6这一行,前面指令却没有显示,用show disassembly把11DE0~11DFA这段地址反汇编看看,图4:
0 J! F1 ~: T [5 F, ~- I6 T
?9 }$ z, T" @. A& h+ b, B( Q
4 Z5 O) k& x) ~6 [1 K现在来分析一下:
0 i) D$ D# a2 L/ u, ]A2=FFFFFA009 w6 T# f" r! X! C& o
D1=00000001
' b( @, e: _6 y2 o z# U" i! O* A
9 g" T# z8 j9 v" U' O# J011DEA 932A000D sub.b D1,($d,A2) 把$FFFA0D(A2寄存器的数据($FFFFFA00)+$d=$FFFFFA0D)的地址单字节数据减去D1寄存器的数值,结果存入$FFFA0D
, g4 S Z1 q8 @) }: u/ Y011DEE 1C2A000D move.b ($d,A2),D6 把$FFFA0D的单字节数据存入D6寄存器5 {/ D/ g# S# J$ J
" O# c7 R2 ~) T4 K' {# r
只要把11DEA指令NOP掉,就可以实现体力不减,NOP指令机械码是4E71
# B' m( P4 x+ R( N' u9 w3 {/ e' E9 U8 [! x) q7 {/ i
5。点击ROM MEMORY进入ROM viewer界面,来到011DE0地址,在Set new value输入11DEA和4E714E71,再点击Set 1-10 bytes写入,再点击OK退出ROM viewer,图5、图6:! m2 e, m: ?9 x# J, M" k- w
* h# I1 C1 l# T( R/ U: z- m$ S& o. a6 j7 K* N9 r9 K+ l% F
注意:在ROM viewer修改,修改结果是不会被写入ROM里,要修改ROM还得用16进制编辑器。
- C6 g: e, J* e' B, C: b( f* p+ ]; [; X* m
6。再对11DE0~11DFA这段地址反汇编看看,11DEA的指令被NOP掉,图7:
9 F# C# q. |) Y9 V# y" l' \/ j& r4 Q" A
/ a" p, h+ |$ `: ]# P, f) S) P* y/ U" z" m3 N# z" D6 r4 p
7。把Set Breakpoint和write的打勾去掉,再点OK回到游戏看看,体力是否不减了?体力不减说明修改成功。图8:
' @1 j9 T, ]' i: {! s; B
$ F/ x, O7 n; \
8 L" _ ^& q1 G6 P _6 [( w8。打开WINHEX或UE,载入《魂斗罗:铁血军团》日版ROM,来到0x11DEA,把93 2A 00 0D修改为4E 71 4E 71,保存。图9、图10:
# b |0 M; x% s3 f- y2 O3 L7 U: l* a8 ^
+ g' \9 Z9 W T1 J9 `疾风之狼 x; t7 y" C1 D% G: }. t' r) n( X
2013/09/13 7 D2 s/ P9 S& F: B! S; s8 r! c
7 G6 Y' K7 l) G如看不清图片请点击图片放大,或至我博客:http://zero3c.blog.163.com/blog/static/278215082013813111414953/ 观看 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|