我想在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运行)在保护模式下,该代码需要实模式。所以我的问题是,我可以在Windows 7、64位中访问IVT吗?或肯定地,这本书是错误的,因为它应该指定该代码不能在Windows 7 32或64位上运行。欢迎任何帮助。非常感谢您的宝贵时间。欢呼!:D
不,您不能在Windows上不编写内核模式驱动程序来执行此操作,因为您以长模式(受保护模式的64位扩展)运行。您要执行的操作在用户模式下是不可能的
从雷蒙德·陈(Raymond Chen)的链接博客文章中:
Windows NT的低位地址没有很多东西。唯一已经存在的是将PAGE_NOACCESS页映射为零,以捕获空指针访问。
基本上,操作系统会PAGE_NOACCESS
降低IVT所要使用的地址,以防止出现愚蠢的编程错误。那就是说不可能,因为您位于虚拟地址空间中,并且无法物理访问该部分物理内存。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句