內核程式中進程的pid,handle,eprocess之間相互轉換的方法
- 2019 年 12 月 20 日
- 筆記
在內核程式開發中,我們常常需要取得某進程的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 st = ObReferenceObjectByHandle (ProcessHandle, PROCESS_TERMINATE, PsProcessType, KeGetPreviousModeByThread(&Self->Tcb), &Process, NULL); 5、eprocess->pid _EPROCESS.UniqueProcessId即為所求,雖然聲明類型為HANDLE,但實際上是pid。 6、eprocess->handle Status = ObOpenObjectByPointer( Process, Attributes, &AccessState, 0, PsProcessType, PreviousMode, &Handle ); 總結: 這是句柄、句柄表、對象三者間的關係。 PspCidTable是全局的句柄表,用來存放進程、執行緒對象體,通過進、執行緒的pid作為索引可以在PspCidTable句柄表中找到pid所屬進、執行緒的對象體(既EPROCESS或ETHREAD)。 其次,在進程內部,以handle作為索引,可以在進程的句柄表(ObjectTable)中找到handle代表的對象頭,對象頭+0x18就可得到對象體。以上內容全部可以通過在windbg下驗證。 轉載自:http://bbs.pediy.com/showthread.php?t=119193
