首页
社区
课程
招聘
关于驱动层KeStackAttachProcess函数导致蓝屏的疑问
发表于: 2014-1-5 01:06 12105

关于驱动层KeStackAttachProcess函数导致蓝屏的疑问

2014-1-5 01:06
12105
我在驱动层用KeStackAttachProcess附加到其他进程读内存的时候,调试的时候很正常,但是实际使用起来,时间长了就会蓝屏,我猜想的原因有两个
1,KeStackAttachProcess用的时候IRQL不对,IRQL我也是一知半解
2,KeStackAttachProcess到一个进程的时候,没来得及KeUnstackDetachProcess释放,这时候,第二个CPU也运行到这里了,再KeStackAttachProcess其他的进程,导致蓝屏,我尝试使用了自旋锁KeAcquireSpinLockAtDpcLevel,但是蓝屏依旧
求大大指点下,菜鸟们不胜感激

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

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
PsAcquireProcessExitSynchronization是必须的,
winxp下,就用另外一个未公开的函数...
2014-1-5 07:14
0
雪    币: 136
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
大哥,哪个未公开的函数,我把我源码贴一下
#pragma PAGECODE
ULONG readmemory(IN ULONG windowh,IN ULONG BaseAdd,IN ULONG BufferSize)
{
        KeAcquireSpinLockAtDpcLevel(&lock1);
        HANDLE ProcessId =(HANDLE) RealNtUserQueryWindow(windowh, 0);
        //HANDLE ProcessId =(HANDLE)windowh;
        if (!ProcessId)return NULL;
        PEPROCESS EProcess=NULL;
        KAPC_STATE ApcState;
        //PVOID readbuffer=NULL;
        PVOID BaseAddress=(PVOID)BaseAdd;
        ULONG status=NULL;
       
        __try
        {
                status=PsLookupProcessByProcessId(ProcessId,&EProcess);
                if (status != STATUS_SUCCESS)
                {
                        //ObDereferenceObject(EProcess);
                        KdPrint(("PsLookupProcessByProcessId函数失败\n"));
                        KeReleaseSpinLockFromDpcLevel(&lock1);
                        status = NULL;
                        goto end;
                }
        }
        __except(1)
        {
                status = NULL;
                goto end;
        }
                //readbuffer = ExAllocatePoolWithTag (NonPagedPool, BufferSize, 'Sys');
        /*
        __try
        {
                readbuffer = ExAllocatePool (NonPagedPool, BufferSize);
                if(readbuffer==NULL)
                {
                        //ExFreePoolWithTag(readbuffer, 'Sys');
                        ObDereferenceObject(EProcess);
                        ExFreePool (readbuffer);
                        readbuffer=NULL;
                        KdPrint(("ExAllocatePoolWithTag返回失败"));
                        status = NULL;
                        goto tend;
                }
                *(ULONG*)readbuffer=(ULONG)0x0;
        }
        __except(1)
        {
                ObDereferenceObject(EProcess);
                status = NULL;
                goto tend;
        }
        */
        __try
        {
                KeStackAttachProcess ((PRKPROCESS)EProcess, &ApcState);
        }
        __except(1)
        {
                ObDereferenceObject(EProcess);
                status = NULL;
                goto end;
        }

        __try
        {
                if (MmIsAddressValid(BaseAddress))
                {
                                ULONG readbuffer=0;
                                ProbeForRead ((CONST PVOID)BaseAddress, BufferSize, sizeof(CHAR));
                                RtlCopyMemory (&readbuffer, BaseAddress, BufferSize);
                                //status=*(ULONG*)readbuffer;
                                status=readbuffer;
                                //KdPrint(("读到的内存=%i",(*(ULONG*)readbuffer)));
                }
                else
                {
                        //KdPrint(("MmIsAddressValid返回失败\n"));
                        status = NULL;
                        goto tend;
                }
        }
        __except(1)
        {
                //KdPrint(("内存不可读\n"));
                status = NULL;
                goto tend;
        }
tend:
        __try
        {
                KeUnstackDetachProcess (&ApcState);
                ObDereferenceObject(EProcess);
                //ExFreePool (readbuffer);
                //readbuffer=NULL;
                //KdPrint(("IoReadMemory完成"));
        }
        __except(1)
        {
                status = NULL;
                goto end;
        }
end:
                KeReleaseSpinLockFromDpcLevel(&lock1);
                return status;
}
2014-1-5 19:53
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看看dump的信息吧,看提示的什么   走到哪里蓝的
2014-1-5 22:22
0
雪    币: 136
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不会,菜鸟Y.Y
2014-1-6 16:52
0
雪    币: 220
活跃值: (117)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
1.看该函数执行时的irql等级
2.是否使用了如ansi转unicode之类的函数(unicode表是放在分页内存的.如果使用.有几率触发切换.如果irql等级高.则会蓝屏)
2014-1-6 17:38
0
雪    币: 136
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
如果irql等级高.则会蓝屏,可能是这个原因,具体能贴两句代码吗,大哥,我新手
2014-1-6 23:15
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
if (!ProcessId)return NULL;
2014-1-7 00:24
0
雪    币: 136
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这句代码有问题?
2014-1-7 19:21
0
雪    币: 0
活跃值: (251)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
慢慢试 别着急 相信在不久的将来你会成功的
2014-1-7 20:31
0
雪    币: 136
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
感觉就是irql的问题
2014-1-8 19:55
0
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
12
大致看了下,感觉这句可能有些问题,LZ妨测试下。

RtlCopyMemory (&readbuffer, BaseAddress, BufferSize);

&readbuffer 是一个栈地址吧?这样你把数据复制到栈里了,而不是动态申请的内存中。
2014-1-15 10:53
0
雪    币: 136
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不能复制到栈里?我以前是复制到动态分配的内存里,也是蓝屏
2014-1-22 22:14
0
雪    币: 136
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
错误代码0x0000000A IRQL NOT OR LESS EQUAL
2014-1-22 22:51
0
雪    币: 136
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
解决了,因为XP和WIN7内存管理不一样的原因,XP如果读了高八位的内存,就会蓝屏,而WIN7不会
2014-2-21 01:25
0
游客
登录 | 注册 方可回帖
返回
//