签到天数: 2153 天 [LV.Master]伴坛终老
|
1.准备工具
" M/ x8 _$ g/ [( D, _# q7 t3 o2 Q带调试功能的模拟器:pSX 1.13$ Z4 p, S6 ?% B8 w
一个16进制编辑器:很多,随意选一个自己喜欢的,本例教程使用的是winhex。
8 I/ i5 x5 Z! o& @2 \MIPS汇编指令集资料:MIPS汇编指令基础.pdf(MIPS Assembly Language)
$ }' O+ t$ q$ ]7 c G) v! d游戏ISO:月下夜想曲Rev 2版
% J: l1 X6 g( B1 E. B: i- w, d; ]8 WAkumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 1).bin
# F3 s% ]8 K1 b( vAkumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 2).bin
' S5 Z+ U- f3 b; f3 P2 X- ^; ~$ h6 v9 qAkumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2).cue9 ^6 x6 x6 n* d/ k
6 c( Z5 c. B$ l K" @% d, C7 i
2.首先找到要修改的游戏金手指地址,我在emucheat提供的游戏金手指找到了。
8 L% w) A9 S4 l[金钱无限]
, T; y% a" G5 T# i$ dON=80097C00#423F;80097C02#000F4 K+ k% ]3 e9 }; G
, c d7 e& g6 h' v2 O" O金钱地址是0x80097C00
" }# ~9 q5 U4 z6 b7 s- a+ Z
( O( y; Y. ]1 w# ~3 h3.运行pSX 1.13,“文件”->“插入CD镜像”,加载“Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 1).bin”镜像;% t+ M5 z! G+ @) g
5 H1 z3 _% l8 K, T8 E- h& O3 ?
(要设置pSX 1.13手柄键位请选择“文件”->“设置”->“控制器”) {& ?. ?, z1 Z+ k8 ` I
' h6 D+ w: \- v* T
4.游戏进行到藏书库的老爷爷处,进入“宝石壳却”界面,前提有一个宝石戒指;0 S2 L, c- A( `) d% d9 _* P
' C/ X( u5 D* f2 I. a+ L) x$ J; E, |2 u6 o, v
5 ~! w& _) u& r5 d: \2 U
5.选择“调试”->“监视器”->“r3000”,在“中断点”窗口点击右键,选择“添加 Ins”添加断点; Q' ?4 B4 r. n# r
" w4 u+ M4 {. s5 K$ p4 r* G
9 ]4 W; [$ M" @) a1 ]
- [3 P- C# Q- H; X) `6.在“中断点”窗口的选择“内存”,去掉“读”打勾,只保留“写”打勾,“地址”填0x80097C00,“大小”是字节长度,填0x4,“条件”和“数量”留空暂时不管,再点击“确定”,断点添加完成;+ P1 o* G' o2 J
, j1 y; Z) q! P7 ]6 i
+ V6 o# E0 g4 ?1 M! B. b; |
1 g. M; l2 k; u, u7.回到游戏中,把宝石戒指卖掉后,程序发生中断,程序停在1bb31f0:slt r2,r5,r2一行;
0 k& t/ k; E4 C! y- U6 Z
/ x7 M+ \' [0 s; @9 P V# }4 ^# V. d3 X3 a
% T8 C' F/ e8 A( ~# O! z8.点击“文件”->“反汇编”,“地址”填0x1b31d0,“大小”填0x100,点击“确定”,另存为一个扩展名为txt的文件;* n# m7 i1 C" Z* h( W
! H$ e) G9 `+ s% G* y# o
# Q: H, j' f+ p3 q3 A
( i4 f7 {* Z- Y6 m" z7 V9.用记事本之类文本编辑工具打开刚刚另存为的txt文件,接下来开始分析汇编代码;( O" {$ I3 E0 R3 D& r4 t
( F. k1 ^+ F- \, x2 p1 ~
001b31d0: 3c05000f lui r5,0x000f ->把0x000f载入r5寄存器高位,r5=0x000f0000
0 v7 Z7 V$ H& w6 a5 _001b31d4: 34a5423f ori r5,r5,0x423f ->把r5寄存器的值和立即数0x423f进行逻辑“或”运算,结果存入r5寄存器,r5=0x000f423f" x2 A+ d3 x+ n( L7 l' @( e4 |: l
001b31d8: 3c048009 lui r4,0x8009 ->把0x8009载入r4寄存器高位,r4=0x80090000
$ \& u1 [3 p ]+ @1 A001b31dc: 24847c00 addiu r4,r4,0x7c00 ->把r4寄存器数据和立即数0x7c00相加,结果存入r4寄存器,r4=0x80097c00
( q4 U& H3 V# q/ o% ?1 u" ~! y4 p+ b001b31e0: 8c830000 lw r3,0x0000(r4) ->以0x0000为偏移量,把r4寄存器数据和0x0000相加得到地址的数据载入到r3寄存器
+ t( ~: H0 U' h% L/ U7 `; G001b31e4: 00001012 mflo r2 ->把lo寄存器的值传递到r2寄存器
0 ]% V$ {' }1 h001b31e8: 00431021 addu r2,r2,r3 ->把r2寄存器的值和r3寄存器的值相加,结果存入r2寄存器
7 J B( K- ?* L( D001b31ec: ac820000 sw r2,0x0000(r4) ->以0x0000为偏移量,把r2寄存器的值写入到r4寄存器数据和0x0000相加得到地址8 y% _' w7 w; A3 b
001b31f0: 00a2102a slt r2,r5,r2 ->把r5寄存器的值和r2寄存器的值比较,当r5寄存器的值小于r2寄存器的值时,r2寄存器的值设置为0,否则设置为1+ m) S2 S4 q- E+ B9 a6 L
001b31f4: 10400002 beq r2,r0,0x001b3200 ->当r2寄存器的值和r0寄存器的值相等时跳转到0x001b3200地址继续执行,否则继续
6 e0 n' w1 k7 h9 w! [001b31f8: 00000000 nop ->空指令
# o9 m, {- S/ u001b31fc: ac850000 sw r5,0x0000(r4) ->以0x0000为偏移量,把r5寄存器的值写入到r4寄存器数据和0x0000相加得到地址
- |: J. ~0 F1 V! K/ g7 L8 K5 f l& a, P4 r% Z/ w/ |4 p. X3 A+ ~+ q
10.根据分析,接下来只要把001b31f4地址的10400002 beq r2,r0,0x001b3200指令nop掉,就可以得到金钱最大,nop指令机械码是00000000。
4 G0 v5 N- {/ `5 _& Y5 k% G
* ~$ `) l4 w6 q8 u" Y1 Z' D3 V为什么要这样改呢?) g2 u$ k, e# D- D( r& I1 D
8 u$ x) j0 t8 t @( `
001b31d0: 3c05000f lui r5,0x000f3 [& m8 X: [" u, C( G6 \ j9 _
001b31d4: 34a5423f ori r5,r5,0x423f: V# ~8 V" F7 }% f; d" M {2 N
: v& g% h' q2 j- ~. x7 O+ H. U这两条是给r5寄存器赋值,0x000f423f换算成十进制是999999,刚好游戏金钱最大值是999999;9 V7 ]/ s, m4 Z* L$ A8 r
! l; M; E* a; H% f! _
001b31d8: 3c048009 lui r4,0x80096 b6 @2 H2 S; V
001b31dc: 24847c00 addiu r4,r4,0x7c00
3 `7 j5 B: P# z7 \' d; Y
( y6 g. K- K( M5 C+ m3 \7 O这两条是给r4寄存器赋值,0x80097c00刚好是金钱存放地址;
5 _1 Y% T+ n$ Y1 p& f/ D9 ~% ?& Y! `, E+ H3 X6 B( Z6 P
001b31ec: ac820000 sw r2,0x0000(r4)6 @4 ]4 N5 x6 P1 Z$ X) i# {0 T9 W
6 f9 x: A; N- N; p/ T这一条是把得到金钱数值写入金钱存放地址去,r4寄存器的数值就是金钱地址0x80097c00;9 Q2 f1 p. F9 q9 J! E
5 k+ ?) q# n \) i$ K
001b31f0: 00a2102a slt r2,r5,r2
. O- m: _; u+ k' {. @/ T; d" }001b31f4: 10400002 beq r2,r0,0x001b3200
* U6 l. N( n: I$ h- ~" \: t5 x3 n( q& @# j6 L) x; q
这两条指令是现在得到的金钱数值和最大金钱数值999999比较,当小于999999时就跳转到0x001b3200地址继续执行,否则继续执行;1 Q3 J" }1 @ V A+ k, {& H
# U4 \2 @# T3 m4 G001b31fc: ac850000 sw r5,0x0000(r4)
& W& E( ]& w1 E9 `
& `9 q+ t, U# C2 x这一条指令是把金钱最大数值写入到金钱存放地址去;
( {. {' [; i0 Z* p w8 j# ]9 K/ l2 G) y/ _! Z
把001b31f4: 10400002 beq r2,r0,0x001b3200这一条指令nop掉的话,无论卖掉宝石戒指多少钱,都会得到金钱最大值999999。
( p9 U7 O0 y* V$ f& ]4 y
- B* r2 _8 A% U11.用16进制编辑器打开Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 1).bin
B' a2 o* F5 V: t9 c( c% E" h6 F1 S, m: ~+ _
12.查找16进制数值,先查找0f00053c3f42a5340980043c,再查找0200401000000000000085ac
: e/ R4 e2 F% U! Y. {1 ]; f- k& {( y; X* }) \) l- [
13.在0f00053c3f42a5340980043c下面的0200401000000000000085ac就是我要找的汇编指令机械码;
: c5 d* ^3 U% \: ^( o, J9 }- q4 y9 H0 E
14.把02004010修改为00000000,另存为Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 1)HACK.bin文件+ @% k; B8 F. i) Q
( v- q+ \& F+ c3 x# z h5 y8 V3 B
% l& w; L" ^, h' o. U7 G8 e
15.用模拟器加载Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 1)HACK.bin,测试结果:卖宝石戒指得到金钱999999,修改成功。
' t1 h J- h0 J
. [5 t- J- q9 U. z, G- j: R6 Z
0 ^9 z1 ^; l) }: y$ ?$ ?
3 N) w. T( J& d5 h' q' w; ~* `16.要刻盘用实体机玩请先把Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 1)HACK.bin和Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 2).bin两轨数据合并成一个镜像,然后用ECCREGEN 1.4之类修复EDC和ECC,再刻盘用实体机玩吧。
4 _$ T$ N1 f, R4 m) ~
( U+ H1 R5 A" Y( m- X0 i% M4 A! }疾风之狼( E) o3 I5 Z: `( K- Q) x0 B
2025.10.11首发
' u% ~' W# |% s& M+ M- b2025.10.17更新
, `" l+ D8 ~8 }' U3 ^5 q |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|