2013-07-03 79 views
0

我正在调试ARM程序(android)并对其进行一些修改。我想在0x8436到JMP 0x8684,所以我覆盖4个字节BLX指令,在那之后我用IDA Pro来加载程序,它似乎成功从IDA的观点:arm指令是'UNDEFINED'?

IDA view 
----------------------------------------------------------------- 
.text:00008430 LDR  R0, =(aOkkkkkkk___ - 0x8438) 
.text:00008432 PUSH {R4,LR} 
.text:00008434 ADD  R0, PC ; "okkkkkkk..." 
.text:00008436 BLX  sub_8684 
.text:0000843A POP  {R4,PC} 

HEX view(the machine code) 
----------------------------------------------------------------- 
00008436 00 F0 25 E9 

但是,程序运行失败( src程序正常运行):

arm-eabi-gdb 
----------------------------------------------------------------- 
(gdb) x/10i 0x8430 
=> 0x8430:  ldr  r0, [pc, #8] ; (0x843c) 
    0x8432:  push {r4, lr} 
    0x8434:  add  r0, pc 
    0x8436:      ; <UNDEFINED> instruction: 0xf000e925 
    0x843a:  pop  {r4, pc} 

(gdb) x/10x 0x8436 
    0x8436: 0xe925f000  0x001cbd10 

那么blx指令的机器码是错的?请帮我...我想知道正确的指令和BLX转换成机器代码的运算...

而且原始指令这里(正常运行)

ori: 
.text:00008430 LDR R0, =(aOkkkkkkk___ - 0x8438) 
.text:00008432 PUSH {R4,LR} 
.text:00008434 ADD R0, PC ; "okkkkkkk..." 
.text:00008436 BLX sub_83F0 
.text:0000843A POP {R4,PC} 

ori: 
00008430 02 48 10 B5 78 44 FF F7 DC EF 10 BD 

modified: 
00008430 02 48 10 B5 78 44 00 F0 25 E9 10 BD 
+0

好像很奇怪? –

+0

请提供更多的反汇编,blx指令是拇指或手臂上的32位(技术上拇指是两个单独的16位指令),所以如果您用手臂版本替换了拇指指令,那么它肯定会中断。对于此处显示的所有装配,请提供 –

+0

之前版本和后续版本或机器代码(如果更容易)的反汇编。随你。 –

回答

1
00008436 00 F0 26 E9 

0xF000 111 10 00000000000 first half, immed 00000000000 
0xE926 111 01 00100100110 second half, blx, immed 00100100110 

0x8436 + 0b0000000000000100100110<<1 + 2 = 
0x8436 + 0x24C + 2 = 
0x8684 

来自ARM体系结构参考手册(ARM ARM)。

if H == 10 then 
LR = PC + (SignExtend(offset_11) << 12) 

的PC总是领先两个指令,这是拇指代码和基本上,这意味着2个字节的头,16位,所以对于0x8436的PC是0x8436 + 2

第一指令

0xF000 111 10 00000000000 first half, immed 00000000000 
LR = 0x8436+2 + 0b00000000000_000000000000 
LR = 0x8438 

第二个指令

0xE926 111 01 00100100110 second half, blx, immed 00100100110 

if H == 01 then 
PC = (LR + (offset_11 << 1)) AND 0xFFFFFFFC 
LR = (address of next instruction) | 1 
CPSR T bit = 0 

PC = (0x8438 + 0b00100100110_0)&0xFFFFFFFC 
PC = (0x8438 + 0x0000024C)&0xFFFFFFFC 
PC = (0x8684)&0xFFFFFFFC 
PC = 0x8684 
LR = 0x843A | 1 
LR = 0x843B 

每天都学到新的东西,这可能是为什么没有身体使用blx。你只能使用它来分支来从大拇指。而ARM只能从ARM到blx。你使用bl来保持相同的模式,BX取决于地址,所以你不必提前知道。

+0

0436 00 F0 26 E9 - > (GDB)X/10I 0x8436 0x8436:BLX 0x8684 –

+0

余改变为 “00 F0 26 E9” 而不是 “00 F0 25 E9” 和在程序运行确定和gdb示出了它将jmp改为0x8684。但为什么? blx的机器码的算术难题我... –

+0

谢谢。 ARM与x86非常不同。 –