当我做一个android异常钩子时,如何根据地址判断汇编指令是ARM还是Thumb?

当我做一个android异常钩子时,如何根据地址判断汇编指令是ARM还是Thumb?,arm,hook,thumb,Arm,Hook,Thumb,当我做一个android异常钩子时,如何根据地址判断汇编指令是ARM还是Thumb?thumb的地址不是以“0”结尾吗? 当我将ARM切换到thumb时,我使用“BX targetAddress+1”,但thumb的地址仍然以“0”结尾。我不知道为什么 void WriteillegalInstructionAndSaveOpcode(uint32_t addr, uint32_t *OriginOpcode) { if(0x00000001 == (addr & 0x000000

当我做一个android异常钩子时,如何根据地址判断汇编指令是ARM还是Thumb?thumb的地址不是以“0”结尾吗? 当我将ARM切换到thumb时,我使用“BX targetAddress+1”,但thumb的地址仍然以“0”结尾。我不知道为什么

void WriteillegalInstructionAndSaveOpcode(uint32_t addr, uint32_t    *OriginOpcode)
{
if(0x00000001 == (addr & 0x00000001))
{
    g_bIsThumb = 1;
    *OriginOpcode = *(uint32_t *)(addr & (~0x00000001));
    //Thumb illegal instruction : 0xdeXX
    uint32_t uiThumbillegalValue = 0x0000de00 | (0xFFFF0000 & *OriginOpcode);
    write_data_to_addr(addr & (~0x00000001), uiThumbillegalValue);
}
else
{
    g_bIsThumb = 0;
    //Arm illegal instruction: 0xf7fXaXXX
    *OriginOpcode = *(uint32_t *)addr;
    uint32_t uiArmillegalValue = 0x7f000f0;
    write_data_to_addr(addr, uiArmillegalValue);
}

LOGI("[+] g_bIsThumb is %08x \n",g_bIsThumb);
LOGI("[+] WriteillegalInstruction addr: %08x, OriginalOpcode is %08x",addr & (~0x00000001), *OriginOpcode);

}

所以这是一个全尺寸的手臂而不是cortex-m。Thumb指令是16位对齐的16位指令,thumb2是扩展,因此16位项的数量是可变的(两个)。所以拇指的一位是零。ARM指令为32位,必须对齐,因此两个lsbits必须为零。当lsbit设置为bx、blx或pop(或cortex-m中的向量表)时,指令/动作消耗地址,将lsbit带进pc,pc不包含正在设置的lsbit(用于thumb),而cpsr反映了这一点。当bl或blx发生时,lr获得pc加上两条指令,如果处于thumb模式,则设置lsbit,否则清除

我认为是全尺寸的ARM,但您必须检查ARM或ARM TRM,查看ARM模式下的核心执行异常

关于你的问题:

每个异常模式也有一个保存的程序状态寄存器(SPSR) 它在异常之前保存任务的CPSR 发生了


您应该检查SPSR以检查T位,查看您处于什么模式(假设它是thumb或ARM),然后根据异常检查您需要检查的内容,以确定在这种情况下此错误指令的地址,然后阅读该项。如果是一条未在32位边界上对齐的thumb指令,请小心不要执行32位读取。

如果您运气好,并且设置了地址的第1位,则它是thumb指令,或者因为它是非法的,所以它处于thumb模式。如果第1位为零,则无法从地址中辨别。