Object Hook 簡單介紹

2021-06-18 22:13:04 字數 3794 閱讀 9538

其實這東西很多大牛多玩膩了的東西,看下論壇上比較少這類的,就來獻獻醜,科普一下 大牛們直接

可以飄過,這東西主要是自我複習一下object的一些知識,技術這東西久了不弄容易忘記,所以

快點,多多交流,互相學習,水平才能提高得快。

第一我們先看下object的組成 主要是3部分 如下圖

我們主要看下object_header這個資料結構幾個重要我成員我注發布來

typedef struct _object_header ; 

pobject_type type; //這個很重要hook就靠它,物件型別結構也是乙個物件,type它是系統第乙個建立出來的物件型別

uchar nameinfooffset; //object_header_name_info 偏移

uchar handleinfooffset; //object_header_handle_info 偏移

uchar quotainfooffset;

uchar flags;

union

; psecurity_descriptor securitydescriptor;

quad body;//物件本身

} object_header, *pobject_header;

物件型別結構

typedef struct _object_type  object_type, *pobject_type;
物件型別結構主要是建立物件型別比如*iofileobjecttype,*psprocesstype,*psthreadtype這些型別

系統初始化的時候第乙個建立的物件型別結構就是type型別結構生成物件目錄\objecttypes 其它後面的

比如檔案物件型別就掛在\objecttypes\file 再比如\objecttypes\device

說白點就是你要生成物件就會建立(指定)相對應的物件型別結構

最重要的乙個資料結構

typedef struct _object_type_initializer  object_type_initializer, *pobject_type_initializer;
這些方法何時被呼叫呢,我舉個例子

當你呼叫ntcreatefile->iocreatefile->obopenobjectbyname->obplookupobjectname->iopparsefile->iopparsedevice

iopparsefile最終也會呼叫iopparsedevice

objecthook其實就是比如你要hook 建立開啟就是object_type_initializer->parseprocedure

說了一大堆廢話 上段**。

#include #define object_to_object_header(o)\

containing_record((o),object_header,body)

#define containing_record(address,type,field)\

((type*)(((ulong_ptr)address)-(ulong_ptr)(&(((type*)0)->field))))

typedef struct _object_type_initializer object_type_initializer, *pobject_type_initializer;

typedef struct _object_type object_type, *pobject_type;

typedef struct _object_create_information object_create_information, *pobject_create_information;

typedef struct _object_header ;

pobject_type type;

uchar nameinfooffset;

uchar handleinfooffset;

uchar quotainfooffset;

uchar flags;

union

; psecurity_descriptor securitydescriptor;

quad body;

} object_header, *pobject_header;

pobject_type ptype= null;

pobject_header addrs=null;

pvoid oldparseprocedure = null;

ntstatus newparseprocedure(in pvoid parseobject,

in pvoid objecttype,

in out paccess_state accessstate,

in kprocessor_mode accessmode,

in ulong attributes,

in out punicode_string completename,

in out punicode_string remainingname,

in out pvoid context optional,

in psecurity_quality_of_service securityqos optional,

out pvoid *object)

return status;

}ntstatus hook()

status = obreferenceobjectbyhandle(hfile,generic_all,null,kernelmode,&pobject,null);

if (!nt_success(status))

kdprint(("pobject is %08x\n",pobject));

addrs=object_to_object_header(pobject);//獲取物件頭

ptype=addrs->type;//獲取物件型別結構 object-10h

kdprint(("ptype is %08x\n",ptype));

oldparseprocedure = ptype->typeinfo.parseprocedure;//獲取服務函式原始位址object_type+9c位置為開啟

kdprint(("oldparseprocedure addrs is %08x\n",oldparseprocedure));

kdprint(("addrs is %08x\n",addrs));

//這裡最好檢查一下oldparseprocedure ,我真的是太懶了。

xgboost簡單介紹 xgboost介紹

xgboost是華盛頓大學博士陳天奇創造的乙個梯度提公升 gradient boosting 的開源框架。至今可以算是各種資料比賽中的大殺器,被大家廣泛地運用。接下來,就簡單介紹一下xgboost和普通的gbdt相比,有什麼不同。何為gradient boosting,gbdt請看我上篇文章 1.梯...

mysql的簡單介紹 mysql的簡單介紹

mysql的簡單介紹 資料庫的內部鏈結 1 連線管理器 使用者或應用程式連線 2 分析器 3 快取區4 優化器 優化器執行的結果交由儲存引擎,再轉向物理層 表空間 myisam每個表有三個檔案 frm 表結構 myd 表資料 myi 表索引 innodb 所有表空間再乙個檔案 資料庫失敗的原因 1 ...

CMM 簡單介紹

什麼是cmm?cmm capability maturity model 軟體能力成熟度模型 國際公認的評估軟體過程成熟度的行業標準 由美國卡內基梅隆大學的軟體工程研究所 sei software engineering institute 受美國國防部委託研究制定並在美國,隨後在全世界推廣實施的一...