关于使用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`
请问各位大佬,红丸作者说虚拟机中的IDT地址通常位于0xFFXXXXXX,而在真实主机上位于0x80xxxxxx,为什么我获取到的虚拟机的IDT基址不符合
页:
[1]