EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑 6 }  |2 s3 |$ O; m, V

, k0 u/ F0 l- G; n+ ]) rFC自动演示修改教程
: [' k; E+ I" ]% o) I, M作者:火焰烈旋风
+ @) G4 R) T3 W# p工具:FCEUX中文版(www.9553.cn搜FCEU即可)
0 k' q/ ?, ^5 S1.找按键地址:
5 J' M: k* q( q, P2 a    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
5 a3 _8 K, t7 D0 t2.找演示时按键的数据来源:1 P; T7 W' Z5 V6 M  ]
    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
+ v" B- `2 g. |7 m% s5 b& M07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
5 ~5 u5 B4 c+ o1 }07:C391:94 F9     STY $F9,X @ $00F9 = #$00
+ n" ^. W  v3 J* k# v, I07:C393:CA        DEX  E) M( P6 w: }( j2 K
07:C394:10 F0     BPL $C3865 y5 A' z, W* M- _
07:C396:60        RTS
- M2 q8 J5 K+ M  }) {6 u8 F我们点击"运行"左边的上拉按钮上拉,看到如下指令:, f  y) T4 W0 J8 C8 Q$ v0 M  e8 v
07:C378:A5 1D     LDA $001D = #$07
, v4 F1 y4 Q# r2 L07:C37A:29 04     AND #$04
4 u( C* C3 A# S3 U+ j4 z& X07:C37C:D0 06     BNE $C3849 G/ x* w1 T" D
07:C37E:A5 04     LDA $0004 = #$00
1 j$ |2 l7 N) P3 j0 v07:C380:05 05     ORA $0005 = #$00( i* F0 l: F! [- w
07:C382:85 04     STA $0004 = #$00' ^7 I* H5 u" R
07:C384:A2 01     LDX #$01
; ^0 e5 {( }; h6 J" ?* b07:C386:B5 04     LDA $04,X @ $0004 = #$00% E4 H! P; p5 W- Z9 p/ N3 L, E
07:C388:A8        TAY
4 Q. p( u9 x! P$ X6 Q' K. _2 p07:C389:55 F9     EOR $F9,X @ $00F9 = #$00
, w& l, y& b& `+ j07:C38B:35 04     AND $04,X @ $0004 = #$001 r( n9 g0 E7 q* o
07:C38D:95 F5     STA $F5,X @ $00F5 = #$00
5 P& f  P0 ~! `3 m- ]: I* \07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
4 D) {9 L, `% u4 T% d  G5 Y% M07:C391:94 F9     STY $F9,X @ $00F9 = #$00# e! n: P: z! U& ^- p6 p6 A
07:C393:CA        DEX9 o% S$ T9 K2 j+ I3 I% {
07:C394:10 F0     BPL $C386
" g+ K. F+ P4 X' {  ^/ t7 G07:C396:60        RTS/ [$ [; ~7 Q9 a% b2 m
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:
9 @4 c! W* e/ C7 K05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
7 S/ F& p( D$ @: F5 O% j05:B3A5:A5 2E     LDA $002E = #$C8
5 B  ]7 o) b4 r7 u/ l6 G' j05:B3A7:C9 50     CMP #$50! e, \, u/ j2 ]7 J6 u# j
05:B3A9:90 20     BCC $B3CB( T3 q2 _' ?/ }, P5 O, X
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
0 B: d; v2 V/ D+ ^; X) N05:B3AD:29 0F     AND #$0F; H/ y- I. @: E+ M) Y
05:B3AF:C9 01     CMP #$01
4 w2 Z" b2 [* g4 `( p# U$ Z05:B3B1:F0 04     BEQ $B3B7! D) d/ G: }: K' w% r
05:B3B3:C9 04     CMP #$04
. `6 S0 Q- o7 X! u. X' D1 ]  K.........
( k" @" d6 [" R% Y8 s我们点击"运行"左边的上拉按钮上拉,看到如下指令:
$ v, ~$ q9 n9 T; @% q05:B39F:B5 5C     LDA $5C,X @ $005C = #$017 `3 ?9 L* Y6 |; W8 u+ M2 B$ g' h( }
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$010 T# \5 f; q# Y# \9 Z& m! p, S0 y
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
7 U9 S: w( X+ W05:B3A5:A5 2E     LDA $002E = #$C89 M# k" a% l# T$ ^  L
05:B3A7:C9 50     CMP #$50# O3 e5 x& j/ z# |7 @
05:B3A9:90 20     BCC $B3CB" |* E/ ^: [9 k/ I: m6 [( X5 K& _
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00% Q; S) y) w: o) R& V/ ~2 v! ^
05:B3AD:29 0F     AND #$0F# i/ k( ?1 ^/ H" a/ l) G2 m
看到0 j) c* o4 K) C4 s/ _+ x
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
0 S# s# T! A0 s( C0 \+ Y6 `05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01% r) p+ w( e0 w! h
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00  X/ z9 L/ f# a! i+ L5 D2 D
没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.- m  s/ S' Z" D* q8 `0 V7 Y$ a
    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:" b2 q, s( i  h9 o$ h
05:B392:95 5C     STA $5C,X @ $005C = #$01) E% e# a4 H, }4 B  _. S4 j; `
05:B394:C8        INY
/ A1 `% o" d# b' p" W' V) l05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$098 E( d( V6 ?: H) ]* Y4 ~' ]  n
05:B397:95 5A     STA $5A,X @ $005A = #$00: c5 {. [% h" Z" o8 X
05:B399:C8        INY: u! \3 o! N" S" _- g
05:B39A:98        TYA- j+ `, b& [4 M" y. L
然后我们再上拉,得到如下指令:2 V# s% {' A, u1 l
05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
5 i# u  c  O) L% U' N- _4 X05:B38E:C9 FF     CMP #$FF& J1 `% k/ Y' s* i
05:B390:F0 3D     BEQ $B3CF9 W6 m" ^) U  ~$ z7 |3 h2 s2 `! t4 k) M
05:B392:95 5C     STA $5C,X @ $005C = #$01
3 I: x7 R- Z  S0 K05:B394:C8        INY- O8 l0 ^# q/ G: t! D9 \$ W
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09# s8 t( Z+ ]0 X" D/ K
05:B397:95 5A     STA $5A,X @ $005A = #$00# t& P( K  ^" N! w( B' [
05:B399:C8        INY2 O( e" G2 ]  [: q
05:B39A:98        TYA
' t6 L  n( P. R$ w8 |2 v7 R  u3 U看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
" g) h6 P$ w$ u+ i6 P+ ~' h没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.) B# g" T" i/ A* [" f
3.修改演示:
7 @" H# d) Y" v, c+ ?* ^, C3 `$ S    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.- K, E( e8 B3 U
    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
/ F* z& ^0 D# t7 p: @+ X8 A打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:
2 p. y2 _& y/ c5 k- d4 D* v05:B392:95 5C     STA $5C,X @ $005C = #$00
; V1 ^" X6 m- M3 R05:B394:C8        INY" ^( w: w+ C) G+ a* f6 F( L
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
5 \. f! j& x* G' K( T  j' A05:B397:95 5A     STA $5A,X @ $005A = #$00
- z, B$ X+ @$ o: F05:B399:C8        INY
  e. w1 k) B1 F2 V05:B39A:98        TYA
0 b! O9 w3 D1 q0 u5 O我们上拉看到了:5 v9 [5 H* w) o  Q  a: @5 l
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
0 \/ o9 w4 \6 A4 a0 F05:B38E:C9 FF     CMP #$FF+ X. N* t* B4 c
05:B390:F0 3D     BEQ $B3CF
: Y& f$ f+ C5 F8 D05:B392:95 5C     STA $5C,X @ $005C = #$00
" ~; u2 n7 y- }% G05:B394:C8        INY
8 J9 r+ w$ F& S0 A1 [5 J) d9 K05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00. Y! f/ s1 W4 F. s% t' r
05:B397:95 5A     STA $5A,X @ $005A = #$00& k4 D) _4 W! C* c
05:B399:C8        INY
" _1 j* Q% A2 h! D1 F* e* M05:B39A:98        TYA& w# U( [3 J6 Q3 ?' ~5 X9 j& k/ _
看到
: y" s  b! f' s+ J, t& H7 i05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
5 |; v5 ?. L6 {; B/ T! `! F! ^没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
; y  N; h' M4 |) Q4 O! U9 k' F说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:
; v+ m* a+ L( t0 X/ E4 E; u. e05:B371:B5 5A     LDA $5A,X @ $005A = #$7F
: }: `1 \, a# W05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)$ s3 z/ i/ M* G( ~2 f: y9 r5 s+ Q
05:B375:A5 30     LDA $0030 = #$00
3 s5 u7 |/ S2 l0 W3 E1 Q% ]+ [" q5 x05:B377:0A        ASL; L: t: N4 R  {8 @- E1 z0 P
05:B378:0A        ASL
% A+ u. j) a6 ~; X4 X05:B379:85 08     STA $0008 = #$29
8 s+ V" K) c9 E. Q4 |05:B37B:8A        TXA
, g6 k* i$ Y6 [0 o$ Y05:B37C:0A        ASL
( u8 f( `2 a5 M& G4 I( t5 R7 K4 O05:B37D:65 08     ADC $0008 = #$29, r1 i/ I/ m3 x9 ~& g; z8 P2 k7 Z: L
05:B37F:A8        TAY
. Y1 U# p; R5 g# z% G: r05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4
# Z0 z( t7 x2 |+ Y05:B383:85 08     STA $0008 = #$29
1 ?3 Y4 r0 M& ?! S( @1 @) ~! I05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC6 U% a, c. ^( |2 R+ I5 r, _& f/ W1 y& G
05:B388:85 09     STA $0009 = #$B2! L  X* F2 n4 c7 i& ?( r2 n
05:B38A:B4 5E     LDY $5E,X @ $005E = #$02
7 B5 c- }8 D: c) _1 X05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10# m7 \' M& \, m1 R6 @8 [% h
05:B38E:C9 FF     CMP #$FF
. d3 L0 x5 p$ S: R2 X  P05:B390:F0 3D     BEQ $B3CF
5 X- m! i/ k2 b2 l3 o! s$ `05:B392:95 5C     STA $5C,X @ $005C = #$00
# i4 x  [5 `, H2 j6 b/ F5 S" a& w05:B394:C8        INY# X( j/ ?) L: V- ^0 `& b$ T
05:B395:B1 08     LDA ($08),Y @ $B22E = #$100 B" w  u1 B" U; |9 _! ]0 E
05:B397:95 5A     STA $5A,X @ $005A = #$7F
( |/ C3 v, j  n* A7 F& T' o3 G' j, @05:B399:C8        INY
/ H# K- r/ ~7 [$ u9 K! _05:B39A:98        TYA
/ U% s" [( S, Q8 s0 P8 R7 @4 d05:B39B:95 5E     STA $5E,X @ $005E = #$02# G& n4 ?; S; C3 N. B
05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)
3 o. g; L1 v. w. P4 C6 L* j$ b05:B39F:B5 5C     LDA $5C,X @ $005C = #$00; K. D8 P) t; ?# z- A" z6 I
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00
) B. x; a: }- j) t/ O05:B3A3:95 F1     STA $F1,X @ $00F1 = #$003 |5 g: ~- R9 w+ w% ?

0 u, a" e- M7 K由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
* h. s- a2 X; A# E, R! ~+ M3 J可以下载玩一玩6 y8 D0 N( c  Y  J. z
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1288 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。4 |  |4 J/ x; Z
首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。
; }0 E9 J9 ^. C0 k* L后来尝试其它修改,但是偶尔会造成花版或者死机。
& V7 q" E; r1 L4 p) E深入研究,发现要以演示模式通关,需要做的事情还很多。% k% A5 ]! p: Z
因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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-1-21 18:46 , Processed in 1.074219 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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