1. 程式人生 > 實用技巧 >控制代碼表

控制代碼表

前言

因為建立程序的時候提到了PROCESS_INFORMATION這個結構體
這個結構體裡面存在兩個值,一個是控制代碼一個是id
什麼是控制代碼?什麼是id?就得深入學習控制代碼表了

0x01. 什麼是核心物件?

像程序、執行緒、檔案、互斥體、事件等在核心中都有一個對應的結構體,由核心負責管理。我們管這樣的物件叫做核心物件

0x02. 如何管理核心物件

比如說我們建立了一個程序,如何核心層,也就是0環那邊給了 EPROCESS 結構體
然後我們在這個程序內 再建立 程序,執行緒,事件,檔案,然後又分別分配了各自的核心結構

0x03. 每個程序都有一個控制代碼表

在0環中有個EPROCESS結構體,結構體裡面有個指標,指向了控制代碼表,我們建立了之後會在EPROCESS結構體中的控制代碼表寫入地址
然後我們想用A的時候,就輸入1,我們想用B的話就輸入2,這就是控制代碼

注意:不是每個核心物件都有表的,只有核心物件有控制代碼表,簡單的說,只有EPROCESS這個才有

0x04.多程序共享一個核心物件


A程序通過CreateProcess建立了一個程序,B程序通過OpenProcess開啟別人建立好的程序
兩個程序用的是同一個核心物件,A程序中有個控制代碼表,然後A核心物件索引為 1,就可以索引使用,C程序也是通過控制代碼表的值

如果再有建立,那麼A核心物件計數器會 加 1;CloseHandle其實就是減計數器,當計數器為0的時候就減小了

注意:控制代碼表是私有的

0x05. 控制代碼是否“可以”被繼承

微軟除了使用上面那個方式共享核心物件,還可以使用另外一種方式進行共享

實際上控制代碼表有三列,而這還有一列是代表著是否可以被繼承

從這邊可以知道子程序可以繼承父程序的控制代碼表,但並不是控制代碼表全部都能繼承,而是允許繼承的才會繼承
這邊就可以知道 索引為 2和4 的可以被繼承,當不被繼承的時候,就會在子程序填0