首页
社区
课程
招聘
[求助][求助]利用PsSetCreateProcessNotifyRoutine 从结构USER_PROCESS_PARAMETER取得的结果有异常
发表于: 2015-8-7 19:33 7313

[求助][求助]利用PsSetCreateProcessNotifyRoutine 从结构USER_PROCESS_PARAMETER取得的结果有异常

2015-8-7 19:33
7313
最近在做一个进程监视器,这个对大家来说也许都没有什么难度了,不过在我这里遇到些小问题,很奇怪的,请大家帮帮我,看问题出在哪里?(WindowsXP SP2下)

在DriverEntry中使用PsSetCreateProcessNotifyRoutine挂上监控进程的函数ProcessCreateMon
  status = PsSetCreateProcessNotifyRoutine(ProcessCreateMon, FALSE);
    if (!NT_SUCCESS( status ))
    {
        DbgPrint("PsSetCreateProcessNotifyRoutine()\n");
        return status;
    }
下面是ProcessCreateMon这个函数:
VOID ProcessCreateMon ( IN HANDLE hParentId, IN HANDLE PId,IN BOOLEAN bCreate )
{

    PEPROCESS  EProcess;
    ULONG      ulCurrentProcessId;
    LPTSTR       lpCurProc;
    NTSTATUS   status;
    PEPROCESS  pep;
    ULONG ulOffset;
    ULONG ulPathOffset;
  
    GetImageFileNameOffset(&ulOffset);
    status = PsLookupProcessByProcessId( (ULONG)PId, &EProcess);
    if (!NT_SUCCESS( status ))
    {
        DbgPrint("PsLookupProcessByProcessId()\n");
        return ;
    }
   
  
    if ( bCreate )
    {
        lpCurProc = (LPTSTR)EProcess;
        lpCurProc = lpCurProc + ulOffset;
        ulPathOffset = (ULONG)EProcess + 0x1b0;  //PEB
        ulPathOffset = *(PULONG)ulPathOffset;
        if ( !MmIsAddressValid( (PVOID)ulPathOffset ))   //检测PEB是否有效
     {
  DbgPrint("Peb is invalid!\n");
  return;
        }
        ulPathOffset += 0x10; //通过PEB获得RTL_USER_PROCESS_PARAMETERS
        ulPathOffset = *(PULONG)ulPathOffset;
        if ( !MmIsAddressValid( (PVOID)ulPathOffset ))   //检测RTL_USER_PROCESS_PARAMETERS是否有效
     {
  DbgPrint("RTL_USER_PROCESS_PARAMETERS is invalid!\n");
  return;
        }
        ulPathOffset += 0x38; //通过RTL_USER_PROCESS_PARAMETERS获得ImagePathName
        ulPathOffset = *(PULONG)ulPathOffset;
        if ( !MmIsAddressValid( (PVOID)ulPathOffset ))   //检测ImagePathName是否有效
     {
  DbgPrint("ImagePathName is invalid!\n");
  return;
        }

        DbgPrint(" Process Full Path Name: %ws\n", (PCWSTR)ulPathOffset);    //输出路径信息  

        DbgPrint( "CREATE PROCESS = PROCESS NAME: %s , PROCESS PARENTID: %d, PROCESS ID: %d, PROCESS ADDRESS %x:\n",
                              lpCurProc,
                              hParentId,
                              PId,
                              EProcess );
    }
    else
    {

        DbgPrint( "TERMINATED == PROCESS ID: %d\n", PId);

    }

}

在虚拟机中加载驱动,用windbg调试,却总是发现获取的PEB或者RTL_USER_PROCESS_PARAMETERS不正确。

比如:在获取的EProcess是:0x813d0020
在Windbg中 dt _EPROCESS 0x813d0020
显示:......
      +0x174 ImageFileName    : [16]  "DbgView.exe"
         ......
         +0x1b0 Peb              : 0x7ffd9000 _PEB
再:dt _PEB 0x7ffd9000 得到
kd> dt _PEB 0x7ffd9000
nt!_PEB
   +0x000 InheritedAddressSpace : 0x4c 'L'
   +0x001 ReadImageFileExecOptions : 0xfe ''
   +0x002 BeingDebugged    : 0x5c '\'
   +0x003 SpareBool        : 0x2 ''
   +0x004 Mutant           : 0x025d0000
   +0x008 ImageBaseAddress : 0x025c2000
   +0x00c Ldr              : (null)
   +0x010 ProcessParameters : 0x00001e00 _RTL_USER_PROCESS_PARAMETERS
   ......
这个时候ProcessParameters 的值0x00001e00就已经不正确了,请问这是为什么啊???
怎么才能在监控进程启动的时候获取其全路径呢?

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 55
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己来吧
2015-8-7 22:08
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
在XP中,进程回调里的RTL_USER_PROCESS_PARAMETERS值还没有被初始化。
2015-8-8 01:23
0
雪    币: 55
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感觉应该是这样,那有什么别的办法吗??
2015-8-8 16:04
0
雪    币: 284
活跃值: (106)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
5
不是没有初始化,是notify 里面要用offset取值,注意红色部分

        PRTL_USER_PROCESS_PARAMETERS lpProcessParams;
       .........
        PWCHAR lpwszCmdLine = NULL;
       
                lpwszCmdLine = lpProcessParams->CommandLine.Buffer;
                if ((ULONG_PTR)lpwszCmdLine < (ULONG_PTR)lpProcessParams)
                {
                        lpwszCmdLine =(WCHAR *)((DWORD)lpProcessParams->CommandLine.Buffer + (ULONG)lpProcessParams);
                }
2015-8-12 21:48
0
雪    币: 55
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
实在想不明白,为什么要这样写,求赐教。
2015-8-20 17:39
0
雪    币: 88
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
主线程还没运行的进程的PROCESS_PARAMETERS还处于规格化状态,里面的UNICODE_STRING的Buffer是相对于PROCESS_PARAMETER的地址的,因此PROCESS_PARAMETER的地址加上CommandLine.Buffer才是实际地址
如果装载已经完成就是实际地址
2016-3-15 22:43
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这个写法够山寨的。。。实际是要判断User parameters里的flags决定是不是已经normalize 了,具体看源码
2016-4-1 00:21
0
游客
登录 | 注册 方可回帖
返回
//