我的目标是从 MacOS 内核模块访问 IDT。

我在 VMFusion 10.0.1 下运行 macOS 10.13.2,似乎 sidt 程序集命令指向损坏的表结构。

此操作码应将地址返回到“中断描述符表”,该表保存每个中断的描述符。

每个中断都包含回调函数的指针,在调用特定中断时应调用该函数。

例如,这里有 2 个中断描述符,它们指向以前旧版本中内核 __TEXT 部分的有效回调。

  • int3 指向 idt64_int3
  • int80 指向 idt64_unix_scall

  • 等等...

    出于某种原因,从 high Sierra 10.13.2 开始,sidt 返回的内存范围不包含有效指针(都在内核 __TEXT 部分的边界之外)。也许还有另一种获取表指针的方法?

    这是我用于查找 idt 指针的源代码:
    unsigned char idt_out[10];
    __asm__ volatile ("sidt %0": "=m" (idt_out));
    
    // skip the first 2 bytes as they are not part of the address
    uint64_t idt_address = *((unsigned long long *)(idt_out+2));
    printf("idt address is %llx \n",  idt_address);
    
    int80_desc = (struct descriptor_idt*)(idt_address + sizeof(struct idt_desc)*0x80);
    int80_address = (mach_vm_address_t)(((unsigned long)int80_desc->offset_high << 32) + ((unsigned int)int80_desc->offset_middle << 16) + int80_descriptor->offset_low); // this should point to idt64_unix_scall
    

    最佳答案

    显然,sidt 停止工作的原因是故意的,并且是 Meltdown 修复的一部分。

    这就是我迄今为止设法找出的全部内容,如果有人对推理有更多线索,请赐教。

    关于c - SIDT 操作码将地址返回到格式错误的 IDT 结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47910789/

    10-12 16:01