冰大,昨天那种想法感觉稍微难了点,还是就先照简单的弄吧!
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开关。
上面的可以实现了吗? 不了解的帮顶
#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 赶紧就这个补丁加深下对MP的理解。。。 虽然没看懂但是强烈的支持LOQUAT兄弟! 哦,代码看懂了,MP补丁太有意思,要加紧看书啊。
加油加油...... 冰大前面的代码大致看懂啦。。。
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}","\
........ {01 o `Function` `None`=0 `Use A`=1 `Use B`=2}","\
自己研究一下mp的语法吧,chaos那个网站下载的master里面有源码和俄文说明
或自己摸索,我也是在写master.elf的过程中慢慢摸索出来的
01表示的是从配置数据的第一字节开始,o或options表示的是选择项类型,这个类型数据占用一个字节
所以我们要的数据位于配置数据的第一个字节,就是LDRB R0, http://chaos.allsiemens.com/
只找到chaos的一个主页,一共才四个标签页,没找到master,汗!!! 本帖最后由 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 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 http://chaos.allsiemens.com/download/Master.rar
//这里是否可以用其他寄存器存PATCH_ID吗比如R1-R7、R8-R14、PC(当然前提是和后面的CMP保持一致)
仔细看ARM指令,不是跟你说了参数是怎么传送的吗r0第一个参数,r1第二个,依此类推到R3,后面的参数存到堆栈
照搬是不行的,一些寄存器的参数传送要调整,但思路是很明显的 {01 o `Function` `None`=0 `Use A`=1 `Use B`=2}","\
这个配置刷进去一个入口还是只能选择一个去向。
因为原代码只能执行,两个目标都不去,或者只执行其中的一个目标。
现在应该有的是
从hook能调到X并能于后跳到Y... #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
本帖最后由 loquat 于 2011-2-28 20:42 编辑
楼上骂人 楼上那位。。没骂你 饭饭以前有广告的帖子 看我骂的谁 不想说你了 回复 qiuyuke 的帖子
不干精神损失费1W米
页:
[1]