我想读一下windows 7,64位的IVT,我不确定是否有可能,我有一个在Rootkit阿森纳的代码,这是下一个:
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以保护模式运行,并且该代码需要真正的模式,那么您可以在windows 7上运行该代码。所以我的问题是,我能在windows 7,64位中访问IVT吗?或者,这本书肯定是错的,因为它应该指定该代码不会在windows 7 32或64位中运行。欢迎任何帮助。非常感谢你抽出时间。干杯!
发布于 2015-03-06 15:23:42
如果不编写内核模式驱动程序,就不能在上这样做,因为您是在长模式下运行(受保护模式的64位扩展)。你要求做的是不可能的在用户模式中
来自雷蒙德·陈的博客链接:
Windows NT在低地址上没有太多的东西。唯一已经存在的是一个映射为零的PAGE_NOACCESS页面,以捕获空指针访问。
基本上,操作系统将一个PAGE_NOACCESS放在IVT将位于的地址,以防止愚蠢的编程错误。尽管如此,这是不可能的,因为您在虚拟地址空间,没有物理访问的物理内存部分。
https://stackoverflow.com/questions/28901807
复制相似问题