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

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

2017-3-29 16:23
7853

在安卓异常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指令?敬请大神赐教


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 340
活跃值: (922)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
2
就是判断地址的最后一位,1是thumb,0是arm。
2017-3-29 16:30
0
雪    币: 154
活跃值: (602)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
noword_forever 就是判断地址的最后一位,1是thumb,0是arm。
Thumb指令的地址都是奇数吗?我看了看这篇文章http://blog.csdn.net/u011449588/article/details/44634977,好像不是吧?只是BX切换Thumb状态时,在寄存器Rn中加1
2017-3-29 17:05
0
雪    币: 1096
活跃值: (374)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
4
BX addr+0x1,表示跳转至Thumb;BX addr,表示跳转至arm。
2017-3-29 18:25
0
雪    币: 18
活跃值: (561)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
如果无法找到上层如何调用进来,我的理解是无法在内存中百分之百确定是arm指令还是thumb指令,可以依据经验判断,比如先尝试把其识别为arm指令,如果可以识别成功并且是常见指令,则认为是arm指令,否则为thumb。
2017-3-30 09:40
0
雪    币: 18
活跃值: (561)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
thumb16和thumb32倒是很好区别
2017-3-30 09:41
0
雪    币: 182
活跃值: (214)
能力值: ( 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
游客
登录 | 注册 方可回帖
返回
//