目录

编程中handle与hook什么区别

编程中handle与hook的区别是:不同的技术栈里handle和hook可能指不同的东西。泛泛来说handle是对计算机资源(文件,设备,网络,窗口等等)的抽象表示。程序员可以通过handle来操作系统中的各类资源。而hook指通过拦截系统或者应用中的事件。

一、编程中handle与hook的区别

不同的技术栈里,handle和hook可能指不同的东西。

泛泛来说,handle是对计算机资源(文件,设备,网络,窗口等等)的抽象表示。程序员可以通过handle来操作系统中的各类资源。而hook指通过拦截系统或者应用中的事件,信号和调用,来更改系统或者应用的默认行为。

hook

Hook可以以线程为单位进行筛选。每个GUI线程有一个消息队列,用来接受消息,既然是消息Hook,那就应该是针对某个线程的接收到的消息做Hook。

例如:实现的防键盘勾取,可以使用这种技术。安装了一个WH_KEYBOARD_LL钩子,在键盘按下,发往任意的线程消息队列前,会先调用我们的键盘钩子,钩子里面判断是不是我们的输入框的窗口消息,如果不是,忽略。如果是,做加密处理并保存,改变发送的字符(如改为”*”),发送至窗口过程中。如果第三方调用GetWindowText,由于文本框中的都是”*”,所以无法获取出真实字符。

但这种钩子谁也可以安装,Windows将所有程序安装的钩子组成了一个钩子链。如果第三方也安装了一个钩子,还是在我们安装完之后安装的,那么它将会截获到真实字符。所以,所以可以进一步加强处理,增加一个定时器,不停的安装卸载多个钩子。这样,即便第三方也在不停的安装钩子,想截取到完整的PIN,可能性变的很小。但如果这个恶意程序驻留在用户系统中很多天,通过每次的统计,可能能得到完整的PIN。

Handle

Handle本身是一个32位的无符号整数,它用来代表一个内核对象。它并不指向实际的内核对象,用户模式下的程序永远不可能获得一个内核对象的实际地址(一般情况下)。那么Handle的意义何在?它实际上是作为一个索引在一个表中查找对应的内核对象的实际地址。那么这个表在哪里呢?每个进程都有这样的一个表,叫句柄表。该表的名列前茅项就是进程自己的句柄,这也是为什么你调用GetCurrentProcess()总是返回0x7FFFFFFF原因。

简单地说,Handle就是一种用来”间接”代表一个内核对象的整数值。你可以在程序中使用handle来代表你想要操作的内核对象。这里的内核对象包括:事件(Event)、线程、进程、Mutex等等。我们最常见的就是文件句柄(file handle)。

延伸阅读:

二、进程ID

首先,进程ID是一个32位无符号整数,每个进程都有这样的一个ID,并且该ID在系统范围内是少数的。系统使用该ID来少数确定一个进程。

深入些说,系统可能使用进程ID来计算代表该进程的内核对象的基地址(及EPROCESS结构的基地址),具体的计算公式你可以去问微软的OS开发人员。

一站式研发项目管理平台 PingCode

一站式研发项目管理平台 PingCode

支持敏捷\瀑布、知识库、迭代计划&跟踪、需求、缺陷、测试管理,同时满足非研发团队的流程规划、项目管理和在线办公需要。