首页
社区
课程
招聘
[旧帖] 读取内核里面某些地址会蓝屏求解答 0.00雪花
发表于: 2010-12-2 20:42 4295

[旧帖] 读取内核里面某些地址会蓝屏求解答 0.00雪花

2010-12-2 20:42
4295
有人知道这个代码为什么会蓝屏吗?当size>0x80000 就会蓝,很奇怪,0x805d8000 是内核里面一个模块的起始地址

  ULONG i,address,Call,size;
  size = 0x100000;
  for(i=0;i<size;i++)
  {
    address = 0x805d8000+i;
    if(*(PUCHAR)(address)==0x0e8)
    {
       Call = *(PULONG)(address+1)+address+5;
       DbgPrint("address= %x Call To = %x \n",address,Call);
    }
  }

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 137
活跃值: (450)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
当i > 0x80000, address = 0x805d8000+i,所有页已经不可读或不存在.所以蓝了.
2010-12-2 22:00
0
雪    币: 171
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不可能不存在,我用虚拟机可以读,实体机会蓝,这个模块的大小是0x200000以上的,没越界
2010-12-3 02:19
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
系统分RO 和 R3两种访问级别
RO是系统访问--可以访问0X80000000以上的地址
R3是应用层访问,只可以访问0X800000一下的地址
2010-12-3 09:55
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
对了,你所访问的内存如果是只读的你去修改也会那样
如果只读的去写那么久蓝屏
一般修改内存属性的方法有1修改CRO寄存器2通过Memory Descriptor List(MDL)。
2010-12-3 10:41
0
雪    币: 204
活跃值: (25)
能力值: ( 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 );
2010-12-3 11:03
0
雪    币: 171
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢楼上的大牛的帮助,我是在Ring0的,修改了CR0也会蓝,在虚拟机就不会蓝很是奇怪
2010-12-3 19:33
0
雪    币: 227
活跃值: (66)
能力值: ( 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);
      }
    }
  } 
2010-12-5 12:20
0
游客
登录 | 注册 方可回帖
返回
//