设为首页收藏本站

 找回密码
 立即注册
搜索
查看: 2275|回复: 17

[原创HACK教程] MD HACK简单教程(重制) [回档后帖子丢失了,重发一份]

[复制链接]

签到天数: 2012 天

[LV.Master]伴坛终老

发表于 2013-11-12 22:01:29 | 显示全部楼层 |阅读模式
准备东西:68K指令集资料、REGEN DEBUG、十六进制编辑器# D  U$ c9 E7 M8 S& S

1 e; y# X- e3 XREGEN DEBUG官网下载页面:http://aamirm.hacking-cult.org/www/regen.html7 b7 r' A1 q  k! g( k- T, v
. E4 `4 {* W  A2 f
以前写的MD HACK教程是用MD调试器,但这MD调试器在使用过程发现有点缺点,显示机械码只显示前2位,后面地址或数值却没有显示,有可能造成后来新手在修改ROM时寻找不到要修改的数据。
, M% d5 j9 n9 |  u0 M6 h
( g- w3 }1 p# B* p0 Z' G本篇教程考虑改用REGEN 0.972 Debug版来调试跟踪,现在的REGEN DEBUG很强大,可以考虑放弃MD调试器。& |. \, l1 d2 _' o# O
+ V  ]) }' p: E4 h
以《魂斗罗:铁血军团》日版为例,修改目标:体力值不减
* m3 ]; a: L1 u9 b9 \5 y8 o. ~( C# Y, S7 F- a& Q5 I
1。先找到《魂斗罗:铁血军团》体力值存放地址,可通过REGEN自带的作弊码查找功能来找,我找到了,存放地址是0xFFFA0D。, I- h9 J. }8 t1 J% n  r. @, q

5 p' y; n/ q% H+ X2。选择人物进入游戏后,点击Tools->68000 Debugger进入68000调试器界面,图1:1 m7 U1 \8 m$ @' r5 M

4 H0 e& V3 f* }* U
3 d! T% P1 E; w5 S" Y+ W4 E. z+ ^1 {; M左上角框是显示汇编指令,右边是寄存器显示1 p5 [: g+ ?4 K" I  @% H& g
) m0 R. h, b+ H8 p& \; p3 ~
Address Breakpoints是地址断点5 B% r% a+ o6 U( F  S- b! v' l  D
Address Range是对一定范围地址设置断点7 D2 i. U. x% a3 R1 `7 D& E1 f
Register breakpoints是寄存器断点
! ]( s* v$ X/ q8 {& C, _( u9 ~VDP Breakpoint Range是对VDP一定范围地址设置断点. @: U) V+ k  U$ g2 D
VRAM breakpoints是VRAM断点/ E  `, Q) }4 g/ t' l; q9 @1 b
Go to address是转到指定的地址
- g9 p* Q9 ^1 f) z# zshow disassembly是对指定的地址反汇编$ }- B" h/ w8 R( }6 e$ Y) w
Debug step是进行单步或N步调试5 m3 o9 ^# k& _6 m7 V
ROM MEMORY是ROM Viewer
/ O) S$ J3 p0 ]) ^4 V68000 MEMORY是RAM Viewer! c0 P$ Y, }: c9 f
Z80 Debug是Z80调试器8 N5 R/ U9 q, c5 A+ y# ^5 `

  r' h+ v: @# L! [Read是读,Write是写,PC表示是PC地址,Trace是跟踪(选择该项会在模拟器目录下生成ASM文件)
" h# T# a8 I7 A
2 \8 Q+ l* B8 F; s0 g1 V6 F; C4 HRESET是重启游戏,RESET68K是68K重启,RESETZ80是Z80重启
8 r/ I. K' r+ O+ |: C0 r7 c
: ~; `, D9 X# i' t1 o0 N3。在Address Breakpoints的Set Breakpoint右边框输入地址FFFA0D,Write选项加勾,再在Set Breakpoint左边框打勾,图2:0 u# g- S5 b- P0 X& _/ k
3 Q( `5 `: t8 r- S5 t: ^$ J
. E; L5 h0 r. B" {7 j
4。点击OK返回游戏,当被敌人攻中时调试器发生中断,图3:2 h) B# p- B9 E

' o4 b' [9 S, l- I# t7 w
1 A" L$ G6 C- X- h3 l* L指令停在011DEE 1C2A000D move.b ($d,A2),D6这一行,前面指令却没有显示,用show disassembly把11DE0~11DFA这段地址反汇编看看,图4:
( o) k1 h$ o5 s% e% N! P
4 g  R* g2 Y3 Y" b7 a/ v. I; k7 [) ?8 \) A8 _
现在来分析一下:: H7 c' D" t, Q& i$ `/ |( |* i
A2=FFFFFA00; _+ ?7 I7 E; g5 w: I# |
D1=00000001
9 Y/ Z) K" _) c' O; J8 h: {: j& O! q: z% P) J" t" n! `7 }( e
011DEA 932A000D sub.b D1,($d,A2)  把$FFFA0D(A2寄存器的数据($FFFFFA00)+$d=$FFFFFA0D)的地址单字节数据减去D1寄存器的数值,结果存入$FFFA0D- }+ ^+ q; T+ z, `" g4 [
011DEE 1C2A000D move.b ($d,A2),D6 把$FFFA0D的单字节数据存入D6寄存器
# C* m( Q% h8 Z
- |' ~7 y) e2 _" h% G0 p% v只要把11DEA指令NOP掉,就可以实现体力不减,NOP指令机械码是4E71. t, p7 ^% R! ~' f) P' Y8 @5 \

! r- i$ x$ {& k4 Y( c5。点击ROM MEMORY进入ROM viewer界面,来到011DE0地址,在Set new value输入11DEA和4E714E71,再点击Set 1-10 bytes写入,再点击OK退出ROM viewer,图5、图6:8 U  `- {' N4 h% p  l

; B: u  o8 W( x) r& u* ?" n1 t2 U& f! J* j
注意:在ROM viewer修改,修改结果是不会被写入ROM里,要修改ROM还得用16进制编辑器。; V: S/ d% I# V1 X) _
% k' Q, i" v- x9 a+ z1 [
6。再对11DE0~11DFA这段地址反汇编看看,11DEA的指令被NOP掉,图7:  L, V( O) g  j( H6 k0 P$ z
: x6 v) w+ ]. S8 c; F1 {  J

5 c! T' {3 G/ e6 n) y/ R8 Y7。把Set Breakpoint和write的打勾去掉,再点OK回到游戏看看,体力是否不减了?体力不减说明修改成功。图8:1 U2 Y3 i# N* e& F5 l
; F8 M2 }( C5 V8 `
% e, }5 M& c8 _; x. l
8。打开WINHEX或UE,载入《魂斗罗:铁血军团》日版ROM,来到0x11DEA,把93 2A 00 0D修改为4E 71 4E 71,保存。图9、图10:
# R" U7 E+ w/ u6 h# `! R) X: O
1 h8 T2 H4 ^3 |, g5 B0 v5 f* k" a) S, o3 {( R6 ~7 H# G) j0 u/ F9 b
疾风之狼1 l: K; |& \& {7 f' `2 H( c4 R
2013/09/13
4 R& ]- a: W" N/ d/ d/ G
: X4 y5 L) m, ?" {7 s
如看不清图片请点击图片放大,或至我博客:http://zero3c.blog.163.com/blog/static/278215082013813111414953/ 观看

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
[发帖际遇]: 疾风之狼花3 个 柠檬买彩票,血本无归T_T. 幸运榜 / 衰神榜

签到天数: 632 天

[LV.9]以坛为家II

发表于 2013-11-12 22:09:04 | 显示全部楼层
本帖最后由 ABC3637 于 2013-11-12 22:10 编辑 # w6 [+ U2 r% n/ }* d" B" G5 }
: h& |% {' a) }8 Q9 n$ n- K% Y5 R8 X0 B. j9 S
大力顶下~好贴前,坐沙发。
回复

使用道具 举报

签到天数: 2060 天

[LV.Master]伴坛终老

发表于 2013-11-12 22:51:55 | 显示全部楼层
满复杂的。。。。。
[发帖际遇]: liujunbtx踩坏了花花草草,被罚款4 个 柠檬. 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 2564 天

[LV.Master]伴坛终老

发表于 2013-11-13 00:02:28 | 显示全部楼层
回档后最可惜的就是那些DEBUG教程了,现在终于等来了重发,支持一下。
回复

使用道具 举报

签到天数: 107 天

[LV.6]常住居民II

发表于 2013-11-13 12:40:30 | 显示全部楼层
好贴必须留名
[发帖际遇]: 猫咪的守候踩坏了花花草草,被罚款4 个 柠檬. 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 2984 天

[LV.Master]伴坛终老

发表于 2013-11-13 12:55:49 | 显示全部楼层
很不错啊,有空学一学。
[发帖际遇]: 天迹云间扶老大爷过马路,警察叔叔奖励天迹云间 2 个 柠檬. 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 380 天

[LV.9]以坛为家II

发表于 2013-11-14 20:04:33 | 显示全部楼层
喜欢看到这样的科普帖,顶上去。非常感谢楼主的贡献
[发帖际遇]: drogon49踩坏了花花草草,被罚款6 个 柠檬. 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 532 天

[LV.9]以坛为家II

发表于 2013-11-17 09:39:28 | 显示全部楼层
看这麻烦 弄起来很简单 呵呵
[发帖际遇]: 啍辤★箛独踩坏了花花草草,被罚款3 个 柠檬. 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 327 天

[LV.8]以坛为家I

发表于 2013-11-17 18:55:55 | 显示全部楼层
虽然不怎么懂,看看稍微学习下!
回复

使用道具 举报

签到天数: 260 天

[LV.8]以坛为家I

发表于 2013-11-17 20:29:32 | 显示全部楼层
观摩学习下
[发帖际遇]: climb2010 被钱袋砸中进医院,看病花了 1 个 柠檬. 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 548 天

[LV.9]以坛为家II

发表于 2013-11-18 14:53:50 | 显示全部楼层
有点眼花 呵呵 辛苦你了
回复

使用道具 举报

签到天数: 231 天

[LV.7]常住居民III

发表于 2013-11-21 22:53:37 | 显示全部楼层
这个真不错!受教了!!{:4_92:}
回复

使用道具 举报

签到天数: 229 天

[LV.7]常住居民III

发表于 2013-11-21 23:52:49 | 显示全部楼层
看了英文我的眼睛就开始晕了,为什么不是中文的....
[发帖际遇]: xindiandi 捡了钱没交公 柠檬 降了 2 个 . 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 3 天

[LV.2]偶尔看看I

发表于 2024-4-5 22:29:12 | 显示全部楼层
大佬您好,晚辈这边斗胆咨询您一个关于MD Hack的问题,如有冒犯还请海涵!" P' _. y6 D- u+ Y

2 j: p+ v; Q8 a- f6 n% Y/ U1 D有幸拜读了您的教程:
+ |, K  r, r5 j8 T! thttp://2006.emu618.org:6180/thread-193604-1-1.html1 f. e7 u; U3 T& q5 j1 Z

: h8 _5 R# _3 k7 v. F& _1 B. n9 P跟着您的教程做了一遍,收获很大。
* _% r5 Y9 _, x% @: X3 n6 t3 n( l# G- i. x
不过我由此想到了一个问题:
+ ]0 H: {* G8 v" v例如《魂斗罗:铁血军团》体力值的例子
/ n  G! i& g5 e2 m% P
1 n4 F* \5 `/ W) V$ u) Q! V011DE8  7A01  moveq #$1,D5
: O& P( C- Y  a! X2 o, B, X9 H011DEA  932A000D  sub.b  D1,($d,A2); r1 A) [$ G3 d& J9 g* C5 J
011DEE  1C2A000D  move.b ($d,A2),D63 t, x+ Y# u  D, {2 j
+ v5 E: K% J% v; {% \/ ^
实测,在将932A000D改成4E714E71的前提下,再将7A01也改成4E71,不会影响无敌效果。' ~+ M" {  Y( g  _9 e4 a

: `7 B1 @1 f1 B2 O: P+ N那么我想,如果像下面这样,将011DE8和011DEA处的命令改成JMP,跳转到某个空白处,然后在空白处重新写上011DE8和011DEA处的命令,最后再跳转回011DEE,是不是就可以恢复正常的受伤功能:
" U6 @! b+ [2 ~* @; {8 m. }/ u
5 y. j$ Z, e2 H% D* v5 u, L011DE8  4EF9000801C0  jmp $0801C0.L7 R8 a$ I$ O% h3 t/ ]9 l0 P; l

! D6 a  u, Y7 k2 g! z7 r' r$ t0801C0  7A01  moveq #$1,D5
) t4 U7 B/ U% v- L0801C2  932A000D  sub.b  D1,($d,A2)
- d/ I6 @8 Z, z  a, s9 f0801C6  4EF900011DEE  jmp $011DEE.L
0 _$ `8 G/ p7 e* H3 e2 T8 ]+ B% L
/ t3 O4 \0 z' h6 y! }9 Z0 y011DEE  1C2A000D  move.b ($d,A2),D65 Q- y9 W) r6 u3 O% v

6 @+ g/ W! D8 ^. u# }然而修改后并未达到预期效果。相反,游戏在角色受伤后立即死机。. F) W3 |9 B9 o

) L# S9 }3 r* A+ Z9 E4 ?7 B请问这是为什么?如果想实现这种操作的话,正确的方法是什么?+ s! h. |5 R% m: k; e6 `
+ d7 a5 n! ]) L
之所以产生这个想法,是因为最近在汉化的一款游戏需要对字库进行扩容。汉化已经几乎完成了,然而游戏中的一些小字体区域还存在一些问题,如果不改会很难看。' c, A( @$ P0 @' v% [" c
8 Z! p# i" f# ~( W+ T
这些小字体由于只使用一个字节进行编码,游戏原本只能显示256个字符。我希望将编码方式改为00-EF为正常映射,F0-FF则切换VDP至相应页码。我认为这需要将原本的程序跳转至一空白处之后再进行自由发挥。
& a% g& Y4 Y, n3 O9 p3 l( \% A& f5 L' O
我并没有任何汇编或反汇编经验,所以打算先从最简单的进行尝试。想不到一上来就遇到了问题。2 ]1 r/ \* q) N
3 h( X" i+ h/ p2 J
期待您的回复!
回复

使用道具 举报

签到天数: 2012 天

[LV.Master]伴坛终老

 楼主| 发表于 2024-4-6 01:40:38 | 显示全部楼层
SchreckgSoldat 发表于 2024-4-5 22:29
/ ^" `+ e& i( V0 a6 [, v0 M大佬您好,晚辈这边斗胆咨询您一个关于MD Hack的问题,如有冒犯还请海涵!( U# K5 H' ]3 f, ^! B/ x* A
$ C$ U- e# ]: P; D' A3 E! u
有幸拜读了您的教程:

3 x  [- |# s) N1 ^6 d% R  D( ]1 S/ K4 I- I, A
ROM名称:Contra - The Hardcore (J).bin4 G; K) Q  Y4 o2 D2 [" }6 u

) a* E4 h! {! `1 e+ X
  1. 011DEA  932A000D  sub.b  D1,($d,A2)        ->4EF9 001FDD00 jmp $1fdd00.L3 g; @7 j4 s, w- H, t$ @
  2. 011DEE  1C2A000D  move.b ($d,A2),D6        ->4E71 nop0 Q2 M' x1 G7 M
  3. 011DF2  6A02          bpl $11df6
    ) k) b6 |/ T: M# e

  4. 9 K& o5 O& L( l9 h8 g* M4 ?
  5. 1FDD00:
    $ i# M$ P! q+ u' K0 Z& O
  6. 932A000D  sub.b  D1,($d,A2)# F4 j% C5 L+ j" L' x& v
  7. 1C2A000D  move.b ($d,A2),D6; u0 e) J8 S' f# \9 u
  8. 4EF900011DF2 jmp $011df2.L" \  _1 L" U" R$ A0 @
复制代码
回复

使用道具 举报

签到天数: 3 天

[LV.2]偶尔看看I

发表于 2024-4-6 12:18:46 | 显示全部楼层
疾风之狼 发表于 2024-4-6 01:401 s9 Z2 f/ y# j4 E. j
ROM名称:Contra - The Hardcore (J).bin

  D9 h8 _' J4 \3 w: Z0 B感谢大佬!
2 C1 z! Z  g& H2 a# K$ C
, ?$ D% U; v) K3 F请问造成这种现象的原因是什么呢?为什么向后移动一个命令写入JMP就可以正常运行,而像我那样就不可以呢?
回复

使用道具 举报

签到天数: 2012 天

[LV.Master]伴坛终老

 楼主| 发表于 2024-4-6 18:06:29 | 显示全部楼层
SchreckgSoldat 发表于 2024-4-6 12:181 f/ [' J% {6 m7 ]- f
感谢大佬!* ?5 i; P7 t" m; N. y6 p  p
. y; [/ f( m$ Y, i0 ?& f7 l) u
请问造成这种现象的原因是什么呢?为什么向后移动一个命令写入JMP就可以正常运行,而像我 ...
  1. 011DE0 7A00        moveq #$0,D5
    ; F- I' ]) ]0 E9 P+ F  y$ M$ Z0 x
  2. 011DE2 6006        bra $11dea. R" ]9 R' K% \& ]9 U7 l8 Q
  3. 011DE4 45F8FA20        lea $fa20.w,A2) z) }, V+ @+ \% |9 x! U  `! C
  4. 011DE8 7A01        moveq #$1,D5
    1 \/ h4 r: H4 b+ N) ~! t
  5. 011DEA 932A000D        sub.b D1,($d,A2)8 y' d' a, ?, c& t- L. ?
  6. 011DEE 1C2A000D move.b ($d,A2),D6
    $ F! W3 U5 i# O. ]- b* ]3 w
  7. 011DF2 6A02        bpl $11df69 f8 B) o! ?2 s$ g/ J/ N
复制代码

( v* T/ k/ h( Q/ ]) W$ n- K/ ~9 T) ^& L4 W, V
你改错位置,011DE8地址指令没有执行到,程序是从011DE2跳到011DEA执行。% W( ?& O; t# \  {$ T+ l$ J

0 x) \+ [2 V6 F+ w, Z! `' |9 t你011DE8改成4EF9 0008 01C0的话,造成后果从011DE2跳到011DEA执行,那么011DEA指令机械码是0008 01C0,CPU识别不了错误的机械码,无法执行造成死机。
回复

使用道具 举报

签到天数: 3 天

[LV.2]偶尔看看I

发表于 2024-4-6 18:35:35 | 显示全部楼层
疾风之狼 发表于 2024-4-6 18:06
/ I& \8 \( T7 n2 D2 f. s* K你改错位置,011DE8地址指令没有执行到,程序是从011DE2跳到011DEA执行。
! C5 o, N' K: X6 d; ^* d# k' g: M% L. H" G& l7 C) k  g4 J
你011DE8改成4EF9 0008  ...

- f& r* k  ]7 O2 {醍醐灌顶了!非常感谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-7-16 01:36

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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