我想在 Windows 7 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\t$08p\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 位。我想了解为什么这段代码不起作用。我收到“访问冲突读取位置 0x00000000”错误,这对我来说很有意义,因为 Windows 使用分页来访问内存所以我不知道为什么书上它告诉你可以在 Windows 7 上运行该代码,如果 Windows 运行在保护模式下,该代码需要实模式。所以我的问题是,我可以在 64 位 Windows 7 中访问 IVT 吗?或者肯定,这本书是错误的,因为它应该指定该代码不会在 windows 7 32 或 64 位中运行。欢迎任何帮助。非常感谢您的宝贵时间。干杯! :D
最佳答案
NO 你不能在没有编写内核模式驱动程序的情况下在 Windows 上执行此操作,因为你在长模式(保护模式的 64 位扩展)下运行。你要求做的是不可能的in user mode
来自 Raymond Chen 的链接博客文章:
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.
基本上,操作系统会在 IVT 所在的地址处放置一个 PAGE_NOACCESS
以防止愚蠢的编程错误。这就是说这是不可能的,因为您处于虚拟地址空间中并且无法物理访问该部分物理内存。
关于c - 尝试在 Windows 7 64 位中读取 IVT 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28901807/