找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 7742|回复: 4

注册表object hook

 火.. [复制链接]

29

主题

134

回帖

4

精华

论坛元老

积分
5970
QQ
发表于 2010-7-15 11:48:15 | 显示全部楼层 |阅读模式
本帖最后由 HoviDelphic 于 2010-7-15 17:18 编辑

最近网上浏览资料时,发现好多关于object hook 自己闲来无事 测试整理了一下,主要借鉴论坛上的各个大牛,测试通过2k到win7。代码附上:
#include <wdm.h>
#define NUMBER_HASH_BUCKETS 37
typedef struct _XP_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;
PVOID SecurityProcedure;
PVOID QueryNameProcedure;
PVOID OkayToCloseProcedure;
} 2K_XP_OBJECT_TYPE_INITIALIZER, *PXP_OBJECT_TYPE_INITIALIZER;
typedef struct _VISTA_OBJECT_TYPE_INITIALIZER
{
   USHORT Length     ;
   USHORT type       ;
//+0x002 ObjectTypeFlags  : UChar
//+0x002 CaseInsensitive  : Pos 0, 1 Bit
//+0x002 UnnamedObjectsOnly : Pos 1, 1 Bit
//+0x002 UseDefaultObject : Pos 2, 1 Bit
//+0x002 SecurityRequired : Pos 3, 1 Bit
//+0x002 MaintainHandleCount : Pos 4, 1 Bit
//+0x002 MaintainTypeList : Pos 5, 1 Bit
PVOID ObjectTypeCode   ;
PVOID InvalidAttributes ;
GENERIC_MAPPING GenericMapping   ;
PVOID ValidAccessMask  ;
PVOID RetainAccess     ;
POOL_TYPE PoolType      ;
PVOID DefaultPagedPoolCharge ;
PVOID DefaultNonPagedPoolCharge ;
PVOID DumpProcedure    ;
PVOID OpenProcedure    ;
PVOID CloseProcedure   ;
    PVOID DeleteProcedure  ;
    PVOID ParseProcedure   ;
    PVOID SecurityProcedure ;
    PVOID QueryNameProcedure ;
    USHORT OkayToCloseProcedure ;
}VISTA_OBJECT_TYPE_INITIALIZER ,*PVISTA_OBJECT_TYPE_INITIALIZER;
typedef struct _XP_OBJECT_TYPE {
ERESOURCE Mutex;
LIST_ENTRY TypeList;
UNICODE_STRING Name; // Copy from object header for convenience
PVOID DefaultObject;
ULONG Index;
ULONG TotalNumberOfObjects;
ULONG TotalNumberOfHandles;
ULONG HighWaterNumberOfObjects;
ULONG HighWaterNumberOfHandles;
2K_ XP_OBJECT_TYPE_INITIALIZER TypeInfo;
#ifdef POOL_TAGGING
ULONG Key;
#endif //POOL_TAGGING
} XP_OBJECT_TYPE, *PXP_OBJECT_TYPE;
typedef struct _VISTA_OBJECT_TYPE
{
LIST_ENTRY TypeList  ;      
UNICODE_STRING Name  ;           
PVOID DefaultObject ;   
PVOID Index      ;      
PVOID TotalNumberOfObjects ;
PVOID TotalNumberOfHandles ;
PVOID HighWaterNumberOfObjects;
PVOID HighWaterNumberOfHandles;
VISTA_OBJECT_TYPE_INITIALIZER TypeInfo ;      
ERESOURCE Mutex   ;        
EX_PUSH_LOCK  TypeLock   ;      
PVOID Key      ;        
EX_PUSH_LOCK ObjectLocks  ;   
LIST_ENTRY CallbackList ;   
}VISTA_OBJECT_TYPE ,*PVISTA_OBJECT_TYPE;
typedef struct _WIN7_OBJECT_TYPE
{
LIST_ENTRY TypeList         ;
UNICODE_STRING Name            ;
PVOID DefaultObject    ;
ULONG Index            ;
ULONG TotalNumberOfObjects ;
ULONG TotalNumberOfHandles ;
ULONG HighWaterNumberOfObjects ;
ULONG HighWaterNumberOfHandles ;
VISTA_OBJECT_TYPE_INITIALIZER TypeInfo         ;
EX_PUSH_LOCK TypeLock         ;
PVOID Key              ;
LIST_ENTRY CallbackList     ;
}WIN7_OBJECT_TYPE,*PWIN7_OBJECT_TYPE;

typedef struct _OBJECT_DIRECTORY_ENTRY {
struct _OBJECT_DIRECTORY_ENTRY *ChainLink;
PVOID Object;
} OBJECT_DIRECTORY_ENTRY, *POBJECT_DIRECTORY_ENTRY;
typedef struct _OBJECT_DIRECTORY {
struct _OBJECT_DIRECTORY_ENTRY *HashBuckets[ NUMBER_HASH_BUCKETS ];
struct _OBJECT_DIRECTORY_ENTRY **LookupBucket;
BOOLEAN LookupFound;
USHORT SymbolicLinkUsageCount;
struct _DEVICE_MAP *DeviceMap;
} OBJECT_DIRECTORY, *POBJECT_DIRECTORY;

//结构体主要是通过windbg 得到,有不足希望大家指点。由于小弟很笨不习惯数字表达,直接上结构体。

PVOID  OldParseKey=NULL;
VOID zfw_InitReistHook()
{   
UNICODE_STRING RegPath ;
OBJECT_ATTRIBUTES oba ;
HANDLE RegKeyHandle ;
NTSTATUS status ;
PVOID KeyObject ;
    PVOID CmpKeyObjectType;
ULONG mTemp=0;

RtlInitUnicodeString(&RegPath, L"\\Registry\\Machine\\System" );
                   InitializeObjectAttributes( &oba ,
                &RegPath ,
                OBJ_KERNEL_HANDLE|OBJ_CASE_INSENSITIVE ,
                0 ,
                0 );
  RegKeyHandle=0;
  status=ZwOpenKey(&RegKeyHandle,KEY_QUERY_VALUE,&oba);
  if (!NT_SUCCESS(status ))
  {
   
   return ;
  }
  //首先随便打开一个注册表键,得到对象
  status=ObReferenceObjectByHandle(RegKeyHandle,
   GENERIC_READ,
   NULL,
   KernelMode,
   &KeyObject,
   0);
  if (!NT_SUCCESS(status ))
  {
   
   ZwClose(RegKeyHandle);
   return ;
  }
  if(g_WindowVer==win7)//写时,发现win7的object_header没有了object_type,但是多了一个Index,
                                         //原以为和其他结构一样是便宜,结果XXX,哎呀,google 原   
//ObTypeIndexTable 中    的Index,万幸有ObGetObjectType,哈哈

if(zf_ObGetObjectType)
    CmpKeyObjectType=ObGetObjectType(KeyObject);
  }
  }
  else
  {
   __asm
   {
    push eax
     mov eax,KeyObject
     mov eax,[eax-0x10]
    mov CmpKeyObjectType,eax
     pop eax
   }
  }
  

  
  //get the key object type
  //获得注册表键对象类型,即CmpKeyObjectType
        if(g_WindowVer==win7)
  {
           OldParseKey = ((PWIN7_OBJECT_TYPE)CmpKeyObjectType)->TypeInfo.ParseProcedure ;
  }else if(g_WindowVer==vista)
           OldParseKey = ((PVISTA_OBJECT_TYPE)CmpKeyObjectType)->TypeInfo.ParseProcedure ;
  else
   OldParseKey=((PXP_OBJECT_TYPE)CmpKeyObjectType)->TypeInfo.ParseProcedure ;


  if (!MmIsAddressValid(OldParseKey))
  {
   ObDereferenceObject(KeyObject);
   ZwClose(RegKeyHandle);
   return ;
  }
  __asm
  {
   cli;
   mov eax, cr0;
   and eax, not 10000h;
   mov cr0, eax;
  }
  if(g_WindowVer==win7)
  {
    ((PWIN7_OBJECT_TYPE)CmpKeyObjectType)->TypeInfo.ParseProcedure=zfw_FakeParseKey ;
  }else if(g_WindowVer>vista)
    ((PVISTA_OBJECT_TYPE)CmpKeyObjectType)->TypeInfo.ParseProcedure = zfw_FakeParseKey;
  else
          ((PXP_OBJECT_TYPE)CmpKeyObjectType)->TypeInfo.ParseProcedure = zfw_FakeParseKey;
  __asm
  {
   mov eax, cr0;
   or eax, 10000h;
   mov cr0, eax;
   sti;
  }

  //进行HOOK
  ObDereferenceObject(KeyObject);
  ZwClose(RegKeyHandle);
  return ;
}

zfw_FakeParseKey的代码不用写了吧,牛哥们都帮忙了。

【本帖最后由HoviDelphic修改,修改原因:代码着色】

评分

参与人数 1水晶币 +40 +40 收起 理由
HoviDelphic + 40 + 40 支持一下

查看全部评分

38

主题

199

回帖

2

精华

钻石会员

积分
3408
发表于 2010-7-15 17:13:30 | 显示全部楼层
嗯,不错,虽然网上已经有类似的代码,但还是加精。

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-7-19 19:30:27 | 显示全部楼层
本帖最后由 Tesla.Angela 于 2010-7-19 19:33 编辑

搜索到关于object hook的资料:点击查看

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-7-19 19:34:35 | 显示全部楼层
本帖最后由 Tesla.Angela 于 2010-7-19 19:36 编辑

关于Object Hook的代码。

ObjectHook_src.rar

14.31 KB, 下载次数: 18

售价: 1 水晶币  [记录]

0

主题

20

回帖

0

精华

初来乍到

积分
0
发表于 2010-7-21 20:32:04 | 显示全部楼层
看不懂,正在学习驱动中。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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