您好,反向工程师,

我正在分析一个胖的Macho-O二进制文件,它里面有ADRP和ADD指令。
我在说这些指令: >
__text:00000001002E050C                 ADRP            X8, #some_function@PAGE
__text:00000001002E0510                 ADD             X8, X8, #some_function@PAGEOFF


ADRP指令的字节为“ 08 00 00 90”。

ADD指令的字节为“ 08 61 0D 91”
如何从2条指令中获取值?
这是我的程序,用于计算some_function的地址:
它应该对21位偏移量进行符号扩展,将其左移12位,然后加上将其清零12个低位的代码到PC。 >执行指令后,值00000001002E0358应该在X8中,因为这是我们要计算的函数的地址。
我的程序输出为: >
我在做什么错?

结论:我读错了ARM手册。
AArch64官方手册

最终代码:

    int instr = 0x90000008;
    //int instr = 0x80000090;
    int value = 0x1fffff & instr;
    int mask = 0x100000;
    if(mask & instr)
    {
            value += 0xffe00000;
    }
    printf("value : %08x\n", value);
    value = value << 12;
    printf("value : %08x\n", value);
    int instr2 = 0x910d6108;
    //int instr2 = 0x08610d91;
    value += (instr2 & 0xfff); //get the last 12 bits from instr2
    printf("value : %08x\n", value);


#1 楼

对于第一条指令(0x90000008),它与以下PC相对寻址指令的操作码相匹配。 immhi = 0,Rd = 8(X8)。指令解码为0x90000008 = 0b10010000000000000000000000001000。这将跳转到指令指针所在的当前页面,加0 << 12,并存储在寄存器ADRP X8, #0中,这样您将具有下一条指令X8匹配



X8 = page_address_of(0x00000001002E050C) + 0<<12 = 0x00000001002E0000,所以我们有sf = 1(64位变体),op = 0(添加),S = 0(非饱和),shift = 0(LSL#0),imm12 = 0x358,Rn = 8(X8),Rd = 8(X8)。这样您就可以

0x910d6108

评论


您如何解码0x90000008指令?

–探索者
17年5月25日在14:34

在哪里可以找到有关解码ARM指令的信息?

–探索者
17年5月25日在14:55

那将是《 ARMv8体系结构参考手册》。

–伊恩·库克(Ian Cook)
17年5月25日在17:35

非常感谢你!找到正确的手册,现在编写代码进行计算,我将发布解决方案。

–探索者
17年5月25日在18:05