日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

涨姿势系列之——内核环境下花式获得CSRSS进程id

發布時間:2023/12/13 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 涨姿势系列之——内核环境下花式获得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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。