首页
社区
课程
招聘
[求助]驱动中读内存为什么会蓝屏
发表于: 2010-7-26 14:59 6848

[求助]驱动中读内存为什么会蓝屏

2010-7-26 14:59
6848
为什么在驱动中读内存会蓝屏,我是用的指针来读的,*PULONG(0x804d8000),类似这

样,我在0x804d8000+0x7C000开头,大小为0x90000的内存块里搜索一个数的时候就蓝

屏了,0x804d8000是ntkrnlpa.exe模块的基地,难道内核中有读保护吗

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 47
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
额,这个看不懂
2010-7-26 15:19
0
雪    币: 338
活跃值: (103)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
3
驱动程序读了错误的内存地址会蓝屏 就像linux下的段错误差不多 不好找!!
2010-7-26 15:48
0
雪    币: 124
活跃值: (205)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
在虚拟机中不会蓝,但是到本机上会蓝,机器是双核的
2010-7-26 16:19
0
雪    币: 124
活跃值: (205)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
typedef struct jiegou_sousuo{  
        UCHAR * jb_char_zz;
        ULONG jb_char_gs;
        LONG jb_char_py;
}jiegou_sousuo;

BOOL find_fun_bijiao(ULONG jb_dz,UCHAR * jb_zz,ULONG jb_gs)
{
        BOOL jb_fh=TRUE;
       
        ULONG jb_jc=0;
        UCHAR jb_uchar=0;

        //地址不符合要求
        if (jb_dz<0x80000000)
        {
                return jb_fh;
        }
        //没有比较的东西
        if (jb_gs<1)
        {
                return FALSE;
        }

        while(jb_jc<jb_gs)
        {
                jb_uchar=*(UCHAR *)(jb_dz+jb_jc);
                        if (jb_uchar != jb_zz[jb_jc])
                        {
                                jb_fh=FALSE;
                                break;
                        }
                        jb_jc++;
        }

        return jb_fh;
}

ULONG find_fun_sousuo(ULONG jb_dz_qs/*起始地址*/,ULONG jb_size,jiegou_sousuo * jb_sz,ULONG jb_cs_gs,LONG jb_jg_py)
{
        ULONG jb_fh=0;
        ULONG jb_jc=0,jb_jc_1=0,jb_zs_1=0;
        BOOL jb_biaozhi=FALSE;
        //地址不符合要求
        if (jb_dz_qs<0x80000000)
        {
                return jb_fh;
        }
        //没有要搜索的内容则返回
        if (jb_cs_gs<=0)  
        {
                return jb_fh;
        }
       

                jb_jc_1=0;       
                jb_zs_1=jb_size-jb_sz[0].jb_char_gs;
                while (jb_jc_1<jb_zs_1)
                {
                        if (TRUE== find_fun_bijiao(jb_dz_qs+jb_jc_1,jb_sz[0].jb_char_zz,jb_sz[0].jb_char_gs))
                        {
                                if (jb_cs_gs>1)//有附加条件
                                {
                                        //DbgPrint("有附加条件\n" );
                                        jb_jc=1;
                                        jb_biaozhi=TRUE;
                                        while(jb_jc<jb_cs_gs)
                                        {
                                                //DbgPrint("测试1 = 0x%8x \n" ,(ULONG)((jb_sz+1)->jb_char_gs));
                                                if (FALSE==find_fun_bijiao(jb_dz_qs+jb_jc_1+jb_sz[jb_jc].jb_char_py,jb_sz[jb_jc].jb_char_zz,jb_sz[jb_jc].jb_char_gs))
                                                {
                                                        //DbgPrint("测试 = 0x%8x \n" ,(ULONG)(jb_dz_qs+jb_jc_1+jb_sz[jb_jc].jb_char_py));
                                                        jb_biaozhi=FALSE;
                                                }
                                                jb_jc++;
                                        }

                                        if (TRUE==jb_biaozhi)
                                        {
                                                jb_fh=jb_dz_qs+jb_jc_1+jb_jg_py;//找到了
                                                break;
                                        }               
                                       
                                               
                                }
                                else //无附加条件
                                {
                                        //DbgPrint("无附加条件\n" );
                                        jb_fh=jb_dz_qs+jb_jc_1+jb_jg_py;//找到了
                                        break;
                                }

                        }
                       

                        jb_jc_1++;
                }
       

        return jb_fh;
}

VOID find_fun_qita()
{
        ULONG jb_jg_dz=0;
        //------------
        jiegou_sousuo jb_sz_ObpCloseHandle[2];
        UCHAR  jb_sz_ObpCloseHandle_zz_0[]={0x83,0xec,0x1c,0x53,0x56,0x57,0xc6,0x45,0xff,0x00};
        UCHAR  jb_sz_ObpCloseHandle_zz_1[]={0x23,0xc8,0x3b,0xc8};

        //-----------------------------
        //qj_ObpCloseHandle
        jb_sz_ObpCloseHandle[0].jb_char_zz=jb_sz_ObpCloseHandle_zz_0;
        jb_sz_ObpCloseHandle[0].jb_char_py=0;
        jb_sz_ObpCloseHandle[0].jb_char_gs=10;

        jb_sz_ObpCloseHandle[1].jb_char_zz=jb_sz_ObpCloseHandle_zz_1;
        jb_sz_ObpCloseHandle[1].jb_char_py=0x1D;
        jb_sz_ObpCloseHandle[1].jb_char_gs=4;
        //jb_jg_dz=find_fun_sousuo(0x804d8000+0xE533A,0x100,jb_sz_ObpCloseHandle,2,-0x5);//这里本来是要填写为0x804d8000+0x7C000这样的,但是不知道怎么的蓝屏,下次找原因
        jb_jg_dz=find_fun_sousuo(0x804d8000+0x8C000,0xF0200,jb_sz_ObpCloseHandle,2,-0x5);//这里本来是要填写为0x804d8000+0x7C000这样的,但是不知道怎么的蓝屏,下次找原因
        if (jb_jg_dz>0x80000000)
        {
                qj_ObpCloseHandle=jb_jg_dz;
        }

        DbgPrint("ObpCloseHandle= 0x%8x \n" ,qj_ObpCloseHandle);
        //-----------------------------

}
2010-7-26 16:33
0
雪    币: 124
活跃值: (205)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
在虚拟机里面运行没事,在本机上运行蓝屏,这是因为本机是双核的问题吗?如何解决呢
2010-7-26 18:40
0
雪    币: 124
活跃值: (205)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
那位大哥大姐可以给小弟解解疑惑吗?
2010-7-29 23:05
0
雪    币: 88
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我也遇到了这样的问题,是双核的问题.困扰了好几天。求高人解决
2010-11-27 04:00
0
雪    币: 217
活跃值: (45)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
你写的程序,这样肯定蓝屏的啊
有点怀疑楼主是不是故意的?

不管了,先回答吧。

不一样的机器,不一样的windows,它们的对象基地址都不一样。
而且每个对象在内存,会申请一个地址空间,但没申请内存。
SO,你要是读到此地方,就蓝了。

用以下函数。
MmIsAddressValid
2010-12-9 10:12
0
雪    币: 75
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼主在代码中加入try{} catch(){} 调试一下 ,可能由于读取的地址是无效的或不可访问,而导致蓝屏...
2010-12-14 19:42
0
雪    币: 84
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
同意9楼。

几种可能:
1. 你的这段代码运行在IRQL >= Dispatch level,这样在触发PageFault异常时,操作系统不能调度PageFault异常处理,导致蓝屏。
2. 你的这段代码运行在IRQL < Dispatch level,但是ntkrnlpa.exe模块在虚拟机、在你本机两种情况的基地址不同。
2011-2-26 10:46
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
同意9楼,同一模块在不同机器虚拟地址是不一样的
2011-2-27 10:04
0
游客
登录 | 注册 方可回帖
返回
//