1. 通过 pid 获取目标进程的 EPROCESS (PsLookupProcessByProcessId)。如果当前进程不是目标进
程,那么我们切换当前进程,方法当然是通过 KeAttachProcess 或者 KeStackAttachProcess 啦。接下来我们就可以从 _PEB结构中随心所欲的获取目标路径,命令行,啥滴东西了。最后别忘了 Detach (如果你没有 Attach 那么这一步不需要)。2. 通过 pid 获取目标 EPROCESS。然后那,我们用 ObOpenObjectByPointer 函数,记得把 ObjectType
置为 *PsProcessType (置空也行啦)。这样我们就获得了 Process Handle,现在 EPROCESS 指针对我们已经么有用了,释放掉,释放掉!方法是... ObfDereferenceObject。最后通过 ZwQueryInformationProcess大法,最最后,记得 ZwClose 掉 handle! 搞定收工!win32内核程序中进程的pid,handle,eprocess
在win32内核程序开发中,我们常常需要取得某进程的pid或句柄,或者需要检索进程的eprocess结构,很多API函数需要的参数也不同,所以掌 握pid<->handle<->eprocess相互转换的方法会大大提高我们的开发效率。以下就是我自己在实际开发中总结出来的转换方法,在此记录下来,以供需要的朋友参考。
1、pid->handle
OBJECT_ATTRIBUTES ObjectAttributes;
CLIENT_ID clientid;InitializeObjectAttributes(&ObjectAttributes, 0 ,OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 0, 0);clientid.UniqueProcess = (HANDLE)pid;clientid.UniqueThread=0;ZwOpenProcess(&handle, PROCESS_ALL_ACCESS, &ObjectAttributes, &clientid); handle即为所求。2、handle->pid
PROCESS_BASIC_INFORMATION pbi;
ns = ZwQueryInformationProcess(ProcessHandle, ProcessBasicInformation, (PVOID)&pbi, sizeof(ProcessBasicInformation), NULL);pid = pbi.UniqueProcessId; pid即为所求。3、pid->eprocess
PEPROCESS pEProc;
PsLookupProcessByProcessId((HANDLE)pid, &pEProc);ObDereferenceObject(pEProc); pEProc即为所求eprocess的指针。4、handle->eprocess
暂未发现直接转换的方法,可由handle->pid->eprocess。
5、eprocess->pid
_EPROCESS.UniqueProcessId即为所求,虽然声明类型为HANDLE,但实际上是pid。
6、eprocess->handle
暂未发现直接转换的方法,可由eprocess->pid->handle。
4、handle->eprocess暂未发现直接转换的方法,可由handle->pid->eprocess。
这个我来完善吧.
st = ObReferenceObjectByHandle (ProcessHandle,
PROCESS_TERMINATE,PsProcessType,KeGetPreviousModeByThread(&Self->Tcb),&Process,NULL);6、eprocess->handle
暂未发现直接转换的方法,可由eprocess->pid->handle。
这个也完善下.
Status = ObOpenObjectByPointer(Process,Attributes,&AccessState,0,PsProcessType,PreviousMode,&Handle);