civil_war
驱动牛犊
驱动牛犊
  • 注册日期2004-02-14
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分108分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1481回复:7

请大家帮忙看看这段代码的问题,是一个监视进程的CALLBACK的代码

楼主#
更多 发布于:2005-06-27 13:37
  我设置了一个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"));
              }
       }

}
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-06-27 15:20
ProcessCreateMon被调用的时候,当前进程和PID并不是同一个进程,你在另外一个进程里面搜索PID的地址空间,当然会BSOD
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2005-06-27 16:49
虽然当前进程和PID不是同一个进程,但对于内核空间来讲,所有进程是共享的,不同的仅仅是用户态空间。崩溃的原因不在这里。
而是if( !strncmp( ".exe", (PCHAR) EProcess + i, 4 ))
不能满足的时候,超过EPROCESS范围越界而导致异常的
civil_war
驱动牛犊
驱动牛犊
  • 注册日期2004-02-14
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分108分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-06-27 17:53
下面是引用zhaock于2005-06-27 16:49发表的:
虽然当前进程和PID不是同一个进程,但对于内核空间来讲,所有进程是共享的,不同的仅仅是用户态空间。崩溃的原因不在这里。
而是if( !strncmp( ".exe", (PCHAR) EProcess + i, 4 ))
不能满足的时候,超过EPROCESS范围越界而导致异常的

_____________________________________________________________________
可是我想只要是EPROCESS结构其里面一定有EXE文件名吧,既然有文件名肯定就有EXE的扩展名,那我在SEARCH的话只要不遇到EXE就永远不会越界的呀。。。。俺是这么想的。。。。。
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-27 18:50
eprocess的偏移量应在driverentry就要获取到了.
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-06-27 18:51
建议看看filemon就知道了.
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
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了,不明白你这么做的目的是什么?
civil_war
驱动牛犊
驱动牛犊
  • 注册日期2004-02-14
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分108分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-06-28 01:56
呵呵,我明白你的意思了,是我没理解好当时看FILEMON SEARCH SYSTEM的含义,谢谢
游客

返回顶部