签到天数: 2191 天 [LV.Master]伴坛终老
|
1.准备工具
7 ` @. ?7 I; e. r. g带调试功能的模拟器:pSX 1.130 x0 e; N" ?, x
一个16进制编辑器:很多,随意选一个自己喜欢的,本例教程使用的是winhex。
2 V8 |. ]* r$ X0 Z9 v5 [, M2 Z2 Q( O0 [! {MIPS汇编指令集资料:MIPS汇编指令基础.pdf(MIPS Assembly Language)* |# E* [% G w9 n
游戏ISO:月下夜想曲Rev 2版
+ m# g; [7 _; U7 v/ ^0 sAkumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 1).bin0 r" [1 N& C& e8 r/ O4 U& ]
Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 2).bin; I2 R5 Z5 Z- O. e2 I" f$ B" {
Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2).cue
0 {2 E- U9 L9 ] H; M# U6 z3 M9 R! I9 h; y; F
2.首先找到要修改的游戏金手指地址,我在emucheat提供的游戏金手指找到了。: O2 t: j1 h% N4 V7 `. g
[金钱无限]: y( z7 p, x0 L
ON=80097C00#423F;80097C02#000F
; O3 u/ {* F7 r" p1 W% Y# Q6 G. o, X+ ]2 ~
金钱地址是0x80097C00
$ D, j$ s8 S. D7 f7 H8 G, Z# Y2 J
3.运行pSX 1.13,“文件”->“插入CD镜像”,加载“Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 1).bin”镜像;1 Z! S4 l) [1 e. j+ ]6 F
7 u7 k( S3 h3 @' k* I' W( U
(要设置pSX 1.13手柄键位请选择“文件”->“设置”->“控制器”)
, z/ G4 v! }" f2 M S( Z' L8 H& l u
& N7 ]* k' d9 K9 `! r i# D" x4.游戏进行到藏书库的老爷爷处,进入“宝石壳却”界面,前提有一个宝石戒指;
" R5 w$ f1 ]5 x& B) [( [
/ j: A* [7 Y0 t3 H V3 t6 L: v3 M& q2 N0 Q* P; J3 I3 u
3 _3 k5 o# [1 i g( ]5.选择“调试”->“监视器”->“r3000”,在“中断点”窗口点击右键,选择“添加 Ins”添加断点;' j% E. ]+ @, y$ h3 w& _/ j
3 d& L& v* [& a/ ^, M j
9 m) @5 ^# _3 n Y# N
& a& |3 Z8 t2 @+ I, O, c ~. G/ h
6.在“中断点”窗口的选择“内存”,去掉“读”打勾,只保留“写”打勾,“地址”填0x80097C00,“大小”是字节长度,填0x4,“条件”和“数量”留空暂时不管,再点击“确定”,断点添加完成;
2 ^& O2 l/ U3 B) X) b3 S+ c6 g! P( M) A: x! k
' K7 ?/ }9 D" u
. B* p+ ^; H6 \9 b1 p3 J7.回到游戏中,把宝石戒指卖掉后,程序发生中断,程序停在1bb31f0:slt r2,r5,r2一行;
) V" v- b$ i2 N/ w1 E0 S5 E. S
4 a( l3 O) t1 x4 r: H- u1 s
9 h/ Y+ X; ^7 T4 O, l8.点击“文件”->“反汇编”,“地址”填0x1b31d0,“大小”填0x100,点击“确定”,另存为一个扩展名为txt的文件;+ k2 V E! `$ {" i: B" x
2 u$ c* a x6 [) u0 r% w8 R+ l1 G0 `
8 \# E8 J7 `# F, y* \" P+ [, s# k8 ]1 j/ F
9.用记事本之类文本编辑工具打开刚刚另存为的txt文件,接下来开始分析汇编代码;
* N+ {/ k! N! x) S6 o+ e
z* G4 k( e N# [1 f7 h+ |" u001b31d0: 3c05000f lui r5,0x000f ->把0x000f载入r5寄存器高位,r5=0x000f0000
( ]# N% A' t* i0 {, U4 G001b31d4: 34a5423f ori r5,r5,0x423f ->把r5寄存器的值和立即数0x423f进行逻辑“或”运算,结果存入r5寄存器,r5=0x000f423f
; U( i; v( i4 s1 I! n; s' k; w001b31d8: 3c048009 lui r4,0x8009 ->把0x8009载入r4寄存器高位,r4=0x80090000
2 y7 i! Z% v* W) u; o001b31dc: 24847c00 addiu r4,r4,0x7c00 ->把r4寄存器数据和立即数0x7c00相加,结果存入r4寄存器,r4=0x80097c00+ c# {1 h! F8 p7 i$ h* j. O7 [1 e
001b31e0: 8c830000 lw r3,0x0000(r4) ->以0x0000为偏移量,把r4寄存器数据和0x0000相加得到地址的数据载入到r3寄存器- [2 A+ F2 F% L1 Z& o. t! t/ p
001b31e4: 00001012 mflo r2 ->把lo寄存器的值传递到r2寄存器
; f: f1 I P* P3 ]. M6 Y% F001b31e8: 00431021 addu r2,r2,r3 ->把r2寄存器的值和r3寄存器的值相加,结果存入r2寄存器
. c9 p u% K0 K, T& h w1 g6 V001b31ec: ac820000 sw r2,0x0000(r4) ->以0x0000为偏移量,把r2寄存器的值写入到r4寄存器数据和0x0000相加得到地址
9 s1 G* u$ G! \( u001b31f0: 00a2102a slt r2,r5,r2 ->把r5寄存器的值和r2寄存器的值比较,当r5寄存器的值小于r2寄存器的值时,r2寄存器的值设置为0,否则设置为1
' o3 x; v, @: x# x c001b31f4: 10400002 beq r2,r0,0x001b3200 ->当r2寄存器的值和r0寄存器的值相等时跳转到0x001b3200地址继续执行,否则继续
$ q; G) z8 o+ O; r0 l, c4 \& w001b31f8: 00000000 nop ->空指令
& _7 D* U+ x0 D* w1 a001b31fc: ac850000 sw r5,0x0000(r4) ->以0x0000为偏移量,把r5寄存器的值写入到r4寄存器数据和0x0000相加得到地址
9 Q* L' {+ o8 U9 y: l; T# O- q/ ?) G. ?1 u) ^3 p
10.根据分析,接下来只要把001b31f4地址的10400002 beq r2,r0,0x001b3200指令nop掉,就可以得到金钱最大,nop指令机械码是00000000。
' d8 \: j% t7 R/ I, w5 y3 k$ p1 Q' e8 _9 X
为什么要这样改呢?. `2 T" D1 O, x- w
9 q5 G8 h8 S- m- A
001b31d0: 3c05000f lui r5,0x000f, B, o. D/ P6 z' i6 N# Z# ]
001b31d4: 34a5423f ori r5,r5,0x423f
+ g& l& n- Q. M' V1 n; m3 W* q: ~) b) h: C. p
这两条是给r5寄存器赋值,0x000f423f换算成十进制是999999,刚好游戏金钱最大值是999999;
* X5 _# ^5 H% `2 R3 o. r* f3 h) ^: {
001b31d8: 3c048009 lui r4,0x8009
0 H# ?) R) z6 ~+ r. \001b31dc: 24847c00 addiu r4,r4,0x7c00- Y/ X! O8 @- i6 a0 M' Z/ M2 h
9 p( J. X% \0 W
这两条是给r4寄存器赋值,0x80097c00刚好是金钱存放地址;
$ n1 B. [/ b0 L8 _
4 a1 W6 x$ [8 j: Q. t001b31ec: ac820000 sw r2,0x0000(r4)
1 i3 {( y. b; I$ N
- k2 \7 X* [/ T; ~7 M这一条是把得到金钱数值写入金钱存放地址去,r4寄存器的数值就是金钱地址0x80097c00;
; A ?! b3 _5 v# D1 W& O& b8 A% E5 ]) w% I; U6 a
001b31f0: 00a2102a slt r2,r5,r2
+ ~2 h' k& h ^2 J# l9 `/ Q9 f5 g1 S001b31f4: 10400002 beq r2,r0,0x001b3200
" ^6 x+ w7 L1 L" I ?9 a/ r. \+ J, g$ D( M E
这两条指令是现在得到的金钱数值和最大金钱数值999999比较,当小于999999时就跳转到0x001b3200地址继续执行,否则继续执行;1 n' l& ~1 o$ h
% j# `; Z' ~0 ~8 U3 G. A
001b31fc: ac850000 sw r5,0x0000(r4)
3 l& S, q: s2 R0 S5 A7 U' t- j& Q8 a
这一条指令是把金钱最大数值写入到金钱存放地址去;
0 h; h, m9 W8 O& J+ N" q# D+ t6 C! z9 f+ b& J) h* f
把001b31f4: 10400002 beq r2,r0,0x001b3200这一条指令nop掉的话,无论卖掉宝石戒指多少钱,都会得到金钱最大值999999。
" q7 A- R, N+ C% H3 ^0 {
4 q# e9 z+ [( a9 T11.用16进制编辑器打开Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 1).bin
3 V! W0 W2 E0 s4 y9 z2 E! Y4 ? I: j, U3 o
12.查找16进制数值,先查找0f00053c3f42a5340980043c,再查找0200401000000000000085ac
5 n1 U( U5 |; s8 r6 L* G# |6 Y- ?" i4 m
5 Q! j+ F2 h+ q- V+ J+ @' V13.在0f00053c3f42a5340980043c下面的0200401000000000000085ac就是我要找的汇编指令机械码;
( @7 n* p8 Z/ L, Z/ b5 |* y
$ i% W, d" }6 a: [6 D" v6 c14.把02004010修改为00000000,另存为Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 1)HACK.bin文件0 Q4 ~ c5 Z, A" L( s
9 a5 a& T9 ^5 l' E- B2 F" o3 V% _
5 G' A b* J+ e# q. B6 m
, l4 l) A$ Y- k& W8 U15.用模拟器加载Akumajou Dracula X - Gekka no Yasoukyoku (Japan) (Rev 2) (Track 1)HACK.bin,测试结果:卖宝石戒指得到金钱999999,修改成功。
" [; T7 H+ i {. x1 o( U; G& c4 \1 s5 D# I- |$ J: E. ^3 H; A
* y; ` ?1 [: i
1 p( q" J3 h" D4 E6 }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,再刻盘用实体机玩吧。
: e* ] k8 f* t) d$ X/ Q, | I3 l+ J' m
, X0 A/ M$ j8 a) B) d& b3 [" w疾风之狼% `$ C; K, i/ ~: z Y! q7 ?3 s( i4 z
2025.10.11首发0 S# B. O! f( b. p, X9 V% \5 V
2025.10.17更新 5 C5 v; [4 ]+ x% n
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|