201314 发表于 2009-8-19 13:42:35

冰大,昨天那种想法感觉稍微难了点,还是就先照简单的弄吧!

AERO:
                   PUSH    {R0-R7,LR}
                   LDR   R3, =X
                   BLX   R3                   
                   LDR       R0, =PATCH_ID
                   SWI       0xC4
                   BEQ      EXIT
                   LDR      R3, =Y
                   BLX      R3
EXIT:
                   POP   {R0-R7,PC}昨天那种想法我感觉太难了,现在就直接这样吧。默认先跳到X,再给是否跳到Y加个MP开关。

上面的可以实现了吗?

blueroc 发表于 2009-8-19 17:00:36

不了解的帮顶

binghelingxi 发表于 2009-8-19 20:30:39


#ifdef        UNK_MP

#define        PATCH_ID        0xFFFFF
#define        FUNC_A                0xA0000000
#define        FUNC_B                0xA1000000
       
        PUSH        {R0-R7,LR}
        LDR        R0, =PATCH_ID
        SWI        0xC4
        CMP        R0, #0
        BEQ        EXIT
        LDRB        R0,
        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
EXIT
        POP        {R0-R7,PC}
       
        0xB1C2D3E4,0x000FFFFF,0000000000000000,"\
        {patch=`UNK_MP` ver=0 cp=BingK id=0xFFFFF}","\
        {01 o `Function` `None`=0 `Use A`=1 `Use B`=2}","\
        ",00
#endif

loquat 发表于 2009-8-19 21:07:20

赶紧就这个补丁加深下对MP的理解。。。

88421409 发表于 2009-8-19 21:16:53

虽然没看懂但是强烈的支持LOQUAT兄弟!

loquat 发表于 2009-8-19 21:22:55

哦,代码看懂了,MP补丁太有意思,要加紧看书啊。
加油加油......

loquat 发表于 2009-8-19 21:35:33

冰大前面的代码大致看懂啦。。。
LDRB      R0, //这句的意思是不是读取MP补丁配置中的这一行?
{01 o `Function` `None`=0 `Use A`=1 `Use B`=2}","\
如果我现在想增加配置呢?
{02 o `Function1` `None`=0 `Use C`=1 `Use D`=2}","\
{04 o `Function2` `None`=0 `Use E`=1 `Use F`=2}","\
........

binghelingxi 发表于 2009-8-19 23:31:50

{01 o `Function` `None`=0 `Use A`=1 `Use B`=2}","\
自己研究一下mp的语法吧,chaos那个网站下载的master里面有源码和俄文说明
或自己摸索,我也是在写master.elf的过程中慢慢摸索出来的
01表示的是从配置数据的第一字节开始,o或options表示的是选择项类型,这个类型数据占用一个字节
所以我们要的数据位于配置数据的第一个字节,就是LDRB      R0,

loquat 发表于 2009-8-20 09:39:38

http://chaos.allsiemens.com/
只找到chaos的一个主页,一共才四个标签页,没找到master,汗!!!

loquat 发表于 2009-8-20 10:27:01

本帖最后由 loquat 于 2009-8-20 12:44 编辑

哈哈
{02 o `Function1` `None`=0 `Use C`=1 `Use D`=2}","\
上面这个还不会加,就搞了这么一个。冰大看看,应该没问题吧?#define   PATCH_ID   0x00E71
#ifdef        UNK_MP
ifdef    E71Cv41
#define        FUNC_A                0xA0000000
#define        FUNC_B                0xA1000000
#define        FUNC_C                0xA0100000
#define        FUNC_D                0xA1100000
#define        FUNC_E                0xA0200000
#define        FUNC_F                0xA1200000
endif
        PUSH        {R0-R7,LR}
        LDR        R0, =PATCH_ID
        SWI        0xC4
        CMP        R0, #0
        BEQ        EXIT
        LDRB        R0,
        CMP        R0, #0
        BEQ        EXIT
        CMP        R0, #1
        BEQ        DO_FUNC_A
        CMP        R0, #2            
        BEQ        DO_FUNC_B
        CMP        R0, #3
        BEQ        DO_FUNC_C
        CMP        R0, #4
        BEQ        DO_FUNC_D
        CMP        R0, #5
        BEQ        DO_FUNC_E
        CMP        R0, #6
        BNE         EXIT
        LDR        R0, =FUNC_F
        BLX        R0
        B        EXIT
DO_FUNC_A
        LDR        R0, =FUNC_A
        BLX        R0
        B        EXIT
DO_FUNC_B
        LDR        R0, =FUNC_B
        BLX        R0
        B        EXIT
DO_FUNC_C
        LDR        R0, =FUNC_C
        BLX        R0
        B        EXIT
DO_FUNC_D
        LDR        R0, =FUNC_D
        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 `Use C`=3 `Use D`=4 `Use E`=5 `Use F`=6}","\
        ",00
#endif发现这种不是我要的,我要一次搞三个入口冲突的,看来不能用这种。再改改。。。

loquat 发表于 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,
        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,
//你说的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,
        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

sange129 发表于 2009-8-20 13:20:28

binghelingxi 发表于 2009-8-20 19:36:48

http://chaos.allsiemens.com/download/Master.rar


//这里是否可以用其他寄存器存PATCH_ID吗比如R1-R7、R8-R14、PC(当然前提是和后面的CMP保持一致)

仔细看ARM指令,不是跟你说了参数是怎么传送的吗r0第一个参数,r1第二个,依此类推到R3,后面的参数存到堆栈

照搬是不行的,一些寄存器的参数传送要调整,但思路是很明显的

loquat 发表于 2009-8-20 20:25:23

{01 o `Function` `None`=0 `Use A`=1 `Use B`=2}","\
这个配置刷进去一个入口还是只能选择一个去向。
因为原代码只能执行,两个目标都不去,或者只执行其中的一个目标。

现在应该有的是
从hook能调到X并能于后跳到Y...

loquat 发表于 2009-8-20 20:51:34

#define      PATCH_ID      0x00E71
#define      FUNC_A                0xA0000000
#define      FUNC_B                0xA1000000

                RSEG      HOOK
      CODE16
      LDR      R1, =BODY_
      BLX         R1
                RSEG      BODY
      CODE16
BODY_
      PUSH      {R0-R7,LR}
      LDR      R0, =PATCH_ID
      SWI      0xC4
      CMP      R0, #0
      BEQ         EXIT
      LDRB      R0,
      CMP      R0, #0
      BEQ      DO_FUNC_A
      CMP      R0, #1
      LDR      R0, =FUNC_B
      BLX      R0
      CMP      R0, #2
      BNE      EXIT
DO_FUNC_A
      PUSH      {R0-R7,LR}
      LDR      R0, =FUNC_A
      BLX      R0
EXIT
      POP      {R0-R7,PC}
      END
/*
#pragma enable old_equal_ff
00610D0: 0xB1C2D3E4,0x00000E71,0000000000000000,"\
{patch=`UNK_MP` ver=0 cp=BingK id=0x00E71}","\
{01 o `Function` `A`=0 `B`=1 `Both`=2}",00
#pragma disable old_equal_ff
*/
-carm
-Z(CODE)BODY=A15644B0-FFFFFFFF
-Z(CODE)HOOK=A067A6F4-FFFFFFFF

qiuyuke 发表于 2011-2-24 14:06:52

loquat 发表于 2011-2-28 20:40:04

本帖最后由 loquat 于 2011-2-28 20:42 编辑

楼上骂人

qiuyuke 发表于 2011-2-28 23:23:08

楼上那位。。没骂你 饭饭以前有广告的帖子 看我骂的谁 不想说你了

qiuyuke 发表于 2011-3-1 17:06:41

回复 qiuyuke 的帖子

不干精神损失费1W米
页: [1]
查看完整版本: 冰大,昨天那种想法感觉稍微难了点,还是就先照简单的弄吧!