尝试读取 windows 7 64 位中的 IVT 时出错

Error trying to read the IVT in windows 7 64 bits

我想读取windows7、64位的IVT,我不确定是否可行,我在Rootkit Arsenal中有一个代码,就是下一个:

int main(int argc, char** argv) {

     unsigned short csAddr;
     unsigned short ipAddr;
     short address;
     unsigned short vector;

     vector = 0x0;

     printf ("\n---Dumping IVT from bottom up---\n");
     printf ("Vector\tAddress\t\n");

     for (
             address = IDT_001_ADDR; 
             address <= IDT_255_ADDR;
             address = address+IDT_VECTOR_SZ, vector++
         ) 
         {
     printf ("%03d\tp\t",vector,address);
     asm ("PUSH ES;");
     asm ("MOV AX,0;");
     asm ("MOV ES,AX;");
     asm ("MOV EBX,0;");
     asm ("MOV BX,%0"::"r"(address):);
     asm ("MOV AX,ES:[BX]");
     asm ("MOV %0,AX":"=r"(ipAddr)::);  
     asm ("INC BX;");
     asm ("INC BX;");
     asm ("MOV AX,ES:[BX]");
     asm ("MOV %0,AX":"=r"(csAddr):);
     asm ("POP ES");

     printf ("[CS:IP]=[%04X,%04X]\n",csAddr,ipAddr);
     }
     return 0;
}

我正在使用 Windows 7 64 位。我想了解为什么这段代码不起作用。我收到 "Access violation reading location 0x00000000" 错误,这对我来说很有意义,因为 windows 使用分页来访问内存,所以我不知道为什么书上告诉你可以 运行 该代码windows 7、如果windows 运行处于保护模式,则该代码需要实模式。所以我的问题是,我可以在 windows 7、64 位中访问 IVT 吗?或者肯定,这本书是错误的,因为它应该指定该代码不会 运行 在 windows 7 32 或 64 位中。欢迎任何帮助。非常感谢您的宝贵时间。干杯! :D

NO 如果不编写内核模式驱动程序,你不能在 Windows 上执行此操作,因为你 运行 处于长模式(受保护的 64 位扩展模式)。你要求做的事是不可能的in user mode

来自 Raymond Chen 的链接博客 post:

Windows NT didn't have a lot of stuff at low addresses. The only thing that was already there was a PAGE_NOACCESS page mapped at zero in order to catch null pointer accesses.

基本上 OS 将 PAGE_NOACCESS 放在 IVT 所在的地址,以防止愚蠢的编程错误。这就是说这是不可能的,因为你在一个虚拟地址 space 中并且没有物理访问那部分物理内存。