setwindowhook内部原理

本文深入探讨Windows中的Hook机制,尤其是setwindowhook的内部原理。内容涉及用户对象的创建、句柄映射以及Hook的核心实现。文章通过分析UserCreateObject、UserGetWindowObject等接口,揭示了用户对象与句柄的关系,并详细阐述了Hook在用户空间中的运作方式,特别是线程Hook和系统Hook的限制。同时,提到了Hook如何通过调用如callwindowproc等默认处理函数来分发消息。
摘要由CSDN通过智能技术生成
setwindowhook  ->  intsetwindowhookex  ->  NtUserSetWindowHookEx(工作在win32k.sys子系统层)

Hook = UserCreateObject(gHandleTable, NULL, &Handle, otHook, sizeof(HOOK));

同属于user32的用户对象的读写接口

UserGetWindowObject   获取window对象 

UserCreateObject  

UserGetObject

以下是handle和 用户对象地址的映射关系

handle是 用户对象在用户全局对象列表中的序号的算法结果(有一个专门的算法可以使用), 有两个函数专门处理 index和对象地址之间的映射

PUSER_HANDLE_ENTRY handle_to_entry(PUSER_HANDLE_TABLE ht, HANDLE handle )
{
   unsigned short generation;
   int index = (((unsigned int)handle & 0xffff) - FIRST_USER_HANDLE) >> 1;
   if (index < 0 || index >= ht->nb_handles)
      return NULL;
   if (!ht->handles[index].type)
      return NULL;
   generation = (unsigned int)handle >> 16;
   if (generation == ht->handles[index].generation || !generation || generation == 0xffff)
      return &ht->handles[index];
   return NULL;
}

用户对象的原型

typedef struct _USER_HANDLE_ENTRY
{
    void          *ptr;          /* pointer to object */
    union
    {
        PVOID pi;
        PTHREADINFO pti;          // pointer to Win32ThreadInfo
        PPROCESSINFO ppi;         // pointer to W32ProcessInfo
    };
    unsigned char  type;         /* object type (0 if free) */
    unsigned char  flags;
    unsigned short

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值