首页
社区
课程
招聘
[求助]能否根据参数判断是哪个函数调用ObReferenceObjectByHandle
发表于: 2009-8-9 01:56 5266

[求助]能否根据参数判断是哪个函数调用ObReferenceObjectByHandle

2009-8-9 01:56
5266
PspCreateProcess 调用ObReferenceObjectByHandle
PspTerminateProcess 调用ObReferenceObjectByHandle

怎么区分是哪一个调用的呢?可否从参数上区分?
ObReferenceObjectByHandle(Handle,DesiredAccess,ObjectType,AccessMode,Object,HandleInformation)


PspCreateProcess调用代码:
80605e22 56              push    esi
80605e23 8d458c          lea     eax,[ebp-74h]
80605e26 50              push    eax
80605e27 ff75df          push    dword ptr [ebp-21h]
80605e2a ff35083f5680    push    dword ptr [nt!LpcPortObjectType (80563f08)]
80605e30 56              push    esi
80605e31 ff7524          push    dword ptr [ebp+24h]
80605e34 e82077f6ff      call    nt!ObReferenceObjectByHandle (8056d559)

PspTerminateProcess调用代码:
80605d9d 56              push    esi
80605d9e 8d4588          lea     eax,[ebp-78h]
80605da1 50              push    eax
80605da2 ff75df          push    dword ptr [ebp-21h]
80605da5 ff3540055680    push    dword ptr [nt!DbgkDebugObjectType (80560540)]
80605dab 6a02            push    2
80605dad ff7520          push    dword ptr [ebp+20h]
80605db0 e8a477f6ff      call    nt!ObReferenceObjectByHandle (8056d559)

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
DesiredAccess==2是否偶然?
2009-8-9 01:57
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
3
可以判断返回地址落在哪个函数范围内(或者判断返回地址离&PspCreateProcess和&PspTerminateProcess哪个更近)。
返回地址在堆栈里找。
2009-8-9 04:03
0
雪    币: 636
活跃值: (174)
能力值: ( 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。
2009-8-9 06:25
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
5
对 搞错了 是NtTerminateProcess
2009-8-9 13:27
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
我整错了。谢谢fypher.根据DesiredAccess参数就可以区分了
2009-8-9 13:35
0
游客
登录 | 注册 方可回帖
返回
//