|
请问各位高手,如何正确读取内核内存呢?操作系统为Windows Xp Sp2,无杀软,无内核hook
1.我在驱动里尝试读取0x80000000处的内容,代码如下
UCHAR buffer[100];
UCHAR *pData = (UCHAR*)0x80000000;
memcpy( buffer, pData, 100 );
结果:蓝屏
2.查阅资料后认为是有读保护,于是用以下代码来检验
__try
{
ProbeForRead( pData, 100, 4 );
memcpy( buffer, pData, 100 );
}
__except
{
KdPrint(("The memory can not be read!"));
}
结果:没看到KdPrint的输出,又是蓝屏
3.获取NtOpenProcess的地址0x805CAC46,执行以下代码
UCHAR buffer[4];
UCHAR *pData = (UCHAR*)0x805CAC46;
memcpy( buffer, pData, 4 );
结果:成功获取到内容,和反汇编ntoskrnl.exe中NtOpenProcess的前4字节一致
通过以上过程,我想问各位高手,为什么0x80000000的内存不能读,而NtOpenProcess是可以的读的。既然0x80000000不能读,那ProbeForRead函数又没有抛出异常,或是直接崩溃了呢?请教大家还有没有好的读取内核内存的方法?
众所周知,破写保护,可以用如下代码
{
cli
mov eax,cr0
and eax,~0x10000
mov cr0,eax
}
但是没有发现类似的破读保护的代码,请各位帮帮忙,十分感谢。
|
|