阅读:1482回复:7
请大家帮忙看看这段代码的问题,是一个监视进程的CALLBACK的代码
我设置了一个CALLBACK,但是这段代码总是出现问题,会报告PAGE_FAULT_IN_NONPAGED_AREA这个错误。。。我怀疑是读内存,也就是for( i = 0; i < (3*PAGE_SIZE); i++ )
这行开始的时候有错误的页操作。。。但是不知道是怎么发生的,也不知道应当如何修改,请大家帮忙看看(我这么搜索是为了能兼容多个操作系统,这里不能搜索SYSTEM的,因为并非是CURRENT PROCESS),谢谢了 VOID ProcessCreateMon(IN HANDLE hPareentId,IN HANDLE PId,IN BOOLEAN bCreate) { PEPROCESS EProcess; ULONG ulCurrentProcessId; LPTSTR lpCurProc; NTSTATUS status; UCHAR filename_; int i; int j; status = PsLookupProcessByProcessId((ULONG)PId,&EProcess); if (!(NT_SUCCESS(status))) { DbgPrint(("PsLookupProcessByProcessId error\n")); return; } // if (bCreate) // { /* lpCurProc = (LPSTR)EProcess; // KeAcquireSpinLock(&ZSpin.splock,&ZSpin.irql); // ExAcquireFastMutex( &PMMutex ); lpCurProc = (LPSTR)EProcess; for( i = 0; i < (3*PAGE_SIZE); i++ ) { if( !strncmp( ".exe", (PCHAR) EProcess + i, 4 )) { break; } else if( !strncmp(".com", (PCHAR) EProcess + i, 4 )) { break; } } if (i >= (3*PAGE_SIZE)) { return; } for (j=1;j<=i;j++) { filename_ = *((PCHAR)EProcess + i -j); if (((filename_ < 'A') || (filename_ > 'z')) && (filename_ != ' ') && ((filename_ < '0') || (filename_ > '9'))) { break; } } j--; i-=j; DbgPrint(("3_c process,name %s,ppid %d,pid %d,pa %x,i = %d\n",lpCurProc+i,hPareentId,PId,EProcess,i)); if(!strncmp("uedit32.exe",lpCurProc+i,11)) { ZSpid = PId; } //KeReleaseSpinLock(&ZSpin.splock,ZSpin.irql); // ExReleaseFastMutex( &PMMutex ); } else { if (PId == ZSpid) { DbgPrint(("uedit32.exe be terminated\n")); } } } |
|
沙发#
发布于:2005-06-27 15:20
ProcessCreateMon被调用的时候,当前进程和PID并不是同一个进程,你在另外一个进程里面搜索PID的地址空间,当然会BSOD
|
|
板凳#
发布于:2005-06-27 16:49
虽然当前进程和PID不是同一个进程,但对于内核空间来讲,所有进程是共享的,不同的仅仅是用户态空间。崩溃的原因不在这里。
而是if( !strncmp( ".exe", (PCHAR) EProcess + i, 4 )) 不能满足的时候,超过EPROCESS范围越界而导致异常的 |
|
地板#
发布于:2005-06-27 17:53
下面是引用zhaock于2005-06-27 16:49发表的: _____________________________________________________________________ 可是我想只要是EPROCESS结构其里面一定有EXE文件名吧,既然有文件名肯定就有EXE的扩展名,那我在SEARCH的话只要不遇到EXE就永远不会越界的呀。。。。俺是这么想的。。。。。 |
|
地下室#
发布于:2005-06-27 18:50
eprocess的偏移量应在driverentry就要获取到了.
|
|
5楼#
发布于:2005-06-27 18:51
建议看看filemon就知道了.
|
|
6楼#
发布于:2005-06-27 19:09
再贴一遍,一个问题最好不要贴多遍
对于system,idle,就并不以.exe结尾,对于其他不以.exe,.com结尾的Process,因为ImageFileName,算上结尾的0,才16字节,对于以.exe结尾,但超过15字节长的,后面的字符串会被截掉,也不会以.exe结尾了,都会出错。 为什么不在DriverEntry搜索System,搜System的目的是找到NameOffset,这个值对于当前的os,是不变得,后面就可以直接用了,例如在你的Callback里,直接(char*)CurProc+NameOffset,就可以取出来ImageFileName了,不明白你这么做的目的是什么? |
|
7楼#
发布于:2005-06-28 01:56
呵呵,我明白你的意思了,是我没理解好当时看FILEMON SEARCH SYSTEM的含义,谢谢
|
|