首页
社区
课程
招聘
[求助]Arm汇编BL指令与16进制值之间的转换?
发表于: 2021-6-7 19:01 5818

[求助]Arm汇编BL指令与16进制值之间的转换?

2021-6-7 19:01
5818

图片描述
图片描述
图片描述
我看0xF0A1FC没有0x946这块数据,它是如何进行转换的?对这块实在没怎么接触,网上资料也少,哪位大神帮忙指点下,感激不尽


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (5)
雪    币: 25512
活跃值: (4807)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
ARM汇编网上资料还真不少:
https://blog.csdn.net/lwanttowin/article/details/78385440
2021-6-7 19:57
0
雪    币: 29
活跃值: (5692)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3

以下代码支持arm64,arm32以及thumb16指令

#if defined(__aarch64__)

        static inline __always_inline  int64_t calcuate_branch_aim(uint32_t *inpp, int offset) {
            static constexpr uint32_t mbits = 6u;
            static constexpr uint32_t mask = 0xfc000000u; // 0b11111100000000000000000000000000
            static constexpr uint32_t op_b = 0x14000000u; // "b"  ADDR_PCREL26
            static constexpr uint32_t op_bl = 0x94000000u; // "bl" ADDR_PCREL26

            const uint32_t ins = *(uint32_t *) ((uintptr_t) inpp + offset);
            const uint32_t opc = ins & mask;
            switch (opc) {
                case op_b:
                case op_bl:
                    return (int64_t) ((uintptr_t) inpp + offset) +
                           (static_cast<int32_t>(ins << mbits) >> (mbits - 2u)); // sign-extended
                default:
                    return 0;
            }
        }

#endif

        inline __always_inline void *getBTarget(void *symbol, int offset) {
#if defined(__aarch64__)
            return (void *) calcuate_branch_aim((uint32_t *) symbol, offset);
#elif defined(__arm__)
            if ((reinterpret_cast<uintptr_t>(symbol) & 0x1) == 0)
                return (char *) ((uintptr_t) symbol + offset) +
                       (((*(int32_t *) ((uintptr_t) symbol + offset)) << 8) >> 6) + 8;
            else {
                offset--;
                return (char *) ((uintptr_t) symbol + offset) +
                       (((*(int16_t *) ((uintptr_t) symbol + offset)) << 8) >> 8) + 5;
            }
#else
            assert(false);
            return 0;
#endif
        }

        inline __always_inline void *getBLTarget(void *symbol, int offset) {
#if defined(__aarch64__)
            return (void *) calcuate_branch_aim((uint32_t *) symbol, offset);
#elif defined(__arm__)
            if ((reinterpret_cast<uintptr_t>(symbol) & 0x1) == 0)
                return (char *) ((uintptr_t) symbol + offset) +
                       (((*(int32_t *) ((uintptr_t) symbol + offset)) << 8) >> 6) + 8;
            else {
                offset--;
                int32_t opCode = (*(int32_t *) ((uintptr_t) symbol + offset));
                int32_t high = (opCode & 0x7ff); //7ff
                int32_t low = ((opCode >> 16) & 0x7ff); //7f5
                return (char *) ((uintptr_t) symbol + offset) +
                       ((((high << 12) | (low << 1)) << 9) >> 9) + 5;
            }
#else
            assert(false);
            return 0;
#endif
        }


最后于 2021-6-7 20:38 被不吃早饭编辑 ,原因:
2021-6-7 20:18
0
雪    币: 29
活跃值: (5692)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
挺久前写的了,应该可用
2021-6-7 20:19
0
雪    币: 29
活跃值: (5692)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
调用时symbol表示这条指令所在的函数地址,offset表示该指令在函数内的偏移
2021-6-7 20:20
0
雪    币: 1365
活跃值: (3589)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
int main()
{
       while(1){
               int a = 0;
       }
}
loc_83D0
.text:000083D0  00 00 00 E3             MOV             R0, #0
.text:000083D4  00 00 8D E5             STR             R0, [SP,#8+var_8]
.text:000083D8  FC FF FF EA             B               loc_83D0


.text:000083D8  B 0x000083D0
(0x000083D0 - 0x000083D8 -0x8) >> 2 ==> FFFFFFFC


取后24位FFFFFC


与EA拼接得到 EAFFFFFC

最后于 2021-6-8 10:37 被lanoche编辑 ,原因:
2021-6-8 10:36
1
游客
登录 | 注册 方可回帖
返回
//