首页
社区
课程
招聘
[求助]android异常hook中,如何判段目标地址是arm指令还是Thumb指令?为什么判断最后一位?
发表于: 2017-3-29 16:23 8132

[求助]android异常hook中,如何判段目标地址是arm指令还是Thumb指令?为什么判断最后一位?

2017-3-29 16:23
8132

在安卓异常hook中,需要在目标地址插入一段非法指令,如何判断目标地址是arm指令还是Thumb指令?


我见有的代码是判断最后一位:

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);

}

可是在内存中,无论是Thumb还是arm指令,指令的地址最后一位不都是0吗?BX切换Thumb状态时,也只是在寄存器Rn中加1,这样判断目标地址最后一位怎么能知道是arm指令还是Thumb指令?敬请大神赐教


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 340
活跃值: (957)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
2
就是判断地址的最后一位,1是thumb,0是arm。
2017-3-29 16:30
0
雪    币: 154
活跃值: (753)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
noword_forever 就是判断地址的最后一位,1是thumb,0是arm。
Thumb指令的地址都是奇数吗?我看了看这篇文章cfbK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2U0M7$3c8F1i4K6u0W2L8X3g2@1i4K6u0r3N6e0l9I4x3e0b7@1z5e0f1^5z5q4)9J5c8X3q4J5N6r3W2U0L8r3g2Q4x3V1k6V1k6i4c8S2K9h3I4K6i4K6u0r3y4o6b7$3x3K6b7&6y4K6N6Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0g2Q4b7e0g2Q4b7V1c8Q4c8e0g2Q4z5o6y4Q4z5p5k6Q4c8e0c8Q4b7U0S2Q4z5p5c8Q4c8e0k6Q4z5e0S2Q4b7f1k6Q4c8e0g2Q4z5e0m8Q4b7e0N6Q4c8f1k6Q4b7V1y4Q4z5f1k6Q4c8e0g2Q4z5p5k6Q4b7f1q4Q4c8e0k6Q4z5e0S2Q4b7f1k6n7h3q4!0q4y4g2)9^5z5q4)9^5y4#2!0q4y4W2)9^5c8q4!0m8x3W2c8Z5N6h3#2T1i4@1f1%4i4K6S2m8i4@1t1$3i4@1f1$3i4K6R3H3i4K6R3I4i4@1f1$3i4K6V1%4i4@1t1$3i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1#2i4K6W2o6i4@1p5^5i4@1f1#2i4@1q4r3i4K6R3@1i4@1f1#2i4@1q4p5i4K6V1^5i4@1f1#2i4K6V1&6i4@1p5^5f1X3&6Q4c8e0c8Q4b7U0S2Q4b7f1c8Q4c8e0g2Q4z5p5q4Q4b7e0l9I4
2017-3-29 17:05
0
雪    币: 1096
活跃值: (379)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
4
BX addr+0x1,表示跳转至Thumb;BX addr,表示跳转至arm。
2017-3-29 18:25
0
雪    币: 18
活跃值: (721)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
如果无法找到上层如何调用进来,我的理解是无法在内存中百分之百确定是arm指令还是thumb指令,可以依据经验判断,比如先尝试把其识别为arm指令,如果可以识别成功并且是常见指令,则认为是arm指令,否则为thumb。
2017-3-30 09:40
0
雪    币: 18
活跃值: (721)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
thumb16和thumb32倒是很好区别
2017-3-30 09:41
0
雪    币: 174
活跃值: (384)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主理解了吗,同问
2019-5-15 16:18
0
雪    币: 419
活跃值: (845)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
8
ARM指令集切换到Thumb是通过分支执行条内存地址为奇数的指令,当然这条指令存储的位置还是偶数的,只是将这个奇数减一就可以得到指令真实地址。之后如果通过PC寄存器每次加2来得到奇数的内存地址来执行指令,所以一直都是Thumb模式,如果出现分支跳转到一个偶数指令,就会切回ARM指令集,可能是这样吧,如果有大佬了解,希望赐教
2019-6-14 11:58
0
雪    币: 0
活跃值: (353)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
为啥frida hook地址的时候 要把arm 指令切换thumb 计算地址呢
2019-9-14 16:04
0
游客
登录 | 注册 方可回帖
返回