版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、進程句柄表與創(chuàng)建句柄表我們編寫 Windows程序中經(jīng)常使用到內(nèi)核對象, 特別是句柄這個概念, 通過句柄可以對內(nèi)核對象進行訪問,那句柄到底是什么 ?本文將會從內(nèi)核來說明這個概念。Windows 采取了面向?qū)ο笤O(shè)計 , 內(nèi)核中有一個的模塊來管理內(nèi)核對象 , 有很多資料都是說是“對象管理器” ,本文也采用這個概念。對象管理器用來管理內(nèi)核對象信息和記錄內(nèi)核對象的使用情況,包括引用計數(shù)。每個進程都要創(chuàng)建一個句柄列表, 這些句柄指向各種系統(tǒng)資源, 比如信號量,線程,和文件等,進程中的所有線程都可以訪問這些資源性 ) ,如下圖所示,進程和資源:1.進程與句柄表數(shù)據(jù)關(guān)系在用戶模式下如果調(diào)用 CloseHan
2、ele( )表示不再使用這個對象, 在內(nèi)核中進程便會刪除句柄 (釋放對象引用 );對象管理器也會將內(nèi)核對象的引用計數(shù)也會減一 ,當(dāng)對象的句柄引用為 0 時,對象管理器便會釋放這個對象。句柄表最基本作用就是句柄與目標(biāo)對象之間的映射表 ,下圖是進程與句柄的簡化模型圖 (有些數(shù)據(jù)域要經(jīng)過處理 ):_HANDLE_TABLE 是句柄表的信息的結(jié)構(gòu)體 ,在內(nèi)核中 句柄是句柄表中表項的索引 ,在這里可以簡單的理解 ,由索引 ( 句柄 )在句柄表中查找到進程引用的內(nèi)核對象 .在 Windbg 中查看 _HANDLE_TABLE( 這里例出部分有意義的項 )kd> dt _HANDLE_TABLEnt!
3、_HANDLE_TABLE+0x000 TableCode: Uint4B/指向第一層局部表 ,并記錄層數(shù)+0x004 QuotaProcess: Ptr32 _EPROCESS /指向進程 _EPROCESS塊+0x008 UniqueProcessId : Ptr32 Void/進程 ID+0x03c HandleCount: Int4B/句柄計數(shù) ,當(dāng)前使用句柄個數(shù)kd> dt _EPROCESS/進程 _EPROCESS塊信息nt!_EPROCESS+0x084 UniqueProcessId : Ptr32 Void/進程 ID+0x0c4 ObjectTable : Ptr3
4、2 _HANDLE_TABLE/指向 _HANDLE_TABLE 結(jié)構(gòu)2.句柄的數(shù)據(jù)結(jié)構(gòu)內(nèi)核與 SDK 中定義句柄都為 :typedef void *HANDLE;表明句柄是一個無符號整數(shù) ,實際上有效句柄的值時有范圍的 ,大家想想如果采用數(shù)組來存儲句柄需要耗費很大的內(nèi)存 ,Windows 句柄表使用了稀疏數(shù)組 .2.1XP/2003 句柄表項 :先看下句柄表中存放的是什么?句柄表主要是存放的是對象的地址與屬性信息 ,當(dāng)然還要存放句柄表相關(guān)一些信息(審計,空閑項),每個句柄表項是由_HANDLE_TABLE_ENTRY描述的, _HANDLE_TABLE_ENTRY占 8 字節(jié),定義如下:kd
5、> dt _HANDLE_TABLE_ENTRYnt!_HANDLE_TABLE_ENTRY+0x000 Object: Ptr32 Void/對象指針+0x000 ObAttributes: Uint4B+0x000 InfoTable: Ptr32 _HANDLE_TABLE_ENTRY_INFO+0x000 Value: Uint4B+0x004GrantedAccess: Uint4B+0x004GrantedAccessIndex : Uint2B+0x006CreatorBackTraceIndex : Uint2B+0x004NextFreeTableEntry : Int
6、4B由于 _HANDLE_TABLE_ENTRY有些聯(lián)合體 ,不好理解 ,源碼定義如下typedef struct _HANDLE_TABLE_ENTRY union PVOID Object;/對象指針ULONG ObAttributes;/對象屬性PHANDLE_TABLE_ENTRY_INFO InfoTable;ULONG_PTR Value;/值;:union union ACCESS_MASK GrantedAccess;/訪問掩碼struct USHORT GrantedAccessIndex;USHORT CreatorBackTraceIndex;LONG NextFreeT
7、ableEntry;/下一個空閑的句柄表項 ,空閑鏈表索引; HANDLE_TABLE_ENTRY , *PHANDLE_TABLE_ENTRY;表示的意義 :1.對象指針 Object 有效則第二個域為訪問掩碼GrantedAccess2. 第一個域為 0,第二個域可能是 NextFreeTableEntry,也可能為審計 ,后面會有相關(guān)算法用到這個域 ,要根據(jù)上下文來判斷。這里的 Object 并不是“真正”的對象指針,而是包括了對象的指針域?qū)ο蟮膶傩杂颍?由于在內(nèi)核中對象總是 8 字節(jié)對齊的,那么指向?qū)ο蟮闹羔樧畹?3 位總是 0,微軟把這 3 位也利用上, Object 的最低 3 位
8、做為對象的屬性,看下面的一組宏定義:#define OBJ_HANDLE_ATTRIBUTES (OBJ_PROTECT_CLOSE | OBJ_INHERIT | OBJ_AUDIT_OBJECT_CLOSE)第 0 位 OBJ_PROTECT_CLOSE:句柄表項是否被鎖定 ,1 鎖定, 0 未鎖定第 1 位 OBJ_INHERIT: 指向該進程所創(chuàng)建的子進程是否可以繼承該句柄,既是否將該句柄項 拷貝到它的句柄表中第 2 位 OBJ_AUDIT_OBJECT_CLOSE: 關(guān)閉該對象時是否產(chǎn)生一個審計事件2.2XP/2003 句柄表項 :Windows 為了節(jié)省空間采用動態(tài)擴展結(jié)構(gòu), 類似
9、于頁表結(jié)構(gòu) , 最大可擴展3層表 ._HANDLE_TABLE.TableCode存放了第一層局部表的基址指針和層數(shù), 微軟在這里設(shè)計很精妙 , 由于效率32 位地址都以4 對齊 , 最低 2 位為 0,微軟把_HANDLE_TABLE. TableCode的最低兩位作為句柄表層數(shù)的紀(jì)錄, 即 00 一層表 ,01 二層表10三層表 . 句柄表的結(jié)構(gòu)圖如下:一層表 :兩層表時 :_HANDLE_TABLE_ENTRY_HANDLE_TABLE_ENTRY_HANDLE_TABLE_ENTRY三層表時 :_HANDLE_TABLE_ENTRY_HANDLE_TABLE_ENTRY_HANDLE_
10、TABLE_ENTRY有上圖所示 ,最低層局部表都是是存放著 _HANDLE_TABLE_ENTTY 結(jié)構(gòu) ,中間層和最高層都是存放著頁表指針 ,當(dāng)句柄增加時 ,便會判斷是否需要擴展。2.3XP/2003 句柄表表項計數(shù):句柄表是動態(tài)擴展, 當(dāng)引用資源足夠多時, 句柄的數(shù)目也在增加, 當(dāng)?shù)揭欢〝?shù)目時,句柄表便會擴展,擴展的標(biāo)準(zhǔn)是什么?下面一系列宏給出了定義(1) 最低層存放句柄表項數(shù):每個最底層頁表存放的是 _HANDLE_TABLE_ENTRY 結(jié)構(gòu) , 即 4096/8 = 512,其中第一項做審計用 ,最多有 511 個有效項#define LOWLEVEL_COUNT (TABLE_P
11、AGE_SIZE / sizeof(HANDLE_TABLE_ENTRY)(2) 中間層可以存放的項數(shù)中間層存放的頁表指針 ,最多有 4028 / 4 =1024#define MIDLEVEL_COUNT (PAGE_SIZE / sizeof(PHANDLE_TABLE_ENTRY)(3)可分配的最大句柄值 ,不是我們想象的無符號整數(shù)最大值#define MAX_HANDLES (1<<24)/224(4)最高層最大項數(shù) :#define HIGHLEVEL_COUNTMAX_HANDLES/(LOWLEVEL_COUNT*MIDLEVEL_COUNT)在句柄表結(jié)構(gòu)圖已經(jīng)說明層
12、表第一層表最大有項即 2245332/(1024*512) = 2=32,通過上面計算 :二級表最大可以存放 511 * 1024= 523264 個對象引用 ,沒有特殊情況一般來說已經(jīng)夠了 ,所以我們一般只能觀察到一層 ,兩層句柄表3. nt!PspCreateProcess中創(chuàng)建進程句柄表3.1 在創(chuàng)建進程時初始化進程對象并創(chuàng)建進程句柄表創(chuàng)建進程時先創(chuàng)建進程對象,再創(chuàng)建進程句柄表,即nt!PspCreateProcess->nt!ObInitProcess->nt!ExCreateHandleTable,創(chuàng)建句柄表的核心流程圖如下 :分配進程句柄表例程步驟:1.調(diào)用 ExpAl
13、locateHandleTable 分配句柄表及_HANDLE_TABLE結(jié)構(gòu)2. 插入到進程句柄表鏈表函數(shù)描述 :; Routine Description:; This function allocate and initialize a new new handle table; 這個例程分配并初始化一個新的句柄表 (_HANDLE_TABLE); Arguments:; Process - Supplies an optional pointer to the process against which quota; will be charged.; 提供一個將要記錄相關(guān)信息 (對象
14、 )的進程的指針; Return Value:; If a handle table is successfully created, then the address of the; handle table is returned as the function value. Otherwise, a value; NULL is returned.; 如果成功函數(shù)返回 handle table的地址 ,負責(zé)返回 0_HANDLE_TABLE *_stdcall ExCreateHandleTable(_EPROCESS *pProcess)核心算法分析 :由于進程句柄表是一個雙向鏈表結(jié)構(gòu)
15、 ,是系統(tǒng)很重要的數(shù)據(jù)結(jié)構(gòu) ,所以必須考慮同步問題 ,只有在加鎖的情況下才能修改通過 ExpAllocateHandleTable 分配進程句柄表 :push 1 ; DoInitpush ebp+pProcess ; pProcesscall _ExpAllocateHandleTable8 ; 創(chuàng)建句柄表例程 mov ebx, eaxtest ebx, ebx ; 判斷 ExpAllocateHandleTable 是否成功 jz short ALLOC_HANDLE_TABLE_UNSUCCESS句柄表是進程句柄鏈表是內(nèi)核重要結(jié)構(gòu),有同步問題存在 ,這里給句柄表上鎖mov eax, 0;
16、 系統(tǒng)句柄鏈表的改變必須要實現(xiàn)同步操作 ,所以要使用鎖 mov ecx, offset _HandleTableListLocklock bts ecx, eax ; 加鎖加入進程句柄表鏈表mov ecx, _HandleTableListHead.Blink;取_Handle_TABLE.HandleTableList 的 Flink 指針mov eax+_LIST_ENTRY.Flink, ecxmov dword ptr eax, offset _HandleTableListHead.Flink HandleTalbeListHead; 取得句柄表鏈表頭節(jié)點的頭指針地址 mov ecx
17、, eaxmov _HandleTableListHead.Blink, eax;設(shè)置nt!ExpAllocateHandleTable的核心流程 :ExpAllocateHandleTable 例程 :1. 分配 _HANDLE_TABLE 內(nèi)存池與分配一頁內(nèi)存池作為第一層句柄表2. 初始化句柄表3. 建立進程與句柄表的映射關(guān)系函數(shù)描述 :; Routine Description:; This worker routine will allocate and initialize a new handle table; structure. The new structure consis
18、ts of the basic handle table; struct plus the first allocation needed to store handles. This is; really one page divided up into the top level node, the first mid; level node, and one bottom level node.; 例程分配并初始化一個新的句柄表結(jié)構(gòu) ,加入一些存儲句柄的必要的基本結(jié)構(gòu)信息; 到新分配的句柄表結(jié)構(gòu)中 .這里準(zhǔn)備一個頁內(nèi)存分割給高層節(jié)點 ,第一個中間層節(jié)點和一個; 低層節(jié)點; Argumen
19、ts:; Process - Optionally supplies the process to charge quota for the;handle table;提供審計配額信息的進程(并不是指當(dāng)前進程 )的指針; DoInit - If FALSE then we are being called by duplicate and we don't need;the free list built for the caller; 如果 FALSE(copy)時同樣會被調(diào)用 ,并且調(diào)用者不需要釋放創(chuàng)建建的表; Return Value:; A pointer to the new
20、 handle table or NULL if unsuccessful at getting; pool.; 一個指向句柄表 (HANDLE_TABLE) 的指針 ,如果 NULL 表示獲取內(nèi)核內(nèi)存池失敗; _HANDLE_TABLE *_stdcall ExpAllocateHandleTable(_EPROCESS *pProcess, char DoInit)核心算法分析 :分配 _HANDLE_TABLE結(jié)構(gòu)內(nèi)存池 :push6274624Fh; Tagpush44h; sizeof(_HANDLE_TABLE)push1; PoolTypecall_ExAllocatePoolW
21、ithTag12 ; 分配一個大小為sizeof(HANDLE_TABLE) 的內(nèi)核內(nèi)存;池movesi, eaxxorebx, ebxcmpesi, ebx; 判斷內(nèi)存池是否分配成功jzshort AllOC_POOL_UNSUCCESS分配一頁內(nèi)存池作為第一層句柄表pushedipush11hpopecxpush1000h; 一個頁表大小pushebp+pProcess ; _ERPOCESS 指針xoreax, eaxmovedi, esirep stosd; 分配一頁內(nèi)存call_ExpAllocateTablePagedPoolNoZero8 ; 分配一頁內(nèi)存池 ,作為第一級句柄表c
22、mpeax, ebx; 判斷是否分配成功jnzshort AllOC_PAGE_SUCCESS ; 判斷 DoInit參數(shù)是否為 FALSEpushebx; TagToFreepushesi; Pcall_ExFreePoolWithTag8 ; 釋放內(nèi)存分配的內(nèi)存池cmpebp+DoInit, bl ;判斷DoInit參數(shù)是否為FALSEmovesi+_HANDLE_TABLE.TableCode, eax ;HANDLT_TABLE第一項將分配的頁表基地址賦值給TableCode,建立一級表的映射關(guān)系初始句柄表,設(shè)置空閑句柄鏈表:movdword ptr eax+_HANDLE_TABLE
23、_ENTRY.NextFreeTableEntry, 0FFFFFFFEhmovmovjzpushpoppushaddpop; 句柄頁表的第一個句柄項作為審計用,; NextFreeTableEntry 設(shè)置為 EX_ADDITIONAL_INFO_SIGNATURE設(shè)置第一項Value 為 0edx, 800hshort DOINIT_FALSE8ecx; ecx = 84eax, 8; 指向第二項HANDLE_TABLE_ENTRY指針edi; 記錄空閑項鏈表,當(dāng)前為第二項HANDLE_TABLE_ENTRY值為標(biāo)志4END_LOOP:; 設(shè)置當(dāng)前項的下一個空閑句柄索引moveax+_HANDLE_TABLE_ENTRY ._u1.NextFreeTableEntry, ecxmoveax+_HANDLE_TABLE_ENTRY ._u0.Value,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度大型商業(yè)綜合體招商管理合同3篇
- 2025版門樓廣告位租賃與設(shè)計制作合同4篇
- 2025年度旅行社與旅游科技研發(fā)企業(yè)合作協(xié)議4篇
- 2025年按揭車輛交易糾紛調(diào)解服務(wù)合同模板2篇
- 2025年度美食廣場廚師團隊承包與節(jié)假日活動策劃服務(wù)協(xié)議3篇
- 2025年度個人分包合作協(xié)議(智能安防設(shè)施)4篇
- 2025版壓力罐施工與施工許可證申請合同3篇
- 2025年水利工程勞務(wù)分包合同環(huán)境保護與綠色施工規(guī)范3篇
- 二零二五版工業(yè)自動化設(shè)備加工制造合同3篇
- 2025年高速公路服務(wù)區(qū)停車場及餐飲服務(wù)合同3篇
- 2024版?zhèn)€人私有房屋購買合同
- 2024爆炸物運輸安全保障協(xié)議版B版
- 《食品與食品》課件
- 讀書分享會《白夜行》
- 光伏工程施工組織設(shè)計
- DB4101-T 121-2024 類家庭社會工作服務(wù)規(guī)范
- 化學(xué)纖維的鑒別與測試方法考核試卷
- 2024-2025學(xué)年全國中學(xué)生天文知識競賽考試題庫(含答案)
- 臨床微生物檢查課件 第2章細菌的生理
- 作品著作權(quán)獨家授權(quán)協(xié)議(部分授權(quán))
- 取水泵站施工組織設(shè)計
評論
0/150
提交評論