签到天数: 2105 天 [LV.Master]伴坛终老
|
1.准备工具
& y) ?; D. p# v# H带调试功能的模拟器:pSX 1.13 Y" ]* I$ ~1 d9 n$ N. `
一个16进制编辑器:很多,随意选一个自己喜欢的,本例教程使用的是winhex。
' z8 V7 Q' h. J8 \MIPS汇编指令集资料:MIPS汇编指令基础.pdf(MIPS Assembly Language)
5 v5 ^. N- l* I, g# h5 T. \5 ~- `游戏ISO:月下夜想曲Rev 2版2 l$ Y9 v1 u {9 W, Z) W7 y
Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 1).bin: P. Q; b- ^* A# F( k5 _7 o2 D: I
Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 2).bin( _; d* D3 X3 G/ D: _0 g6 w
Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2).cue
8 y+ q3 ~8 d3 K8 z4 v$ _+ k# g9 r
2.首先找到要修改的游戏金手指地址,我在emucheat提供的游戏金手指找到了。. l) O! h e6 M6 j# M
[金钱无限]' h3 I, e5 C/ I0 b
ON=80097C00#423F;80097C02#000F* k+ b' X J6 B1 F
3 U* Q7 V/ P& B* T( V2 w j金钱地址是0x80097C00+ Q/ D) I a# `' i6 X2 z& v. A% ^
$ Y2 l: L* ~/ e6 V# T" j6 U3.运行pSX 1.13,“文件”->“插入CD镜像”,加载“Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 1).bin”镜像;
. P" q/ L C, |1 [2 `: p0 b4 k% V. @2 l
(要设置pSX 1.13手柄键位请选择“文件”->“设置”->“控制器”)" S+ b; G: Y3 K9 p' Y7 [
$ c9 W; ^: L2 p( G3 |! t9 {4.游戏进行到藏书库的老爷爷处,进入“宝石壳却”界面,前提有一个宝石戒指;* q9 C9 i+ k" i) a0 m
" \& d" X+ ~$ S. _( `, H0 Q: Y; F
1 v; `5 `& u2 f0 y$ H/ k
5 S) _8 m& X( |* S& m: h4 n* N/ U5.选择“调试”->“监视器”->“r3000”,在“中断点”窗口点击右键,选择“添加 Ins”添加断点;( `' G) [$ N/ I
% w# `+ @( q# R# Q2 c# p& }
5 H( A2 L$ N3 X# r
4 Y- \* r3 z. J5 X1 i$ }2 B/ \
6.在“中断点”窗口的选择“内存”,去掉“读”打勾,只保留“写”打勾,“地址”填0x80097C00,“大小”是字节长度,填0x4,“条件”和“数量”留空暂时不管,再点击“确定”,断点添加完成;4 a& t+ A( J: y1 r+ N& _' Z
9 M0 M& t0 E! w) Z C; c" Z
& N( F$ J- Y4 a2 Y" P% ? j9 p* w2 \$ y* S1 E( o! D6 v
7.回到游戏中,把宝石戒指卖掉后,程序发生中断,程序停在1bb31f0:slt r2,r5,r2一行;6 q) h% N g( F7 H8 R8 n* `# {$ D
3 p7 a; [* C6 O3 `9 f
6 a, a% i0 ~! [0 E5 _! m t
/ ^6 K% K* m7 n* V2 O- K9 G, l
8.点击“文件”->“反汇编”,“地址”填0x1b31d0,“大小”填0x100,点击“确定”,另存为一个扩展名为txt的文件;( [( [1 b4 W7 R% N
4 c' |5 h6 }2 S8 b
' z$ C0 k# s) k
3 X# E( T) e* T: k: \7 u5 N9.用记事本之类文本编辑工具打开刚刚另存为的txt文件,接下来开始分析汇编代码;
, }6 v: {2 s( [/ k7 Q8 Z, g; W: ?0 L, R1 i( i
001b31d0: 3c05000f lui r5,0x000f ->把0x000f载入r5寄存器高位,r5=0x000f0000
- B! B# L6 p- H( V6 I. B001b31d4: 34a5423f ori r5,r5,0x423f ->把r5寄存器的值和立即数0x423f进行逻辑“或”运算,结果存入r5寄存器,r5=0x000f423f
/ m* Y% c7 J6 C001b31d8: 3c048009 lui r4,0x8009 ->把0x8009载入r4寄存器高位,r4=0x80090000) i4 E" a1 m |6 e% U$ B' c8 T
001b31dc: 24847c00 addiu r4,r4,0x7c00 ->把r4寄存器数据和立即数0x7c00相加,结果存入r4寄存器,r4=0x80097c00
9 ?5 e# |5 q9 k5 M; _6 J! W001b31e0: 8c830000 lw r3,0x0000(r4) ->以0x0000为偏移量,把r4寄存器数据和0x0000相加得到地址的数据载入到r3寄存器# b3 _$ s% A/ B# {1 E) r
001b31e4: 00001012 mflo r2 ->把lo寄存器的值传递到r2寄存器$ M x$ [$ ~8 }" b
001b31e8: 00431021 addu r2,r2,r3 ->把r2寄存器的值和r3寄存器的值相加,结果存入r2寄存器
$ h/ L6 t" B; Q [% J001b31ec: ac820000 sw r2,0x0000(r4) ->以0x0000为偏移量,把r2寄存器的值写入到r4寄存器数据和0x0000相加得到地址
! I: P( p% ~; x! `5 ^; R7 p! v001b31f0: 00a2102a slt r2,r5,r2 ->把r5寄存器的值和r2寄存器的值比较,当r5寄存器的值小于r2寄存器的值时,r2寄存器的值设置为0,否则设置为1
5 X R, r/ z S8 S/ V- Y1 F001b31f4: 10400002 beq r2,r0,0x001b3200 ->当r2寄存器的值和r0寄存器的值相等时跳转到0x001b3200地址继续执行,否则继续0 U" X7 z# X) n5 S/ l9 Y* F
001b31f8: 00000000 nop ->空指令+ Q" E U9 Y) i# z6 c, E+ }
001b31fc: ac850000 sw r5,0x0000(r4) ->以0x0000为偏移量,把r5寄存器的值写入到r4寄存器数据和0x0000相加得到地址
5 X; K @& g: t8 g5 b* Z! q3 B
10.根据分析,接下来只要把001b31f4地址的10400002 beq r2,r0,0x001b3200指令nop掉,就可以得到金钱最大,nop指令机械码是00000000。
: S* j& Q7 n' W0 }1 d+ ~8 y% }, L5 x' r$ j } N5 `% Y r, [$ |9 E) T
为什么要这样改呢?
+ n7 [2 ^2 k% ~9 k; d) |1 k
2 \, X% R0 [( b7 y/ ^# Z001b31d0: 3c05000f lui r5,0x000f& h8 j1 n# ]) V0 |/ G, P
001b31d4: 34a5423f ori r5,r5,0x423f7 M3 H4 i4 n+ K( T; [ A
Y# u' ^7 c4 v. Y8 K这两条是给r5寄存器赋值,0x000f423f换算成十进制是999999,刚好游戏金钱最大值是999999;
/ x& P) I; V; G6 Z' `3 s. g
, [* v2 a" `+ a% H001b31d8: 3c048009 lui r4,0x8009
, t) ~3 h- ~) y. d001b31dc: 24847c00 addiu r4,r4,0x7c004 b; u6 s4 p; }: o
5 z8 P( _$ {, b3 Q0 {
这两条是给r4寄存器赋值,0x80097c00刚好是金钱存放地址;+ j+ v! p) S4 D
+ B: T) ] m4 o2 z* T1 c001b31ec: ac820000 sw r2,0x0000(r4)8 B- N6 e' l7 U( M
6 R- O- V7 @5 L: Z% N0 y* ^" S
这一条是把得到金钱数值写入金钱存放地址去,r4寄存器的数值就是金钱地址0x80097c00;2 m: A2 r" ~, |6 c1 `& i0 ~
* ?/ t y. q5 b+ E# \* p/ p" t1 x% H001b31f0: 00a2102a slt r2,r5,r2& s- C9 ~; w* z$ b& Z& a
001b31f4: 10400002 beq r2,r0,0x001b3200( i' G- e5 S, s4 _/ J' d0 d! t
- e0 k/ \' k* ], h2 C' b8 A这两条指令是现在得到的金钱数值和最大金钱数值999999比较,当小于999999时就跳转到0x001b3200地址继续执行,否则继续执行;
% K3 _" t/ }, _2 w9 G3 B! T$ n, `0 v/ x, Z
001b31fc: ac850000 sw r5,0x0000(r4): X" X' ]7 T# q; _9 ^" R c
4 C7 `9 M" O7 J4 m这一条指令是把金钱最大数值写入到金钱存放地址去;( W0 p% ^$ q$ C& w, o5 [ c
* U+ z8 a# C4 x% ^5 Q5 G
把001b31f4: 10400002 beq r2,r0,0x001b3200这一条指令nop掉的话,无论卖掉宝石戒指多少钱,都会得到金钱最大值999999。
( C& r4 K. Q* Y4 B1 X2 Z9 R# o9 ?, |/ t+ ^* x+ N, I5 Y j& P
11.用16进制编辑器打开Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 1).bin$ p7 T C" k! N! U7 `
. y% r5 K3 N" g1 g
12.查找16进制数值,先查找0f00053c3f42a5340980043c,再查找0200401000000000000085ac
7 b Y+ k2 t6 A4 B' k
( Z7 m: ^& Y% {( U; L13.在0f00053c3f42a5340980043c下面的0200401000000000000085ac就是我要找的汇编指令机械码;
8 Y6 b: Y+ ]0 D5 ~4 L& R( M7 a
0 A; C$ ~* S) g8 i8 X# z14.把02004010修改为00000000,另存为Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 1)HACK.bin文件
8 q# E6 N/ v$ F2 v. U! o
+ E# Y6 |. x$ @' J2 c
" y$ @ E7 y& }. G9 z3 a' P8 y" H l R. h) F
15.用模拟器加载Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 1)HACK.bin,测试结果:卖宝石戒指得到金钱999999,修改成功。
3 }. d8 U6 s* y1 E
' L7 s+ G; O6 Y7 l2 q. H' A# ]3 l! H* D9 n0 N
% }) f- ]; i! Q' _8 A) i
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,再刻盘用实体机玩吧。. r6 a( W7 t9 { g4 P
$ \! y( W; d3 e1 K) m. L" v
疾风之狼
4 a$ _; L) ?! U7 \# Q" G5 O2025.10.11首发
6 X6 k0 E3 }3 i+ G6 u* Z A2025.10.17更新
2 m7 l- o |+ }9 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|