一点儿 发表于 2011-8-6 08:44:55

objectHook简单介绍

其实这东西很多大牛多玩腻了的东西,看下论坛上比较少这类的,就来献献丑,科普一下 大牛们直接
可以飘过,这东西主要是自我复习一下OBJECT的一些知识,技术这东西久了不弄容易忘记,所以
拿出来跟和我一样菜的菜鸟们分享一下。如果有不对的地方欢迎大家指正,这样对于自己也进步得
快点,多多交流,互相学习,水平才能提高得快。
   第一我们先看下OBJECT的组成 主要是3部分 如下图
            
         |---------|
             | 附加信息| --->主要的几个结构是 OBJECT_HEADER_CREATOR_INFO 创建信息
                              OBJECT_HEADER_NAME_INFO 这里面有对象名等主要信息
                              OBJECT_HEADER_HANDLE_INFO 一些句柄信息         
         |_________|               
             |                   |
             | 对象头      |---->   一个重要的结构   OBJECT_HEADER            
             |_________|
             |                  |
             | OBJECT      | --->       对象               
         |_________|
   我们主要看下OBJECT_HEADER这个数据结构几个重要我成员我注释出来

typedef struct _OBJECT_HEADER {
LONG PointerCount;
union {
    LONG HandleCount;
    PSINGLE_LIST_ENTRY SEntry;
};
POBJECT_TYPE Type; //这个很重要HOOK就靠它,对象类型结构也是一个对象,TYPE它是系统第一个创建出来的对象类型
UCHAR NameInfoOffset; //OBJECT_HEADER_NAME_INFO 偏移
UCHAR HandleInfoOffset; //OBJECT_HEADER_HANDLE_INFO 偏移
UCHAR QuotaInfoOffset;
UCHAR Flags;
union
{
    POBJECT_CREATE_INFORMATION ObjectCreateInfo;
    PVOID QuotaBlockCharged;
};

PSECURITY_DESCRIPTOR SecurityDescriptor;
QUAD Body;//对象本身
} OBJECT_HEADER, *POBJECT_HEADER;
对象类型结构
typedef struct _OBJECT_TYPE {
ERESOURCE Mutex;
LIST_ENTRY TypeList; //队列
UNICODE_STRING Name;
PVOID DefaultObject;
ULONG Index;
ULONG TotalNumberOfObjects;
ULONG TotalNumberOfHandles;
ULONG HighWaterNumberOfObjects;
ULONG HighWaterNumberOfHandles;
OBJECT_TYPE_INITIALIZER TypeInfo; //这个很重要,下面讲这个结构
#ifdef POOL_TAGGING
ULONG Key;
#endif
} OBJECT_TYPE, *POBJECT_TYPE;
对象类型结构主要是创建对象类型比如*IoFileObjectType,*PsProcessType,*PsThreadType这些类型
系统初始化的时候第一个创建的对象类型结构就是TYPE类型结构生成对象目录\ObjectTypes 其它后面的
比如文件对象类型就挂在\ObjectTypes\File 再比如\ObjectTypes\Device
说白点就是你要生成对象就会创建(指定)相对应的对象类型结构
最重要的一个数据结构
typedef struct _OBJECT_TYPE_INITIALIZER {
USHORT Length;
BOOLEAN UseDefaultObject;
BOOLEAN CaseInsensitive;
ULONG InvalidAttributes;
GENERIC_MAPPING GenericMapping;
ULONG ValidAccessMask;
BOOLEAN SecurityRequired;
BOOLEAN MaintainHandleCount;
BOOLEAN MaintainTypeList;
POOL_TYPE PoolType;
ULONG DefaultPagedPoolCharge;
ULONG DefaultNonPagedPoolCharge;
PVOID DumpProcedure;/*
PVOID OpenProcedure;      这几个函数指针就是我们最需要的
PVOID CloseProcedure;       这些函数都是决定你的对象的的一些
PVOID DeleteProcedure;      操作或者叫方法,比如打开 创建 删除
PVOID ParseProcedure;       不同的对象类型(OBJECT_TYPE)操作也不同
PVOID SecurityProcedure;    所以要清楚的知道(OBJECT_TYPE)对象是什么类型
PVOID QueryNameProcedure;   如果没有配置系统调用的对象类型 都是用NtOpenFile
PVOID OkayToCloseProcedure;*/
} OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;


这些方法何时被调用呢,我举个例子
当你调用NtCreateFile->IoCreateFile->ObOpenObjectByName->ObpLookupObjectName->IopParseFile->IopParseDevice
IopParseFile最终也会调用IopParseDevice
ObjectHook其实就是比如你要HOOK 创建打开就是OBJECT_TYPE_INITIALIZER->ParseProcedure
说了一大堆废话 上段代码。**** Hidden Message *****

a6226023 发表于 2012-2-18 14:36:10

谢谢看看原理

zhangchenggu 发表于 2012-2-24 15:46:33

回复 1# 一点儿


    这种东东就没易语言的代码

seny11 发表于 2014-1-10 16:48:00

111111111111

Bluesky0702 发表于 2014-1-11 00:38:09

Nice, thanks for share

a8618 发表于 2014-1-12 00:18:14

OBJ没深入了解过

love七夕 发表于 2018-8-6 17:38:36

谢谢看看原理

dxl3210000 发表于 2022-7-21 19:56:53

1111111111
页: [1]
查看完整版本: objectHook简单介绍