尝试读取 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 中并且没有物理访问那部分物理内存。
我想读取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 中并且没有物理访问那部分物理内存。