不过那个空间只能把补丁文件保持一个月~
源程序及简单的分析思路我也发过来吧。
1.很容易用低阶搜索找到保存当前子弓单状态码的地址。[0200006d]
2.在no$gba中以[02000054][02000055][0200006d]为中断即可以中断在换木仓函数中,
进而可以找到其入口地址。
08012bd2 0000 lsl r0,r0,0h
08012bd4>b5f0 push r4-r7,lr (这儿就是~)
08012bd6 4657 mov r7,r10
08012bd8 464e mov r6,r9
08012bda 4645 mov r5,r8
08012bdc b4e0 push r5-r7
08012bde b084 add sp,-10h
08012be0 0600 lsl r0,r0,18h
08012be2 0e00 lsr r0,r0,18h
08012be4 4682 mov r10,r0
08012be6 0609 lsl r1,r1,18h
08012be8 0e0d lsr r5,r1,18h
08012bea 2d12 cmp r5,12h
08012bec d86d bhi 8012ccah
08012bee 4824 ldr r0,=20048a0h
-------------
在程序中查找带有这个地址(08012bd4)的跳转,可以发现之前都r1赋值了,
我们可以猜测r1是这个函数的参数。
3.以按键寄存器地址[04000130h]变化为中断条件(比如r0 = 04000130h),可以发现
在[03004448],[0300444c]这个地址中,前者保存了按键按下时瞬间的值,之后马上又变回0;
后者保存当前按键的状态值。
4.以r0,=3004448h为中断条件可以中断在这儿:
下面是我修改后的程序,
080063b8 220d mov r2,0dh
080063ba 0300 lsl r0,r0,0ch
080063bc>4804 ldr r0,=3004448h
080063be 8801 ldrh r1,[r0]
080063c0 2008 mov r0,8h
080063c2 4008 and r0,r1
080063c4 0400 lsl r0,r0,10h
080063c6 0c00 lsr r0,r0,10h
080063c8 4240 neg r0,r0
080063ca b507 push r0-r2,lr (跳转到我的子过程之前,push r0-r2及lr)
080063cc f077fa36 bl 807d83ch (只用用中程跳转!找空白地址找得好苦>_<)
080063d0 4448 add r0,r9
080063d2 0300 lsl r0,r0,0ch
5.通过分析可以知道当l,r,a分别按下时[03004448]中保存的值分别为0200,0001,0200
接下来用测试程序可以知道换木仓函数的参数r1的取值只能为2,3,4,5,6,a,c,d,e,f
继续~
0807d83c>1c0a mov r2,r1
0807d83e 0000 lsl r0,r0,0h
0807d840 0a12 lsr r2,r2,8h
0807d842 2a02 cmp r2,2h (比较是否按了一下l键)
0807d844 d002 beq 807d84ch
0807d846 bc07 pop r0-r2
0807d848 0fc0 lsr r0,r0,1fh
0807d84a bd00 pop pc
0807d84c 4801 ldr r0,=200006dh (这个地址保存了当前木仓的状态值)
0807d84e 8802 ldrh r2,[r0]
0807d850 2105 mov r1,5h
0807d852 e001 b 807d858h
0807d854 006d lsl r5,r5,1h (这二行是数据200006d,无作用....)
0807d856 0200 lsl r0,r0,8h
0807d858 0412 lsl r2,r2,10h (清除r2高位上的无用数据)
0807d85a 0c12 lsr r2,r2,10h
0807d85c 46c0 nop
0807d85e 2a02 cmp r2,2h (之后是一个一个比较就行了!~)
0807d860 d100 bne 807d864h
0807d862 2103 mov r1,3h
0807d864 2a03 cmp r2,3h
0807d866 d100 bne 807d86ah
0807d868 2104 mov r1,4h
0807d86a 2a04 cmp r2,4h
0807d86c d100 bne 807d870h
0807d86e 2105 mov r1,5h
0807d870 2a05 cmp r2,5h
0807d872 d100 bne 807d876h
0807d874 2106 mov r1,6h
0807d876 2a06 cmp r2,6h
0807d878 d100 bne 807d87ch
0807d87a 210a mov r1,0ah
0807d87c 2a0a cmp r2,0ah
0807d87e d100 bne 807d882h
0807d880 210c mov r1,0ch
0807d882 2a0c cmp r2,0ch
0807d884 d100 bne 807d888h
0807d886 210d mov r1,0dh
0807d888 2a0d cmp r2,0dh
0807d88a d100 bne 807d88eh
0807d88c 210e mov r1,0eh
0807d88e 2a0e cmp r2,0eh
0807d890 d100 bne 807d894h
0807d892 210f mov r1,0fh
0807d894 2a0f cmp r2,0fh
0807d896 d100 bne 807d89ah
0807d898 2102 mov r1,2h
0807d89a 2a02 cmp r2,2h
0807d89c d100 bne 807d8a0h
0807d89e 2103 mov r1,3h
0807d8a0 f795f998 bl 8012bd4h (调用换木仓函数)
0807d8a4 bc07 pop r0-r2
0807d8a6 0fc0 lsr r0,r0,1fh
0807d8a8 bd00 pop pc |