涨姿势系列之——内核环境下花式获得CSRSS进程id
生活随笔
收集整理的這篇文章主要介紹了
涨姿势系列之——内核环境下花式获得CSRSS进程id
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這個是翻別人的代碼時看到的,所以叫漲姿勢系列。作者寫了一個獲取CSRSS進程PID的函數,結果我看了好久才看懂是這么一個作用。先放上代碼
1 HANDLE GetCsrPid()
2 {
3 HANDLE Process, hObject;
4 HANDLE CsrId = (HANDLE)0;
5 OBJECT_ATTRIBUTES obj;
6 CLIENT_ID cid;
7 UCHAR Buff[0x100];
8 POBJECT_NAME_INFORMATION ObjName = (PVOID)&Buff;
9 PSYSTEM_HANDLE_INFORMATION_EX Handles;
10 ULONG r;
11
12 Handles = GetInfoTable(SystemHandleInformation);
13
14 if (!Handles) return CsrId;
15
16 for (r = 0; r < Handles->NumberOfHandles; r++)
17 {
18 if (Handles->Information[r].ObjectTypeNumber == 21) //Port object
19 {
20 InitializeObjectAttributes(&obj, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
21
22 cid.UniqueProcess = (HANDLE)Handles->Information[r].ProcessId;
23 cid.UniqueThread = 0;
24
25 if (NT_SUCCESS(NtOpenProcess(&Process, PROCESS_DUP_HANDLE, &obj, &cid)))
26 {
27 if (NT_SUCCESS(ZwDuplicateObject(Process, (HANDLE)Handles->Information[r].Handle,NtCurrentProcess(), &hObject, 0, 0, DUPLICATE_SAME_ACCESS)))
28 {
29 if (NT_SUCCESS(ZwQueryObject(hObject, ObjectNameInformation, ObjName, 0x100, NULL)))
30 {
31 if (ObjName->Name.Buffer && !wcsncmp(L"\Windows\ApiPort", ObjName->Name.Buffer, 20))
32 {
33 CsrId = (HANDLE)Handles->Information[r].ProcessId;
34 }
35 }
36
37 ZwClose(hObject);
38 }
39
40 ZwClose(Process);
41 }
42 }
43 }
44
45 ExFreePool(Handles);
46 return CsrId;
47 }
作者干了以下這幾件事:執行ZwQuerySystemInfo函數的第16號功能,這個第16號功能就是SystemHandleInformation,作用是獲取句柄表。之前沒用過這個功能號,MSDN上的頁面也找不到了,找不到頁面大概是因為這個函數現在已經不被支持了吧(Win8)。搜了半天找到了這個功能的結構
typedef struct _SYSTEM_HANDLE_INFORMATION_EX
{
ULONG NumberOfHandles;
SYSTEM_HANDLE_INFORMATION Information[1];
}SYSTEM_HANDLE_INFORMATION_EX, *PSYSTEM_HANDLE_INFORMATION_EX;
typedef struct _SYSTEM_HANDLE_INFORMATION
{
ULONG ProcessId;
UCHAR ObjectTypeNumber;
UCHAR Flags;
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
}SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
就是說每個句柄項都被解釋成
句柄所屬進程的PID
句柄對應對象的類型
句柄值(數字)
句柄對應的對象指針
這個函數查到句柄后,匹配所有的port對象的句柄。然后把這些句柄dump到本進程(因為只有這樣才可以操作句柄),用ZwQueryObject查詢port對象的名稱,匹配\Windows\ApiPort,而這個port對象正是csrss進程創建的,也就說只有csrss進程的句柄表中才會有這個句柄,這樣就實現了查找的csrss進程的目的。
其實我覺得不需要把句柄復制到自己的進程中了,因為已經有對象的指針了,可以直接獲取對象名了。這個做法對我來說比較新鮮,即用句柄來查找進程。
總結
以上是生活随笔為你收集整理的涨姿势系列之——内核环境下花式获得CSRSS进程id的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于AutoMApping 实体映射
- 下一篇: xfire集成spring构建webse