Sep 29, 2005

Hack Primer (3) 恶魔城—晓月 +SOMA使用JULIUS能力

  首先我们要找到魂使用的代码位置,我们很容易知道201325d存放的是魂(上+B)的地址,所以我们下中断r0=201325d。这时我们上+B的时候游戏中断.用F7执行到pop返回调用的地方,然后我们看到这样的代码(再返回位置的上面一点点)。



0801B3F8 483B ldr r0,=84BCA78h
0801B3FA 6802 ldr r2,[r0]
0801B3FC 8B91 ldrh r1,[r2,1Ch] 读取按钮,组合的按钮值
0801B3FE 2040 mov r0,40h
0801B400>4008 and r0,r1
0801B402 2800 cmp r0,0h 如果不是"上+其他键",那么就r0等于0
0801B404 D010 beq 801B428h
0801B406 493F ldr r1,=1338Ch
0801B408 1850 add r0,r2,r1
0801B40A 8BD1 ldrh r1,[r2,1Eh] 读取按键的值


>>>0801B40C 8800 ldrh r0,[r0]
>>>0801B40E 4008 and r0,r1 201338c里面保存的是和上组合的另外一个键的值


0801B410 2800 cmp r0,0h
0801B412 D009 beq 801B428h
0801B414 6930 ldr r0,[r6,10h]
0801B416 21A8 mov r1,0A8h
0801B418 00C9 lsl r1,r1,3h
0801B41A 4008 and r0,r1
0801B41C 2800 cmp r0,0h
0801B41E D103 bne 801B428h


0801B420 1C30 mov r0,r6
0801B422 2100 mov r1,0h
0801B424 F7FDF8DA bl 80185DCh 我们要调用的函数



  这里要说明200001c和200001e的区别。1c保存的是组合按键的值,比如"上+R"是0140h,"上+B"是42h.。不过这样不能区分这样两种方式形成的组合,即:先按住上,再按B;还是按住B再按上.。而1e里面放的值就是后按的按钮,同时按下的话值就是6A。


  本来想使用:




  • "下+R"-切换附加武器

  • "上+R"-发动附加武器



  但是既然代码这样,不如我就改成:



  • "上+L"-切换附加武器

  • "上+R"-发动附加武器


  把>>>改成bl 814B200,另外
80185f6 bl 802c3e8
  是附加武器的函数,r0的值是入口函数,指定为特殊武器。不过遗憾的是不能直接调用这个函数,调用了也没有结果。所以我们调用814b200的父函数,不过输入参数没有武器参数。所以我在内存(3000000h)里面自己找一个地方存放Julius的附加武器的值。当执行上+B时,首先判断人物,如果是soma的话就把人物代码改为1(soma的值是0)。然后交换20135dh和3000000h的值,接着就调用函数嘛。函数返回再把值填回来,很简单吧。


  当人物为julius时,r0的值对应武器:



  • 0 回力镖

  • 1 圣水

  • 2 斧头

  • 3 十字架


  我们可以在执行之前设置201325A的值为1,执行了再设置为0 。



0814B200 B5FF push r0-r7,lr
0814B202 2002 mov r0,2h
0814B204 0202 lsl r2,r0,8h 如果是L
0814B206 400A and r2,r1
0814B208 2A00 cmp r2,0h
0814B20A D019 beq 814B240h
0814B20C 2303 mov r3,3h
0814B20E 061B lsl r3,r3,18h
0814B210 781C ldrb r4,[r3]
0814B212 2C03 cmp r4,3h
0814B214 D001 beq 814B21Ah
0814B216 3401 add r4,1h
0814B218 E000 b 814B21Ch
0814B21A 2400 mov r4,0h
0814B21C 701C strb r4,[r3]
0814B21E F000F807 bl 814B230h
0814B222 0000 lsl r0,r0,0h
0814B224 0000 lsl r0,r0,0h
0814B226 0000 lsl r0,r0,0h
0814B228 0000 lsl r0,r0,0h
0814B22A 0000 lsl r0,r0,0h
0814B22C 0000 lsl r0,r0,0h
0814B22E 0000 lsl r0,r0,0h
0814B230 BCFF pop r0-r7
0814B232 8800 ldrh r0,[r0]
0814B234 4008 and r0,r1
0814B236 BD00 pop pc
0814B238 0000 lsl r0,r0,0h
0814B23A 0000 lsl r0,r0,0h
0814B23C 0000 lsl r0,r0,0h
0814B23E 0000 lsl r0,r0,0h
0814B240 2001 mov r0,1h
0814B242 0202 lsl r2,r0,8h
0814B244 400A and r2,r1 如果是R
0814B246 2A00 cmp r2,0h
0814B248 D0F2 beq 814B230h
0814B24A 2303 mov r3,3h
0814B24C 061B lsl r3,r3,18h
0814B24E 4A04 ldr r2,=201325Ah
0814B250 7811 ldrb r1,[r2]
0814B252 2900 cmp r1,0h
0814B254 D1EC bne 814B230h
0814B256 8010 strh r0,[r2]
0814B258 78D1 ldrb r1,[r2,3h]
0814B25A 8259 strh r1,[r3,12h]
0814B25C 7819 ldrb r1,[r3]
0814B25E E004 b 814B26Ah
0814B260 325A add r2,5Ah
0814B262 0201 lsl r1,r0,8h
0814B264 0000 lsl r0,r0,0h
0814B266 0000 lsl r0,r0,0h
0814B268 0000 lsl r0,r0,0h
0814B26A 70D1 strb r1,[r2,3h]
0814B26C 1C30 mov r0,r6
0814B26E 2100 mov r1,0h
0814B270 F6CDF9B4 bl 80185DCh
0814B274 2300 mov r3,0h
0814B276 4C12 ldr r4,=201325Ah
0814B278 7023 strb r3,[r4]
0814B27A 2203 mov r2,3h
0814B27C 0612 lsl r2,r2,18h
0814B27E 46C0 nop
0814B280 7C13 ldrb r3,[r2,10h]
0814B282 70E3 strb r3,[r4,3h]
0814B284 E7D4 b 814B230h



代码很简单,不用多的说明。
  不过很遗憾的是发出的都是黑色的,遗憾呐。弄了半天也没有找到怎么把图像也弄出来。不过soma用十字架的样子很好看。有一个……自己看吧。:-)





0 comments:

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Powered by Blogger