本帖最后由 zdabajfk 于 2024-10-30 23:47 编辑
尝试使用IDT基址检测虚拟机
请问各位大佬,红丸作者说虚拟机中的IDT地址通常位于0xFFXXXXXX,而在真实主机上位于0x80xxxxxx,为什么我获取到的虚拟机的IDT基址不符合
虚拟机版本为vmware16.2.4.28481,系统为Windows xp
真机为Windows11
一、检测代码
#include <stdio.h>
#include <windows.h>
int main()
{
HANDLE hThread = GetCurrentThread();
DWORD_PTR affinityMask = 1;
SetThreadAffinityMask(hThread, affinityMask);
unsigned char m[2 + 4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";//相当于SIDT[adrr],其中addr用于保存IDT地址
*((unsigned*)&rpill[3]) = (unsigned)m; //将sidt[addr]中的addr设为m的地址
((void(*)()) & rpill)(); //执行SIDT指令,并将读取后IDT地址保存在数组m中
printf("idt base: %#x\n", *((unsigned*)&m[2])); //由于前2字节为IDT大小,因此从m[2]开始即为IDT地址
if (m[5] > 0xd0) //当IDT基址大于0xd0xxxxxx时则说明程序处于VMware中
{
printf("Inside Matrix!\n");
}
else
{
printf("Not in Matrix.\n");
}
return 0;
}
二、编译器配置
三、测试结果
在虚拟机上运行如下代码,其执行结果为0x8003f400
通过Windbg获取的虚拟机IDTR,其IDT基址为0x8003f400
|