- 积分
- 412
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
发表于 2009-8-20 12:45:39
|
显示全部楼层
本帖最后由 loquat 于 2009-8-20 13:52 编辑
看来还是得搞这种。。。
{02 o `Function1` `None`=0 `Use C`=1 `Use D`=2}","\
不知道这个行不行。。。。
#ifdef        UNK_MP
#define   PATCH_ID   0x00E71
ifdef    E71Cv41  
#define        FUNC_A                0xA0000000
#define        FUNC_B                0xA1000000
#define        FUNC_A                0xA0100000
#define        FUNC_B                0xA1100000
#define        FUNC_A                0xA0200000
#define        FUNC_B                0xA1200000
endif
                  //这样子,我照原样copy三份成Hook_X,Hook_Y,Hook_Z
Hook_X:
        PUSH        {R0-R7,LR}
        LDR        R0, =PATCH_ID
        SWI        0xC4
        CMP        R0, #0
        BEQ        EXIT
        LDRB        R0, [R0, #1]
        CMP        R0, #0
        BEQ        EXIT
        CMP        R0, #1
        BEQ        DO_FUNC_A
        CMP        R0, #2
        BNE        EXIT
        LDR        R0, =FUNC_B
        BLX        R0
        B             EXIT
DO_FUNC_A
        LDR        R0, =FUNC_A
        BLX        R0
        B             EXIT         
Hook_Y:
        PUSH       {R0-R7,LR}
        LDR        R0, =PATCH_ID
//这里是否可以用其他寄存器存PATCH_ID吗比如R1-R7、R8-R14、PC(当然前提是和后面的CMP保持一致)
        SWI        0xC4
        CMP        R0, #0
        BEQ        EXIT
        LDRB       R0, [R0, #2]
//你说的option只占,一个字节,我也看了其他的MP配置部分。这里似乎可以这么写。目的是读取红色那行!- LDRB 指令用于从存储器中将一个8 位的字节数据传送到目的寄存器中,同时将寄存器的高24位清零。该指令通常用于从存储器中读取8 位的字节数据到通用寄存器,然后对数据进行处理。当程序计数器PC 作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。
复制代码 CMP        R0, #0
        BEQ        EXIT
        CMP        R0, #1
        BEQ        DO_FUNC_C
        CMP        R0, #2
        BNE        EXIT
        LDR        R0, =FUNC_D
        BLX        R0
        B        EXIT
DO_FUNC_C
        LDR        R0, =FUNC_C
        BLX        R0
        B             EXIT
Hook_Z:
        PUSH        {R0-R7,LR}
        LDR        R0, =PATCH_ID
        SWI        0xC4
        CMP        R0, #0
        BEQ        EXIT
        LDRB        R0, [R0, #3]
        CMP        R0, #0
        BEQ        EXIT
        CMP        R0, #1
        BEQ        DO_FUNC_E
        CMP        R0, #2
        BNE        EXIT
        LDR        R0, =FUNC_F
        BLX        R0
        B        EXIT
DO_FUNC_E
        LDR        R0, =FUNC_E
        BLX        R0
EXIT
        POP        {R0-R7,PC}
        
        0xB1C2D3E4,0x00000E71,0000000000000000,"\
        {patch=`UNK_MP` ver=0 cp=BingK id=0x00E71}","\
        {01 o `Function` `None`=0 `Use A`=1 `Use B`=2}","\
        {02 o `Function` `None`=0 `Use C`=1 `Use D`=2}","\
        {03 o `Function` `None`=0 `Use E`=1 `Use D`=F}","\
        ",00
#endif |
|