能力值:
( LV2,RANK:10 )
|
-
-
2 楼
当i > 0x80000, address = 0x805d8000+i,所有页已经不可读或不存在.所以蓝了.
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
不可能不存在,我用虚拟机可以读,实体机会蓝,这个模块的大小是0x200000以上的,没越界
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
系统分RO 和 R3两种访问级别
RO是系统访问--可以访问0X80000000以上的地址
R3是应用层访问,只可以访问0X800000一下的地址
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
对了,你所访问的内存如果是只读的你去修改也会那样
如果只读的去写那么久蓝屏
一般修改内存属性的方法有1修改CRO寄存器2通过Memory Descriptor List(MDL)。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
修改MDL的方法 大概如下。具体的你自己去网上搜索吧
typedef struct _MDL {
struct _MDL *Next;
CSHORT Size;
CSHORT MdlFlags; //关键在这里,将来设置成MDL_MAPPED_TO_SYSTEM_VA ,这样一来,这块区域就可写
struct _EPROCESS *Process;
PVOID MappedSystemVa;
PVOID StartVa;
ULONG ByteCount;
ULONG ByteOffset;
}MDL,*PMDL;
PMDL g_pMdlSystemCall;
PVOID *MappedSystemCallTable;
PVOID *OldMm;
int nOldMmSize;
//映射我们的区域
g_pMdlSystemCall = MmCreateMdl(NULL,OldMm,nOldMmSize);
if( g_pMdlSystemCall==NULL ) return;
MmBuildMdlForNonPagedPool( g_pMdlSystemCall );
//改变MDL的flags
g_pMdlSystemCall->MdlFlags = g_pMdlSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
//z在内存中锁定,不让换出
MappedSystemCallTable = MmMapLockedPages( g_pMdlSystemCall,KernelMode );
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
谢谢楼上的大牛的帮助,我是在Ring0的,修改了CR0也会蓝,在虚拟机就不会蓝很是奇怪
|
能力值:
( LV7,RANK:100 )
|
-
-
8 楼
当对无效的地址进行读写操作时会蓝屏,可以用MmIsAddressVaild函数判断一个内存地址是否有效
ULONG i,address,Call,size;
size = 0x100000;
for(i=0;i<size;i++)
{
address = 0x805d8000+i;
if(MmIsAddressVaild(address))
{
if(*(PUCHAR)(address)==0x0e8)
{
Call = *(PULONG)(address+1)+address+5;
DbgPrint("address= %x Call To = %x \n",address,Call);
}
}
}
|
|
|