Lorsque je fais un crochet d'exception Android, comment juger l'instruction assembleur est ARM ou Thumb par adresse? L'adresse du pouce ne se termine-t-elle pas par "0"? quand je passe le bras au pouce, j'utilise "BX targetaddr + 1", mais l'adresse du pouce se termine toujours par "0". Je ne sais pas pourquoi.Lorsque je fais un crochet d'exception Android, comment juger l'instruction assembleur est ARM ou Thumb par adresse?
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);
}
Si vous avez de la chance et que le bit 1 de l'adresse est défini, alors il s'agit d'une instruction au pouce ou, comme elle est illégale, elle était en mode pouce. Si le bit 1 est zéro alors vous ne pouvez pas dire à partir de l'adresse. –
Merci beaucoup! –