首页
社区
课程
招聘
[求助]从PEB中获取的ProcessParameters总是不正确,请大家帮我看看原因啊!谢谢
发表于: 2009-5-13 10:18 10396

[求助]从PEB中获取的ProcessParameters总是不正确,请大家帮我看看原因啊!谢谢

2009-5-13 10:18
10396
最近在做一个进程监视器,这个对大家来说也许都没有什么难度了,不过在我这里遇到些小问题,很奇怪的,请大家帮帮我,看问题出在哪里?(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就已经不正确了,请问这是为什么啊???
怎么才能在监控进程启动的时候获取其全路径呢?

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

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 285
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
PsSetCreateProcessNotifyRoutineEx

回调VOID
CreateProcessNotifyEx (
  __inout PEPROCESS  Process,
  __in HANDLE  ProcessId,
  __in_opt PPS_CREATE_NOTIFY_INFO  CreateInfo
  );

typedef struct _PS_CREATE_NOTIFY_INFO {
  __in SIZE_T  Size;
  union {
      __in ULONG  Flags;
      struct {
          __in ULONG  FileOpenNameAvailable : 1;
          __in ULONG  Reserved : 31;
      };
  };
  __in HANDLE  ParentProcessId;
  __in CLIENT_ID  CreatingThreadId;
  __inout struct _FILE_OBJECT  *FileObject;
  __in PCUNICODE_STRING  ;
  __in_opt PCUNICODE_STRING  CommandLine;
  __out NTSTATUS  CreationStatus;
} PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO;

ImageFileName
2009-5-13 10:44
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
to gaouestc:

这里的ImageFileName是全路径文件名吗?
2009-5-13 10:47
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
PsSetCreateProcessNotifyRoutineEx --这个是不是不能在XP下用?
2009-5-13 10:55
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
5
2楼那个函数只能在vista sp1以后才能用,太挫了~
2009-5-13 13:04
0
雪    币: 254
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
那个指针貌似还指向另一个结构的
2009-5-13 13:50
0
雪    币: 44
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
PEB在用户空间吧
2009-5-13 14:06
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
用另一种方法可以获得进程全路径名了,可是为什么上面提的这种方法不行呢?
2009-5-13 14:30
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我还是想知道原因啊,哪位大侠有空的话指点一下,谢谢
2009-5-14 09:12
0
雪    币: 254
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我都找到过命令参数。
if (!ReadProcessMemory( hProcess,
Peb.ProcessParameters,
&ProcParam,
sizeof(PROCESS_PARAMETERS),
&dwDummy
)
)
goto cleanup;
lpAddress = ProcParam.CommandLine.Buffer;
2009-5-14 11:01
0
雪    币: 14
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hup
11
to evilcode: 你这是在应用层吧,我想在驱动中获得进程全路径
2009-5-14 11:26
0
雪    币: 381
活跃值: (140)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
12
应该可以的,自己再仔细对照着看看吧
kd> dt _peb 7FFDA000
nt!_PEB
+0x000 InheritedAddressSpace : 0 ''
+0x001 ReadImageFileExecOptions : 0 ''
+0x002 BeingDebugged : 0 ''
+0x003 SpareBool : 0 ''
+0x004 Mutant : 0xffffffff
+0x008 ImageBaseAddress : 0x01000000
+0x00c Ldr : 0x00191e90 _PEB_LDR_DATA
+0x010 ProcessParameters : 0x00020000 _RTL_USER_PROCESS_PARAMETERS
+0x014 SubSystemData : (null)
+0x018 ProcessHeap : 0x00090000
+0x01c FastPebLock : 0x7c99d600 _RTL_CRITICAL_SECTION
+0x020 FastPebLockRoutine : 0x7c921000
+0x024 FastPebUnlockRoutine : 0x7c9210e0
+0x028 EnvironmentUpdateCount : 1
+0x02c KernelCallbackTable : 0x77d12970
+0x030 SystemReserved : [1] 0
+0x034 AtlThunkSListPtr32 : 0
+0x038 FreeList : (null)
+0x03c TlsExpansionCounter : 0
+0x040 TlsBitmap : 0x7c99d5c0
+0x044 TlsBitmapBits : [2] 0xffffffff
+0x04c ReadOnlySharedMemoryBase : 0x7f6f0000
+0x050 ReadOnlySharedMemoryHeap : 0x7f6f0000
+0x054 ReadOnlyStaticServerData : 0x7f6f0688 -> (null)
+0x058 AnsiCodePageData : 0x7ffa0000
+0x05c OemCodePageData : 0x7ffa0000
+0x060 UnicodeCaseTableData : 0x7ffd1000
+0x064 NumberOfProcessors : 1
+0x068 NtGlobalFlag : 0x4000
+0x070 CriticalSectionTimeout : _LARGE_INTEGER 0xffffe86d`079b8000
+0x078 HeapSegmentReserve : 0x100000
+0x07c HeapSegmentCommit : 0x2000
+0x080 HeapDeCommitTotalFreeThreshold : 0x10000
+0x084 HeapDeCommitFreeBlockThreshold : 0x1000
+0x088 NumberOfHeaps : 0x12
+0x08c MaximumNumberOfHeaps : 0x20
+0x090 ProcessHeaps : 0x00121218 -> 0x00090000
+0x094 GdiSharedHandleTable : 0x00480000
+0x098 ProcessStarterHelper : (null)
+0x09c GdiDCAttributeList : 0x14
+0x0a0 LoaderLock : 0x7c99b178
+0x0a4 OSMajorVersion : 5
+0x0a8 OSMinorVersion : 1
+0x0ac OSBuildNumber : 0xa28
+0x0ae OSCSDVersion : 0x300
+0x0b0 OSPlatformId : 2
+0x0b4 ImageSubsystem : 2
+0x0b8 ImageSubsystemMajorVersion : 4
+0x0bc ImageSubsystemMinorVersion : 0xa
+0x0c0 ImageProcessAffinityMask : 0
+0x0c4 GdiHandleBuffer : [34] 0
+0x14c PostProcessInitRoutine : (null)
+0x150 TlsExpansionBitmap : 0x7c99d5b8
+0x154 TlsExpansionBitmapBits : [32] 0
+0x1d4 SessionId : 0
+0x1d8 AppCompatFlags : _ULARGE_INTEGER 0x0
+0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER 0x0
+0x1e8 pShimData : (null)
+0x1ec AppCompatInfo : (null)
+0x1f0 CSDVersion : _UNICODE_STRING "Service Pack 3"
+0x1f8 ActivationContextData : (null)
+0x1fc ProcessAssemblyStorageMap : (null)
+0x200 SystemDefaultActivationContextData : 0x00080000
+0x204 SystemAssemblyStorageMap : (null)
+0x208 MinimumStackCommit : 0
kd> dt _RTL_USER_PROCESS_PARAMETERS poi(7FFDA000+0x010)
nt!_RTL_USER_PROCESS_PARAMETERS
+0x000 MaximumLength : 0x1000
+0x004 Length : 0x664
+0x008 Flags : 0x20001
+0x00c DebugFlags : 0
+0x010 ConsoleHandle : (null)
+0x014 ConsoleFlags : 0
+0x018 StandardInput : (null)
+0x01c StandardOutput : (null)
+0x020 StandardError : (null)
+0x024 CurrentDirectory : _CURDIR
+0x030 DllPath : _UNICODE_STRING "C:\WINDOWS;C:\WINDOWS\system32;C:\WINDOWS\system;C:\WINDOWS;.;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem"
+0x038 ImagePathName : _UNICODE_STRING "C:\WINDOWS\Explorer.EXE"
+0x040 CommandLine : _UNICODE_STRING "C:\WINDOWS\Explorer.EXE"
+0x048 Environment : 0x00010000
+0x04c StartingX : 0
+0x050 StartingY : 0
+0x054 CountX : 0
+0x058 CountY : 0
+0x05c CountCharsX : 0x18
+0x060 CountCharsY : 0x759d1d94
+0x064 FillAttribute : 0x77d1aa3c
+0x068 WindowFlags : 1
+0x06c ShowWindowFlags : 1
+0x070 WindowTitle : _UNICODE_STRING "C:\WINDOWS\Explorer.EXE"
+0x078 DesktopInfo : _UNICODE_STRING "WinSta0\Default"
+0x080 ShellInfo : _UNICODE_STRING "C:\WINDOWS\Explorer.EXE"
+0x088 RuntimeData : _UNICODE_STRING ""
+0x090 CurrentDirectores : [32] _RTL_DRIVE_LETTER_CURDIR
kd> dt _UNICODE_STRING poi(7FFDA000+0x010)+0x038
nt!_UNICODE_STRING
"C:\WINDOWS\Explorer.EXE"
+0x000 Length : 0x2e
+0x002 MaximumLength : 0x30
+0x004 Buffer : 0x00020584 "C:\WINDOWS\Explorer.EXE"
kd> dt _UNICODE_STRING poi(7FFDA000+0x010)+0x40
nt!_UNICODE_STRING
"C:\WINDOWS\Explorer.EXE"
+0x000 Length : 0x2e
+0x002 MaximumLength : 0x30
+0x004 Buffer : 0x000205b4 "C:\WINDOWS\Explorer.EXE"
2009-5-14 11:54
0
雪    币: 125
活跃值: (35)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
确认这时候PEB的所有成员都已经初始化了吗?
2009-5-14 12:56
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
to HSQ: 谢谢啊,我再看看

to wdfa: 如何判断PEB的所有成员初始化呢???
2009-5-14 15:09
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
自己顶啊!!!!
2009-5-15 10:09
0
雪    币: 290
活跃值: (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
判断Peb->Ldr是否是NULL
2009-5-15 11:00
0
游客
登录 | 注册 方可回帖
返回
//