zdabajfk 发表于 2024-10-30 23:31

关于使用IDT基址检测虚拟机失败

本帖最后由 zdabajfk 于 2024-10-30 23:47 编辑


# 尝试使用IDT基址检测虚拟机
请问各位大佬,红丸作者说虚拟机中的IDT地址通常位于0xFFXXXXXX,而在真实主机上位于0x80xxxxxx,为什么我获取到的虚拟机的IDT基址不符合

虚拟机版本为vmware16.2.4.28481,系统为Windows xp

真机为Windows11

## 一、检测代码

```c
#include <stdio.h>
#include <windows.h>

int main()
{
    HANDLE hThread = GetCurrentThread();
    DWORD_PTR affinityMask = 1;
    SetThreadAffinityMask(hThread, affinityMask);

    unsigned char m, rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";//相当于SIDT,其中addr用于保存IDT地址
    *((unsigned*)&rpill) = (unsigned)m;                                                               //将sidt中的addr设为m的地址
    ((void(*)()) & rpill)();                                             //执行SIDT指令,并将读取后IDT地址保存在数组m中

    printf("idt base: %#x\n", *((unsigned*)&m));                                               //由于前2字节为IDT大小,因此从m开始即为IDT地址
    if (m > 0xd0)                                                                                                       //当IDT基址大于0xd0xxxxxx时则说明程序处于VMware中
    {
      printf("Inside Matrix!\n");
    }
    else
    {
      printf("Not in Matrix.\n");
    }

    return 0;
}

```

## 二、编译器配置




## 三、测试结果

在虚拟机上运行如下代码,其执行结果为`0x8003f400`


通过Windbg获取的虚拟机IDTR,其IDT基址为`0x8003f400`

zdabajfk 发表于 2024-10-30 23:35

请问各位大佬,红丸作者说虚拟机中的IDT地址通常位于0xFFXXXXXX,而在真实主机上位于0x80xxxxxx,为什么我获取到的虚拟机的IDT基址不符合
页: [1]
查看完整版本: 关于使用IDT基址检测虚拟机失败