|
发表于 2013-2-28 16:59:30
|
显示全部楼层
zsyf 发表于 2013-2-28 15:48 , O" ] |4 S" I- _! n
在看了银河大的《GBA游戏Romhack视频教学》后,除了用教程中所演示的恶魔城来实践相关操作外,最近还想找其 ...
) |' ~- ?+ j0 p: [* { I* N$ Y8 L1 m. z, R3 }& C4 ^. n. a
我只是今天路过正好看到! ?% K" E; `8 B; {+ p
所以稍微调试了下
3 d& o8 P" q. A; s S* g$ A数据断点下断要下入口地址
3 ~$ e" f0 W; y" E7 F; t4 ?, v6 V2 Z
所以是020030EC,而不是ED,因为对应指令的入口就是EC$ z0 Y' l1 q0 o& \% n
1 K) d6 a; D4 o0 n7 x& p8 F至于思路...我不确定你是否看得懂
1 a& J$ M4 O; `$ Z; g0 W找到指令后因为是参数共用的
/ B* T; K+ u) R7 Y$ j6 Q2 d你可以下指令断点,然后有选择性的断下,比如HP减少时的断下(因为能量减少、分数变动也会断下来)+ R3 p1 _+ a4 Q# E: `. o" m
然后执行到返回, U9 _' \5 ]; y! I2 M* r5 S) U
( ^) S) Y$ J& n. ?
发现返回的地方的前面的语句还是参数公用语句
; @# s! G" t. _8 @) U+ r: l/ C于是又选择性的再使用指令断点执行到返回1 @* e3 g3 p! Q& J
) c& i. x/ ~9 M9 K
即可找到有关HP参数的函数Call,变更传递参数1 r7 Y! n2 y( B2 @
比如HP减少时' U5 k& Z; A5 g1 }* k* R' \
传递r0寄存器给Call(也就是bl xxxxxxxx)) K1 M' q5 D! i+ x! V
r0是一个负数' ~+ W! I" D! T7 ^" i# r1 ?) m J/ P
于是我们在调用Call时' [ M4 c/ \/ g! Z
把r0清零
. _& U, @7 Z* H# y& s2 p当然不好的地方是
4 \1 U6 d0 p- ^0 Y- Y) IHP虽不会减少,但也不会增加了
( e+ T) R7 b" _这里想要只加不减就需要跳转来判断r0了
2 u2 H; { {/ f: Q5 y3 w: F* F, u9 h9 \1 X2 y5 Z& G- H* w, ^
这样就可以避开能量、分数等对那段函数的公用,而只使得HP不减少 |
|