EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑 9 X4 [# w, l! _4 C! r* D
* n/ Z3 f  ?2 ~) ?  a
FC自动演示修改教程
# G8 Q8 e* H& ^4 ^; y2 U2 A作者:火焰烈旋风
- D4 L) J/ }6 Z1 ^工具:FCEUX中文版(www.9553.cn搜FCEU即可)0 D7 s, V0 m; P  F1 H& E
1.找按键地址:' u* `: |) h- J% o) e/ d5 @/ y  I. u4 _  A
    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.) F3 g4 m5 X" q! I% H
2.找演示时按键的数据来源:! f- l3 Y5 r) M
    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:6 Q7 d5 d/ f+ E  ^  [1 s7 l
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01! ^- @" H6 b: C6 C! H# V$ i
07:C391:94 F9     STY $F9,X @ $00F9 = #$00
: W$ v9 t, U* ^3 o3 k" i07:C393:CA        DEX
1 U4 j+ B$ x5 [' O9 l07:C394:10 F0     BPL $C386  F) A. ~" K2 U2 f& M
07:C396:60        RTS- {( f- |9 O7 \# u9 W8 X# M- M
我们点击"运行"左边的上拉按钮上拉,看到如下指令:  H4 Q, k$ W6 J7 b# b
07:C378:A5 1D     LDA $001D = #$07& ~+ ^6 T8 R8 N3 b
07:C37A:29 04     AND #$04
' H8 a! m1 ?4 W' j07:C37C:D0 06     BNE $C384
/ F! _" A$ x, s* X7 _) h07:C37E:A5 04     LDA $0004 = #$007 d  l6 q$ |2 q) R* D7 f3 s
07:C380:05 05     ORA $0005 = #$00% L5 Q5 W. `0 O/ D  ]! m  Z& ]
07:C382:85 04     STA $0004 = #$00# |5 k# _5 F) g
07:C384:A2 01     LDX #$01
- A9 Z2 p& |; w2 j* H9 e07:C386:B5 04     LDA $04,X @ $0004 = #$00
! x! c' W7 \' A  u& w8 \% V# s07:C388:A8        TAY
; L/ F; e9 }! Q# p" M07:C389:55 F9     EOR $F9,X @ $00F9 = #$00
3 |, p9 x" w! |6 M* R6 C8 E! k6 c  b07:C38B:35 04     AND $04,X @ $0004 = #$00* E; D7 C) x6 ]" s
07:C38D:95 F5     STA $F5,X @ $00F5 = #$00) C$ m& \" g6 x5 |
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
( z  Q3 J- W' x, Z, n: t07:C391:94 F9     STY $F9,X @ $00F9 = #$00
- M. a. H# O+ v1 x. ?7 n& x07:C393:CA        DEX/ p' v( n  X7 G/ M8 V
07:C394:10 F0     BPL $C386- E+ G6 w! y8 K: }( _* F
07:C396:60        RTS
/ K, W  D  @3 m+ C, V8 T; ~* \" Z由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:
; L5 Z) K# k& F- x( r05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00/ o$ J3 M9 r& s, w% M# x  |, V
05:B3A5:A5 2E     LDA $002E = #$C8
) C2 {6 s9 K, M8 O; J! S05:B3A7:C9 50     CMP #$50) w* T2 N6 `( A/ `* L4 @, c, j& B
05:B3A9:90 20     BCC $B3CB3 j' I' @/ K3 @, b
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
9 ?9 k, H" N$ m1 J7 U) W05:B3AD:29 0F     AND #$0F
3 r* u9 ^8 \% H6 O$ @9 M4 S05:B3AF:C9 01     CMP #$01
6 B! ^0 C6 b/ m$ B3 v3 o; x" E5 ~- T05:B3B1:F0 04     BEQ $B3B7* J# q, r5 a1 J4 ?
05:B3B3:C9 04     CMP #$04% ~# u6 ?( n- o7 e5 F+ g# M& B! O
.........' F% e/ D; y6 [/ b$ \  S0 `
我们点击"运行"左边的上拉按钮上拉,看到如下指令:6 K8 M0 R4 _( M, _0 ~9 P
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
+ r/ ^' Y" ~! F9 P- O05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01& b+ ~0 Y$ K! K) y5 Z
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00+ A0 h) E$ i- e2 k4 P8 d
05:B3A5:A5 2E     LDA $002E = #$C8( B$ n; _" @7 }) N1 h/ [6 E
05:B3A7:C9 50     CMP #$50. L' Z2 B5 A0 a3 ~
05:B3A9:90 20     BCC $B3CB
7 X  j0 ?! `2 \2 {6 n# q05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
7 y; v: o9 Q$ R6 `05:B3AD:29 0F     AND #$0F  S3 P( \8 y. N2 k8 i  g
看到
$ {+ ~. z+ s& i9 M" p$ e05:B39F:B5 5C     LDA $5C,X @ $005C = #$01( N2 Y4 U+ N1 m' |
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$011 i6 u8 G/ r4 P9 z3 R
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00# e# n, E( G' q$ ]! E' g
没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.
9 \# ]: O; N- g/ Q& N) Z    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:0 p( I- a: u0 z4 I9 t0 {  p
05:B392:95 5C     STA $5C,X @ $005C = #$019 X2 t* E( L2 B) \+ B4 |/ p. f
05:B394:C8        INY8 J) h5 v4 @# g0 H) o5 d* F
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$099 G0 l/ K4 S& w8 T
05:B397:95 5A     STA $5A,X @ $005A = #$004 W! V8 T' d' j# o
05:B399:C8        INY2 {# C$ V/ A3 `! e! F. e
05:B39A:98        TYA
" q* }* f/ ?2 Y. c# Q然后我们再上拉,得到如下指令:' E* Y. C7 q  I1 K
05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09" [& O7 B: g$ }' e9 n+ ?  m7 l0 ?
05:B38E:C9 FF     CMP #$FF$ z: O, f7 ~* q/ O
05:B390:F0 3D     BEQ $B3CF) L  a5 t7 X3 t2 m! i$ F5 y
05:B392:95 5C     STA $5C,X @ $005C = #$01
2 t4 s% E" t* n0 S05:B394:C8        INY* ^5 d0 r7 m+ ]1 t
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
# N" R% x# s0 P2 R' l  V+ S05:B397:95 5A     STA $5A,X @ $005A = #$00
6 L5 h1 ?: _, M9 v. }( ]0 N% d( ?( g05:B399:C8        INY; x. ]! b; C; G! s# m/ D  m
05:B39A:98        TYA
( N0 e$ t/ i1 Z, N7 g, V5 _看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09+ M- E3 J" w2 c9 L7 U: U5 k
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.8 x) N, _, O# V1 S- A5 F
3.修改演示:0 N" M. N8 ?) R" K5 F4 W" ]
    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.8 r. s& A. e/ {! j* ^0 Z
    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
: I7 O# W$ y; F1 ^打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:& z8 }) w6 u5 l+ a7 W2 x
05:B392:95 5C     STA $5C,X @ $005C = #$00! d5 K8 _% h" \, J! b
05:B394:C8        INY7 C4 d  g* j' A- c, a# f7 [; Q
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
5 `- S/ Z4 z2 r- p, F' }+ Q) G05:B397:95 5A     STA $5A,X @ $005A = #$00. P' v4 o4 N5 d5 W% b$ Q
05:B399:C8        INY8 b6 `! k  u# V  C
05:B39A:98        TYA3 s. ?6 o. w  o
我们上拉看到了:# c4 {  o9 Y5 E: [8 J6 e
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
# j. h8 }; u$ x! o  q05:B38E:C9 FF     CMP #$FF) w# U5 i# P: H
05:B390:F0 3D     BEQ $B3CF
! t- e0 E+ N! ?05:B392:95 5C     STA $5C,X @ $005C = #$00! b0 h  d9 N3 ?, ]' f9 z; _5 E" N" b
05:B394:C8        INY1 w/ }  U% G1 l+ h
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$008 h5 o/ ]7 W, s# c$ t* ~
05:B397:95 5A     STA $5A,X @ $005A = #$00
* b5 j! I8 d+ X" a. J7 M" r3 \2 G05:B399:C8        INY
  z$ Y6 Y0 g8 ~9 A6 `8 C* K05:B39A:98        TYA
2 H0 N5 g  ?' G7 ~3 d看到  N6 h* Q; q- i1 Q' q- d
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
# Z4 v. y8 t# l& {. ?没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.& W* P! F4 Z8 i1 F; C- g$ J
说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:
& R  E' l; C& ?; i, N8 L05:B371:B5 5A     LDA $5A,X @ $005A = #$7F
( e" E7 G( k0 H, [& J' e05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
/ @/ q4 d, ~- i$ X* Q05:B375:A5 30     LDA $0030 = #$00  x/ E" N- h7 ~, B1 D; r! F/ o$ B. K
05:B377:0A        ASL* h% V$ e2 e5 P8 u- G9 P* n1 q' q
05:B378:0A        ASL: I2 x5 e2 l/ Z) k- L4 F  B
05:B379:85 08     STA $0008 = #$29
/ H4 o  w# ]) ]* G2 \2 M0 g05:B37B:8A        TXA& i# s" F, S% x2 y% u8 ^
05:B37C:0A        ASL4 R6 `+ L* f) }% R) }6 V- ?
05:B37D:65 08     ADC $0008 = #$29
. ]+ z/ K0 d2 ^" H! X% x05:B37F:A8        TAY
2 y3 G. k. |* e5 o7 u' {05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4/ [: s- G& g$ |/ [3 V
05:B383:85 08     STA $0008 = #$29$ Q* G  g$ z2 j0 f' l; [
05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC
" \& F; S) X/ Q, [05:B388:85 09     STA $0009 = #$B2
" u" y( T1 l, {' E( H  A05:B38A:B4 5E     LDY $5E,X @ $005E = #$02
9 \* e7 X$ @$ R$ A05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10
; E9 S( a& y5 Y$ R+ y. U' n' u05:B38E:C9 FF     CMP #$FF0 s8 I2 ^5 i* w. ~
05:B390:F0 3D     BEQ $B3CF% K, K0 n1 h* C( @! {/ ]7 R8 z' G
05:B392:95 5C     STA $5C,X @ $005C = #$00
. q  O0 W, n4 }; s; z9 v05:B394:C8        INY2 W. i. c5 r8 B, |) X8 c5 i
05:B395:B1 08     LDA ($08),Y @ $B22E = #$10
- v! e' R. b1 Q2 d" F3 N05:B397:95 5A     STA $5A,X @ $005A = #$7F5 F" r; e3 h3 Z
05:B399:C8        INY5 l& I8 U& s( y' Z  ]6 s
05:B39A:98        TYA' g% P, z1 ^4 a8 v2 V
05:B39B:95 5E     STA $5E,X @ $005E = #$02
! B8 m2 h& N8 `# H+ [5 ?0 Q05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)3 |. Y6 r3 ^; z  t9 ^
05:B39F:B5 5C     LDA $5C,X @ $005C = #$00' R8 |2 \1 ?! y. U( b
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00$ a8 k( U6 d1 \/ R# E4 i0 w
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
9 S1 x, z, A% z
6 ?. b& c' |! I* ^, Q/ W% o由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了! o) l3 d; i1 }. V3 S. \3 `1 e
可以下载玩一玩, [' v3 X% Q- ?: U" k
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1310 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。) D& C1 P3 \1 ^5 h, I9 [
首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。
) z% a) @- B, O9 {+ N% h  D2 J后来尝试其它修改,但是偶尔会造成花版或者死机。
4 ]2 G1 n( n0 |  l- |. e深入研究,发现要以演示模式通关,需要做的事情还很多。2 m0 H! F- [- j6 G7 F6 u( k
因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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-9-16 10:56 , Processed in 1.051758 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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