首页
社区
课程
招聘
[原创]自己定义Object Type对抗Object Hook
发表于: 2012-5-8 23:43 17980

[原创]自己定义Object Type对抗Object Hook

2012-5-8 23:43
17980

莫灰灰版主说“Object hook 自己定义Process Type和Thread Type才是王道。 ”
今天咱就来这个。
Windows系统的各种资源以对象(Object)的形式来组织,例如File Object, Driver Object,Device Object等等,但实际上这些所谓的“对象”在系统的对象管理器(Object Manager)看来只是完整对象的一个部分——对象实体(Object Body)。各种Object的共有的信息(例如,对象类型、对象的引用计数、句柄数等信息)保存在OBJECT_HEADER与其他的几个结构中。换而言之,在对象管理器内部,不同类型的对象具有相同的Object Header,但Object Body部分却是不同的。

  一个对象由三部分组成,在Object Header之前是一段变长的区域,由四个独立的结构体组成:

typedef struct _OBJECT_HEADER_QUOTA_INFO {
  ULONG PagedPoolCharge;
  ULONG NonPagedPoolCharge;
  ULONG SecurityDescriptorCharge;
  PEPROCESS ExclusiveProcess;
  #ifdef _WIN64
  ULONG64 Reserved; // Win64 requires these structures to be 16 byte aligned.
  #endif
  } OBJECT_HEADER_QUOTA_INFO, *POBJECT_HEADER_QUOTA_INFO;
  typedef struct _OBJECT_HEADER_HANDLE_INFO {
  union {
  POBJECT_HANDLE_COUNT_DATABASE HandleCountDataBase;
  OBJECT_HANDLE_COUNT_ENTRY SingleEntry;
  };
  } OBJECT_HEADER_HANDLE_INFO, *POBJECT_HEADER_HANDLE_INFO;
  // begin_ntosp
  typedef struct _OBJECT_HEADER_NAME_INFO {
  POBJECT_DIRECTORY Directory;
  UNICODE_STRING Name;
  ULONG QueryReferences;
  #if DBG
  ULONG Reserved2;
  LONG DbgDereferenceCount;
  #ifdef _WIN64
  ULONG64 Reserved3; // Win64 requires these structures to be 16 byte aligned.
  #endif
  #endif
  } OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_NAME_INFO;
  // end_ntosp
  typedef struct _OBJECT_HEADER_CREATOR_INFO {
  LIST_ENTRY TypeList;
  HANDLE CreatorUniqueProcess;
  USHORT CreatorBackTraceIndex;
  USHORT Reserved;
  } OBJECT_HEADER_CREATOR_INFO, *POBJECT_HEADER_CREATOR_INFO;
kd> dt nt!_object_header 8985d9f0
  nt!_OBJECT_HEADER
  +0x000 PointerCount : 6
  +0x004 HandleCount : 0
  +0x004 NextToFree : (null)
  +0x008 Type : 0x898df3b0 _OBJECT_TYPE
  +0x00c NameInfoOffset : 0x10 ''
  +0x00d HandleInfoOffset : 0 ''
  +0x00e QuotaInfoOffset : 0 ''
  +0x00f Flags : 0x32 '2'
  +0x010 ObjectCreateInfo : 0x00000001 _OBJECT_CREATE_INFORMATION
  +0x010 QuotaBlockCharged : 0x00000001
  +0x014 SecurityDescriptor : 0xe100c843
  +0x018 Body : _QUAD

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 6
支持
分享
最新回复 (15)
雪    币: 149
活跃值: (151)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
沙发,学习。。还在啃基础。
2012-5-8 23:50
0
雪    币: 316
活跃值: (128)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
3
膜拜肯放血的大牛!
2012-5-9 00:26
0
雪    币: 270
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
支持楼主 辛苦了
2012-5-9 08:24
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
5
Object hook 自己定义Process Type和Thread Type才是王道


如果是security就搞 checkobjectaccess,如果是open就搞incrementhandlecount.

template<>
class CObject<Win32Win7Sp0,32>:
    public CObjectBase
{
    bool PatchOpenProcedure(void* pvNtosBase,unsigned long ulSize) const
    {
        PUCHAR pucBase = static_cast<PUCHAR>(pvNtosBase);

        KdPrint(("Find begin:%p\n",pucBase));

        bool bRet = false;

        for (unsigned long i = 0; i < ulSize; ++i)
        {
            if (*pucBase == 0xFF &&
                *(pucBase + 1) == 0x74 &&
                *(pucBase + 2) == 0x24 &&
                *(pucBase + 3) == 0x1C &&
                *(pucBase + 4) == 0xFF &&
                *(pucBase + 5) == 0x75 &&
                *(pucBase + 6) == 0x0C &&
                *(pucBase + 7) == 0xFF &&
                *(pucBase + 8) == 0x75 &&
                *(pucBase + 9) == 0x14 &&
                *(pucBase + 10) == 0xFF &&
                *(pucBase + 11) == 0x75 &&
                *(pucBase + 12) == 0x10 &&
                *(pucBase + 13) == 0xFF &&
                *(pucBase + 14) == 0x75 &&
                *(pucBase + 15) == 0x18 &&
                *(pucBase + 16) == 0xFF &&
                *(pucBase + 17) == 0x75 &&
                *(pucBase + 18) == 0x08 &&
                *(pucBase + 19) == 0xFF &&
                *(pucBase + 20) == 0x57 &&
                *(pucBase + 21) == 0x5C)
            {
               //此处省略

                bRet = true;
            }
        }

        return bRet;
    }
};
2012-5-9 23:58
0
雪    币: 2290
活跃值: (2180)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
6
膜拜楼上 C gaga 大神。
2012-5-10 10:25
0
雪    币: 48
活跃值: (496)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
同样膜拜!居然用c++类模板。
2012-5-11 00:36
0
雪    币: 134
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习了  C++
2012-5-11 00:40
0
雪    币: 615
活跃值: (580)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
看不懂的咋办?
2012-5-11 10:41
0
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
10
标记一下,有时间了回头来学习。
2012-5-11 23:51
0
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不是很明白LZ的意思
OBJECT_TYPE MyProcessTYPE
memcpy(MyProcessTYPE,PsProcessTYPE);
然后
OBJECT_TO_OBJECT_HEADER
ObjectHeader->type = &MyProcessTYPE
这样怎么对抗Object hook 这样是防护进程而已
2012-5-13 22:08
0
雪    币: 286
活跃值: (62)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
xjj
12
===========
额,,是这样的
你创建的时候,游戏已经HOOK了,也就是说,你MEMCPY得到的也是被HOOK的
那么你自己的OBJETTYPE里,你把HOOK解了,这样就等于过滤掉了游戏的OBJECT HOOK

然后把目标的EPROCESS换成这个你自己的OBJECTTYPE,就OK了。

不过,我貌似最开始这样搞的,但MEMCPY好像会有问题,我后来都是自己创建个真的OBJECTTYPE来用。

===================
修正一下:
“看到OpenProcedure了吧。所以在被hook之前要保存_OBJECT_TYPE结构。”
楼主是先保存原始的OBJECTTYPE,所以,他不需要解HOOK那步,游戏启动后,直接把目标的EPROCESS里的OBJETTYPE替换成你自己的就行了。
2012-5-13 23:07
0
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
这个我清楚,
EPROCESS的TYPE就是PsProcessType
Object Type 对抗Object Hook  ,目的不是为了顺利打开进程吗
替换成自己的Type后这个进程还哪能被打开
2012-5-14 04:23
0
雪    币: 1737
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
留个脚印先~~
2012-5-14 07:37
0
雪    币: 286
活跃值: (62)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
xjj
15
=================
恩,确实你理解的是对的,,替换成自己的OBJECTTYPE后,是无法打开的,,看过WRK代码就会知道

所以,这种做法其实是进程防护,而不是对抗~
2012-5-14 11:17
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
16
5楼的方法是经过验证的.(代码是经过精简放上来的,for中的代码不全).
2012-5-14 20:14
0
游客
登录 | 注册 方可回帖
返回
//