看流星社区

 找回密码
 注册账号
查看: 3380|回复: 7

objectHook简单介绍

[复制链接]

该用户从未签到

发表于 2011-8-6 08:44:55 | 显示全部楼层 |阅读模式
其实这东西很多大牛多玩腻了的东西,看下论坛上比较少这类的,就来献献丑,科普一下 大牛们直接
可以飘过,这东西主要是自我复习一下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
说了一大堆废话 上段代码。
游客,如果您要查看本帖隐藏内容请回复

该用户从未签到

发表于 2012-2-18 14:36:10 | 显示全部楼层
谢谢看看原理

该用户从未签到

发表于 2012-2-24 15:46:33 | 显示全部楼层
回复 1# 一点儿


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

该用户从未签到

发表于 2014-1-10 16:48:00 | 显示全部楼层
111111111111

该用户从未签到

发表于 2014-1-11 00:38:09 | 显示全部楼层
Nice, thanks for share

该用户从未签到

发表于 2014-1-12 00:18:14 | 显示全部楼层
OBJ没深入了解过

该用户从未签到

发表于 2018-8-6 17:38:36 | 显示全部楼层
谢谢看看原理
  • TA的每日心情
    大哭
    2020-9-8 14:41
  • 发表于 2022-7-21 19:56:53 | 显示全部楼层
    1111111111
    点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
    您需要登录后才可以回帖 登录 | 注册账号

    本版积分规则

    小黑屋|手机版|Archiver|看流星社区 |网站地图

    GMT+8, 2024-4-27 03:07

    Powered by Kanliuxing X3.4

    © 2010-2019 kanliuxing.com

    快速回复 返回顶部 返回列表