能力值:
( LV12,RANK:210 )
|
-
-
2 楼
DesiredAccess==2是否偶然?
|
能力值:
( LV9,RANK:260 )
|
-
-
3 楼
可以判断返回地址落在哪个函数范围内(或者判断返回地址离&PspCreateProcess和&PspTerminateProcess哪个更近)。
返回地址在堆栈里找。
|
能力值:
( LV9,RANK:260 )
|
-
-
4 楼
当然不是偶然。
WRK中对Process Specific Access Rights定义如下:
//
// Process Specific Access Rights
//
#define PROCESS_TERMINATE (0x0001) // winnt
#define PROCESS_CREATE_THREAD (0x0002) // winnt
#define PROCESS_SET_SESSIONID (0x0004) // winnt
#define PROCESS_VM_OPERATION (0x0008) // winnt
#define PROCESS_VM_READ (0x0010) // winnt
#define PROCESS_VM_WRITE (0x0020) // winnt
// begin_ntddk begin_wdm begin_ntifs
#define PROCESS_DUP_HANDLE (0x0040) // winnt
// end_ntddk end_wdm end_ntifs
#define PROCESS_CREATE_PROCESS (0x0080) // winnt
#define PROCESS_SET_QUOTA (0x0100) // winnt
#define PROCESS_SET_INFORMATION (0x0200) // winnt
#define PROCESS_QUERY_INFORMATION (0x0400) // winnt
#define PROCESS_SET_PORT (0x0800)
#define PROCESS_SUSPEND_RESUME (0x0800) // winnt
………………
另外楼主是什么版本的系统呀?
我是xp sp3,以下是我的测试结果:
PspCreateProcess中是这样调用ObReferenceObjectByHandle 的:
kd> u
nt!PspCreateProcess+0x42:
805c69e0 744a je nt!PspCreateProcess+0x8e (805c6a2c)
805c69e2 56 push esi
805c69e3 8d4580 lea eax,[ebp-80h]
805c69e6 50 push eax
805c69e7 ff75df push dword ptr [ebp-21h]
805c69ea ff35b8a75580 push dword ptr [nt!PsProcessType (8055a7b8)]
805c69f0 6880000000 push 80h //PROCESS_CREATE_PROCESS
805c69f5 ff7514 push dword ptr [ebp+14h]
kd> u
nt!PspCreateProcess+0x5a:
805c69f8 e85fa1feff call nt!ObReferenceObjectByHandle (805b0b5c)
…………
80h,也就是PROCESS_CREATE_PROCESS。
PspTerminateProcess是通过PspTerminateThreadByPointer结束进程中的每个线程来实现的,其参数本来就是EPROCESS,所以并没有调用ObReferenceObjectByHandle函数。
根据WRK,是NtTerminateProcess函数调用了ObReferenceObjectByHandle,代码如下:
st = ObReferenceObjectByHandle (ProcessHandle,
PROCESS_TERMINATE,
PsProcessType,
KeGetPreviousModeByThread(&Self->Tcb),
&Process,
NULL);
即DesiredAccess 为 PROCESS_TERMINATE。
|
能力值:
( LV12,RANK:210 )
|
-
-
5 楼
对 搞错了 是NtTerminateProcess
|
能力值:
( LV12,RANK:210 )
|
-
-
6 楼
我整错了。谢谢fypher.根据DesiredAccess参数就可以区分了
|
|
|