Sep 29, 2005

Hack Primer (2) 恶魔城—晓月 +不同名字对应不同能力

1。


  当然我们可以这么搜索,这个是一个很传统的做法,因为我们最后肯定是要通过一个按键来结
束名字的输入。


  而我们又知道这个地址。所以我们可以追这个地址。不过传统的东西虽然通常有不错的通用型
(因为新事物往往有很大的局限性或者是传统方法的延伸),但是往往很麻烦。所以我们在这里
要用其他的方法得到人物初始化的代码和名字判断的代码。


  其实我们可以发现SOMA和JULIUS的HP是不同的,而且又很容易从EC找到HP的地址是多少(我的
前一篇教程和前辈的文章里面有如何从EC的地址得到实际的内存地址),我们在这个地址上中
断,所以呢~,很容易吧。


  然后我们仔细看能力初始化代码的开始部分,会发现人物的标志位,所以我们同样的可以很容易找到人物名字的判断代码。


2。
r0 读入一个输入的字符
r1 读入一个特定名字字符
r2 输入名字的地址(这个地址在程序转入之前已经赋值)
r3 特定名字的地址(初始化为08143EB0)
r4 人物标志(初始化为1)
r5 循环次数(名字最动为8个字母,所以固定为8)
r6 自定义的人物标志位(03000c60)




  在这里跳转,刚好r2放有我们需要的地址。


80078fc:ldrb r0,[r4]
cmp r1,r0

  改为 bl 8143f40 。


  这里的代码很简单,没有什么可以说的。要是有问题就给我Message 。



08143F40>B4FF push r0-r7
08143F42 4E07 ldr r6,=30007FFh
08143F44 4B07 ldr r3,=8143EB0h
08143F46 2500 mov r5,0h
08143F48 2401 mov r4,1h
08143F4A E019 b 8143F80h
08143F4C 2C03 cmp r4,3h
08143F4E D027 beq 8143FA0h
08143F50 2500 mov r5,0h
08143F52 3310 add r3,10h
08143F54 3401 add r4,1h
08143F56 E013 b 8143F80h
----------------
08143F60 07FF lsl r7,r7,1Fh
08143F62 0300 lsl r0,r0,0Ch
08143F64 3EB0 sub r6,0B0h
08143F66 0814 lsr r4,r2,20h
----------------
08143F80 5D50 ldrb r0,[r2,r5]
08143F82 5D59 ldrb r1,[r3,r5]
08143F84 4288 cmp r0,r1
08143F86 D1E1 bne 8143F4Ch
08143F88 3501 add r5,1h
08143F8A 2D08 cmp r5,8h
08143F8C D1F8 bne 8143F80h
08143F8E 7034 strb r4,[r6]
08143F90 2C01 cmp r4,1h
08143F92 4D02 ldr r5,=201325Ah
08143F94 702C strb r4,[r5]
08143F96 E003 b 8143FA0h
08143F98 0000 lsl r0,r0,0h
08143F9A 0000 lsl r0,r0,0h
08143F9C 325A add r2,5Ah
08143F9E 0201 lsl r1,r0,8h
08143FA0 BCFF pop r0-r7
08143FA2 7820 ldrb r0,[r4]
08143FA4 4770 bx r14



3。
  存放名字的地址:02000090h
恶魔城晓月(中文版)字母对照表
A 02 B 03 C 04 D 05
E 06 F 07 G 08 H 09
I 0A J 0B K 0C L 0D
M 0E N 0F O 10 P 11
Q 12 R 13 S 14 T 15
U 16 V 17 W 18 X 19
Y 1A Z 1B @ 1C 。 1D
- 1E ' 1F ! 20 (Skull) 21
(Cross) 22


名字对应的值
JULIUS 0B160D0A 1614
DRACULA 05130204 160D02
LUCKYDOG 0D16040C 1A051008



4。




0813FF44>B500 push lr





0813FF46 493E ldr r1,=2013250h
0813FF48 2001 mov r0,1h
0813FF4A 7748 strb r0,[r1,1Dh] 这里的nop是因为发现了人物标志只能是0,1
0813FF4C 46C0 nop 所以把存放的位置改变了,放在30007FFh
0813FF4E 46C0 nop 原来的赋值语句太原始了,不便于阅读
0813FF50 46C0 nop
0813FF52 46C0 nop
0813FF54 7A88 ldrb r0,[r1,0Ah]
0813FF56 46C0 nop



0813FF58 2802 cmp r0,2h 如果名字是LUCKYDOG
0813FF5A D10E bne 813FF7Ah
0813FF5C 20A0 mov r0,0A0h
0813FF5E 0040 lsl r0,r0,1h
0813FF60 8448 strh r0,[r1,22h]
0813FF62 2050 mov r0,50h
0813FF64 8488 strh r0,[r1,24h]
0813FF66 2005 mov r0,5h
0813FF68 84C8 strh r0,[r1,26h]
0813FF6A 2006 mov r0,6h
0813FF6C 8508 strh r0,[r1,28h]
0813FF6E 2006 mov r0,6h
0813FF70 8548 strh r0,[r1,2Ah]
0813FF72 20FA mov r0,0FFh
0813FF74 0080 lsl r0,r0,2h
0813FF76 8588 strh r0,[r1,2Ch]
0813FF78 E031 b 813FFDEh



0813FF7A 2801 cmp r0,1h 如果名字是JULIUS
0813FF7C D10E bne 813FF9Ch
0813FF7E 20C8 mov r0,0C8h
0813FF80 0080 lsl r0,r0,2h
0813FF82 8448 strh r0,[r1,22h]
0813FF84 20FF mov r0,0FFh
0813FF86 0040 lsl r0,r0,1h
0813FF88 8488 strh r0,[r1,24h]
0813FF8A 200F mov r0,0Fh
0813FF8C 84C8 strh r0,[r1,26h]
0813FF8E 200C mov r0,0Ch
0813FF90 8508 strh r0,[r1,28h]
0813FF92 200A mov r0,0Ah
0813FF94 8548 strh r0,[r1,2Ah]
0813FF96 2014 mov r0,14h
0813FF98 8588 strh r0,[r1,2Ch]
0813FF9A E020 b 813FFDEh



0813FF9C 20A0 mov r0,0A0h 初始化SOMA的能力
0813FF9E 0040 lsl r0,r0,1h
0813FFA0 8448 strh r0,[r1,22h]
0813FFA2 2050 mov r0,50h
0813FFA4 8488 strh r0,[r1,24h]
0813FFA6 200A mov r0,0Ah
0813FFA8 84C8 strh r0,[r1,26h]
0813FFAA 200C mov r0,0Ch
0813FFAC 8508 strh r0,[r1,28h]
0813FFAE 200B mov r0,0Bh
0813FFB0 8548 strh r0,[r1,2Ah]
0813FFB2 2009 mov r0,9h
0813FFB4 8588 strh r0,[r1,2Ch]
0813FFB6 7A88 ldrb r0,[r1,0Ah]



0813FFB8 2803 cmp r0,3h 如果名字是DRACULA,则打开所有的能力
0813FFBA D110 bne 813FFDEh
0813FFBC 2303 mov r3,3h
0813FFBE 21FF mov r1,0FFh
0813FFC0 2002 mov r0,2h
0813FFC2 0300 lsl r0,r0,0Ch
0813FFC4 3013 add r0,13h
0813FFC6 0200 lsl r0,r0,8h
0813FFC8 3038 add r0,38h
0813FFCA 0100 lsl r0,r0,4h
0813FFCC 3006 add r0,6h
0813FFCE 7001 strb r1,[r0]
0813FFD0 3001 add r0,1h
0813FFD2 3B01 sub r3,1h
0813FFD4 2B00 cmp r3,0h
0813FFD6 D1FA bne 813FFCEh
0813FFD8 3001 add r0,1h
0813FFDA 213F mov r1,3Fh
0813FFDC 7001 strb r1,[r0]



0813FFDE 2020 mov r0,20h
0813FFE0 0200 lsl r0,r0,8h
0813FFE2 3013 add r0,13h
0813FFE4 0200 lsl r0,r0,8h
0813FFE6 3025 add r0,25h
0813FFE8 0100 lsl r0,r0,4h r0=201325Ah,r1本来是这个值,可惜被改变了。又不想
0813FFEA 300A add r0,0Ah 改变很多寄存器,所以就麻烦一点,幸好空间很多



0813FFEC 2100 mov r1,0h
0813FFEE 7803 ldrb r3,[r0]
0813FFF0 2B01 cmp r3,1h 201325A的值一定只能是0或者1,
0813FFF2 D000 beq 813FFF6h 否则会初始化图像的时候出错
0813FFF4 7001 strb r1,[r0]



0813FFF6 2B02 cmp r3,2h 如果是LUCKYDOG,送两枚戒指
0813FFF8 D103 bne 8140002h
0813FFFA 30B0 add r0,0B0h r0=201330A
0813FFFC 2101 mov r1,1h
0813FFFE 7001 strb r1,[r0]
08140000 7041 strb r1,[r0,1h]



08140002 BC01 pop r0 返回
08140004 4700 bx r0



魂出现几率上升戒指 201330A
稀有物品出现几率上升戒指 201330B




5。
  在打补丁后会出现人物走动时候有些地方会间歇的花瓶,不过不影响游戏的进行。这个应该是我们的代码覆盖到这些图形的原因。不过我也没有找到其他的位置放。


  我想说的是人物的标志位的值。为什么我用了一个其他的内存地址来存放新加入的人物?
  我们常这样写一个程序(我本身是作软件开发) :在一个地方设置一个判断标志,如果这个标志的值是0,那么我们跳转到一个地方执行,如果是1我们的代码会到另外一个地方执行。但是我们往往会一厢情愿的认为我们加入一个新的值,然后跳到我们所希望的地方。当然这是一个方法。但是具体的要按照实际情况来分析。在这里如果我们把201325a的值设置为0,1之外的值,那么程序会出现异常。但是我们往往开始怀疑
的是我们自己添加的代码的正确性,所以我们不停的修改,但是还是不行。


  Hack所需要的不仅是技术,耐心。也同样需要自信。我们要对自己的代码自信。


  所以我们不如假设标志值只能是0或者1,这样我们就能解决这个问题。

  我自己是一个Hack的初学者,在这里感谢Lordquest对ldr r3,=8015340h这类代码的耐心解释。如果大家对我写的东西有任何问题可以给我message,我不定期上网。我会对我的Hack心得全部写出来


0 comments:

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Powered by Blogger