分析控制代碼表

2021-10-18 13:26:22 字數 2314 閱讀 5808

一、什麼是控制代碼

當乙個程序建立或者開啟乙個核心物件時,將獲得乙個控制代碼,通過這個控制代碼可以訪問核心物件。

如:createmutex、createevent 、createthread 等函式就會返回乙個handle類行值,這種就叫控制代碼,對應著乙個核心物件。

呼叫closehandle 函式對應某個核心物件計數減一,當核心物件計數為0,這個物件就被銷毀了。

核心物件在核心儲存,直接把位址給3環用很不安全,所以微軟設計了控制代碼(handle)給3環使用,控制代碼是乙個整數,它的值除以4是控制代碼表的下標,通過下標能找到儲存在控制代碼表裡的控制代碼表項,每個佔8位元組。

控制代碼存在的目的是為了避免在應用層直接修改核心物件。

handle g_hevent = createevent(null, true, false, null);

如果g_hevent儲存的就是event核心物件的位址,那麼就意味著我們可以在應用層修改這個位址,一旦指向了無效的核心記憶體位址就會藍屏。           

windows的設計理念:

1) 隱藏核心物件指標

2) 控制代碼就是個索引

二、控制代碼表,控制代碼表項

控制代碼表儲存在 eprocess.objecttable.tablecode 裡:

控制代碼表項每個佔8位元組,乙個頁4kb,所以乙個頁能儲存512個控制代碼表項,當程序中的控制代碼數量超過512,控制代碼表就會以分級形式儲存,最多**:

tablecode 的低2位,它表明了控制代碼表的結構,如果低2位是01,表示現在控制代碼表有兩級, tablecode 指向的表儲存了 4kb / 4 = 1024 個控制代碼表的位址,每個位址指向乙個控制代碼表。

通過程式設計構造超過512個控制代碼,看看 tablecode 的低2位確實是01

通過控制代碼表項找到核心物件(控制代碼數量少於512)

下面我們編寫乙個程式,開啟計算器的程序控制代碼,然後在windbg裡通過控制代碼表找到計算器的eprocess:

0xe2032d18低2

位是0,表示當前程序的控制代碼表只有一級,然後我們找一下下標為

70的項:

這裡列印了下標70的項,同時,+8就是下標71的項,就是我們呼叫 sethandleinformation 修改了控制代碼屬性的最後乙個項,觀察它們的區別,最高位元組不相同。

控制代碼表項包含64位,其中低32位的低3位清零後就是核心物件頭(此處是eprocess)的虛擬位址,注意,指向核心物件頭 object_header,這個結構大小是 0x18,所以要加上 0x18 才能找到 eprocess.

控制代碼表及全域性控制代碼表

控制代碼表結構 1.這一塊共計兩個位元組,低位元組保留為0,高位位元組是給sethandleinformation這個函式用的,比如寫成sethandleinformation handle,handle flag protect from close,handle flag protect fro...

控制代碼表和pspcidtable

首先要先bs一下自己.一直以為程序的控制代碼表和pspcidtable是一樣的.結果因為概念上的理解錯誤導致偶浪費了不少時間.多虧好心的fc的耐心指導算是明白一些.總結一下fc教偶的 pspcidtable與程序控制代碼表沒有直接關係.它只是借用了控制代碼表的結構.它裡面存的內容是 eprocess...

04 控制代碼表

核心物件概念 像程序 執行緒 檔案 互斥體 事件等在核心中都有乙個結構體,這些結構體由核心負責管理,我們管這些結構體叫做核心物件。應用層 程序 執行緒 檔案 核心層 eprocess ethread file obje 判斷核心是否核心物件小技巧 在搜尋closehandle 函式,其關閉的都是核心...