EMU618社区

 找回密码
 立即注册
搜索
查看: 884|回复: 3

[原创HACK教程] FC自动演示修改教程

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
' }. G0 g1 B! F2 m$ l8 j. T& s% |$ ~+ d2 t
FC自动演示修改教程
, N+ v  y+ r7 m! b/ Q: `作者:火焰烈旋风
  q: A; U" P" a1 B. L& a: y工具:FCEUX中文版(www.9553.cn搜FCEU即可)
; U0 a+ [. C0 ^% Q7 O1.找按键地址:0 c: Y1 z; W# u% J6 R) _9 W
    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.- w. W0 p& e# _3 {
2.找演示时按键的数据来源:
) _6 `; ?' W$ F    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
. `5 w; l5 `; ?- F9 ^/ L07:C38F:94 F1     STY $F1,X @ $00F1 = #$01* V1 L4 n  I! f1 v+ W
07:C391:94 F9     STY $F9,X @ $00F9 = #$006 m+ B1 p; f4 g, f) L4 Y
07:C393:CA        DEX! t6 X* z# W8 L2 i
07:C394:10 F0     BPL $C3863 s4 L" L  Q( W
07:C396:60        RTS
$ E/ A8 J5 S/ Z2 F( P, ]* H2 o我们点击"运行"左边的上拉按钮上拉,看到如下指令:
% f/ G; X$ p; G3 [6 |07:C378:A5 1D     LDA $001D = #$07
$ d) ~4 T/ D. R( z3 O) Q3 q; `07:C37A:29 04     AND #$044 n$ [$ _" u2 o! P
07:C37C:D0 06     BNE $C384+ W) Y& ~+ f7 ]: q! H7 {0 h
07:C37E:A5 04     LDA $0004 = #$00( v  ~& }4 I; H* ~( Z
07:C380:05 05     ORA $0005 = #$00
2 E- u4 k/ l& {8 ?07:C382:85 04     STA $0004 = #$00
% o( F! K. H5 D07:C384:A2 01     LDX #$014 w+ |& g9 ^: V. C
07:C386:B5 04     LDA $04,X @ $0004 = #$00
7 [/ `/ o7 L( H07:C388:A8        TAY
7 [$ F3 _3 I9 b9 E6 [- e07:C389:55 F9     EOR $F9,X @ $00F9 = #$00! @/ N3 S3 d$ K3 N
07:C38B:35 04     AND $04,X @ $0004 = #$00
6 h2 r6 j( n- f0 d! D! f- B07:C38D:95 F5     STA $F5,X @ $00F5 = #$00' y; O8 n) k' W
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
: I5 _, Q' M! t8 {  U7 W0 z07:C391:94 F9     STY $F9,X @ $00F9 = #$00
. N8 b7 q0 x4 C* E3 k: [' n07:C393:CA        DEX
1 F$ H# r$ q5 h$ w2 v1 H1 e: O8 o/ m07:C394:10 F0     BPL $C386
- h* u7 r" Y/ j07:C396:60        RTS7 C  _9 x/ g8 n+ B/ M
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:, t+ ]5 Q( L9 q' ?
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
9 G) F0 Y( S5 I/ @05:B3A5:A5 2E     LDA $002E = #$C8" v$ e4 z: R+ w& Y$ H+ h$ p2 g
05:B3A7:C9 50     CMP #$50
7 r( ~  e# \! ~1 W05:B3A9:90 20     BCC $B3CB& D( S- K2 Z- J; A; U
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00+ O9 `( l6 D9 M4 d$ W/ q% M
05:B3AD:29 0F     AND #$0F9 H5 D( ~- Z7 \& q
05:B3AF:C9 01     CMP #$01( p( e* O# K) I, [2 K  t# j% p
05:B3B1:F0 04     BEQ $B3B77 Z5 \- p. }1 u
05:B3B3:C9 04     CMP #$044 y( ~8 ]4 i! ?$ Z
.........
. O/ o1 c. l; E/ F% I' y6 y我们点击"运行"左边的上拉按钮上拉,看到如下指令:
4 [5 k' s* ?5 T# [2 \  c05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
& \$ b' h3 t  N& a1 o05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01% D4 D& Z0 X9 T! v1 q. n. i
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
0 {3 D4 |0 v) G* q05:B3A5:A5 2E     LDA $002E = #$C8
1 z. [/ M  V# `$ A5 p) _5 a05:B3A7:C9 50     CMP #$50+ x* G3 A, r/ h" R+ Z% G
05:B3A9:90 20     BCC $B3CB7 W) @' M  R6 r7 E3 a3 Z' ]) ]
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
* ]+ R2 z, w2 ^- |6 e05:B3AD:29 0F     AND #$0F3 _# l2 e1 \5 D; l) Z
看到. Y7 g3 ]% r9 f. Q' }  O3 D3 Z. l7 d
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01! l  O. q! J; H& G; M; i4 o! z
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
; I8 n& A  u/ g5 P" q5 H1 H05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00& l; `  p( x$ {. }0 G0 H$ `* o" \
没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.; @6 D+ _' T9 W3 v/ X
    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:" q. `5 v/ h# I; P) P1 m
05:B392:95 5C     STA $5C,X @ $005C = #$01
' M& u, V- ?, P; J05:B394:C8        INY
/ H8 Y+ x5 d) d" z: R/ s% J05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$092 }+ E" E' C, m8 X
05:B397:95 5A     STA $5A,X @ $005A = #$00& w7 V3 L8 n( W7 w% m% p5 z* l
05:B399:C8        INY
& k7 G) F, }3 X  V- N+ z' _  K05:B39A:98        TYA/ l& g4 B& M8 C
然后我们再上拉,得到如下指令:
5 t" d0 D2 M8 J6 T5 M05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$092 n5 T! @$ t) ^/ G6 q/ L3 Q6 e# ?
05:B38E:C9 FF     CMP #$FF
2 I. N5 ?  H, J05:B390:F0 3D     BEQ $B3CF' }% u( {8 f6 t8 _* w: ?# g5 I- Q% p
05:B392:95 5C     STA $5C,X @ $005C = #$01
0 K6 o* E  q0 f2 ^- g0 S% F$ V05:B394:C8        INY
! o6 n# ?6 {- X% o8 R05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
3 m2 r+ t3 Q+ h05:B397:95 5A     STA $5A,X @ $005A = #$00  M: F& ~9 f4 }5 @! \' h7 y
05:B399:C8        INY0 M/ a/ E. x/ u. i( w
05:B39A:98        TYA0 F5 P- ]# u& S" P1 n
看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$099 p/ H8 L& Q0 J$ B# S0 p2 V; @
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近., k: y+ |9 g  K4 d! M' @: m4 P
3.修改演示:: a" r6 C7 C; t3 c; N5 p7 I
    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了., y. i; y. f7 I8 {8 n* U7 G* N
    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:% ]" ], m/ t4 `7 i- Y
打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:3 r# G2 K2 M/ p
05:B392:95 5C     STA $5C,X @ $005C = #$00% W; `! j. l, r. c6 k! E( k& K
05:B394:C8        INY
9 W( m; r9 a9 I% E8 W# w05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
! M5 u4 ]7 u6 P/ S* i05:B397:95 5A     STA $5A,X @ $005A = #$00
' ~) Y: r( L: ~$ B% r9 i. c05:B399:C8        INY
3 R* L! I2 y. ~05:B39A:98        TYA
1 Y2 L7 |3 O. q' c$ W我们上拉看到了:, U% R  ?4 A! c. n7 o/ a
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$009 }# I* ~  o2 G% V, C$ R$ ^* k/ q
05:B38E:C9 FF     CMP #$FF
3 ^9 b/ A; F, B# A+ D; C1 e05:B390:F0 3D     BEQ $B3CF) X+ G( o7 {' U1 }8 K$ e6 D: w
05:B392:95 5C     STA $5C,X @ $005C = #$00
; _8 y+ x* J  C2 B2 o. Z05:B394:C8        INY5 u: B# K; Z% J+ l& `
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
0 }) E3 S! T9 y( T05:B397:95 5A     STA $5A,X @ $005A = #$00
9 E: O7 ^; c6 z! [% }05:B399:C8        INY' Q. C, n5 {* D" J8 U/ r; Z  K- X
05:B39A:98        TYA
3 g- R3 p! g- m6 b4 o+ S9 f# t看到1 E. w8 e$ b4 {. f8 S3 G" V! B2 z# W
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00# r7 R6 `# y% o; {3 C
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.+ ?$ R% q' K8 {3 {: Z. B
说明:演示按键地址的结构,以开始的00 21 01 03 00 0E 01 3D 04 06 05 33 00 0E 04 0A 05 01为例:第1个00是按键数值(无行动),第2个21是指按键数值21前的按键保持21(时间),第3个01是按键数值(向右走),第4个03是指按键数值03前的按键保持03(时间).......以此类推,判断根据:
9 @0 M. k7 O8 C05:B371:B5 5A     LDA $5A,X @ $005A = #$7F
5 _& }! T+ L2 |% Y7 \: M05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)( r4 p7 G5 g8 S# ]
05:B375:A5 30     LDA $0030 = #$00' y6 x4 D( U$ l2 z) d! A* i2 q# E
05:B377:0A        ASL" ]# x8 r5 v9 S1 N9 F
05:B378:0A        ASL
) O: T, T4 |' Q, h' ^4 F' p0 X9 y$ P05:B379:85 08     STA $0008 = #$29
, |4 V6 u: d+ v+ n# E  _05:B37B:8A        TXA
( N2 |; P0 |1 E4 G05:B37C:0A        ASL" Q; m* n% V; E3 o. ?
05:B37D:65 08     ADC $0008 = #$29$ U0 q- _6 n- `  i
05:B37F:A8        TAY
0 e8 r, i" t( y- e9 J05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4
. ?& Y# |; A; U% q5 T/ R8 W# ~05:B383:85 08     STA $0008 = #$29
% r8 C- Q. u, d05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC
4 L3 X: M: R" i2 p" _; m/ K% S05:B388:85 09     STA $0009 = #$B2
# C# V9 P1 U4 z+ |" U05:B38A:B4 5E     LDY $5E,X @ $005E = #$02
! l( r. f+ |: d" R1 T5 L8 _05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10
" Y, g3 e/ \3 m# H4 W. p  a05:B38E:C9 FF     CMP #$FF
$ z4 `* T7 z/ A! n  T7 V4 M05:B390:F0 3D     BEQ $B3CF7 d( i; J, @1 N
05:B392:95 5C     STA $5C,X @ $005C = #$00
3 F# n( |- C' ~3 I+ A; ?2 k05:B394:C8        INY
% L4 I. V* t' {3 M" H, M! B05:B395:B1 08     LDA ($08),Y @ $B22E = #$10
3 a) E, i  O$ W  x/ e3 C05:B397:95 5A     STA $5A,X @ $005A = #$7F
7 Z# v2 T  j% U6 V( u' C$ [05:B399:C8        INY2 z# p6 Y$ Y- Y# o: P; W# E6 y
05:B39A:98        TYA; S4 j' o* M8 `" l9 H
05:B39B:95 5E     STA $5E,X @ $005E = #$02
' M; b) p( a3 N1 ?% T% Z5 Y4 f05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)
" ?, Z; O) Q/ S; D05:B39F:B5 5C     LDA $5C,X @ $005C = #$00: b& p( C2 Z6 G0 `6 ]8 F. |
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00
- B1 p" N% S& H: `4 V7 s2 [" F05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
( Z+ F7 |  O, u1 S. s. K+ V6 {; n4 ]# e  e' i2 j( H5 v/ ~
由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
9 r+ M) i% Z. g4 z  j3 {" ?可以下载玩一玩
( ^( h3 v) n2 ]. g  q/ Lhttp://pan.baidu.com/s/1bnE0AwZ

签到天数: 1310 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。- R3 ^$ M  p: |) p, t; s& Z- o
首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。
7 C/ l( q2 q7 T1 ^) |2 j后来尝试其它修改,但是偶尔会造成花版或者死机。4 p' j; s, G+ B9 i; e4 d' t
深入研究,发现要以演示模式通关,需要做的事情还很多。" o# _  {8 n; a
因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: wyw 被钱袋砸中进医院,看病花了 3 个 柠檬. 幸运榜 / 衰神榜

签到天数: 112 天

[LV.6]常住居民II

发表于 2015-10-16 08:50:07 | 显示全部楼层
厉害啊,这个真厉害

签到天数: 9 天

[LV.3]偶尔看看II

发表于 2015-12-21 10:43:36 | 显示全部楼层
啊哦,你来晚了,分享的文件已经被删除了,下次要早点哟。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|国治模拟精品屋 ( 沪ICP备15012945号-1 )

GMT+8, 2025-12-17 06:36 , Processed in 1.097657 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表