Window s 下 API hook 和 Window s hook 应用区别 Hook 字面的意思是钩子,但是实际上更像提供一种过滤,或者说修改消息处理,或者API 的机制。 API hook 什么是API 的hook 呢,其实就是将 API 调用的地方进行了转移,或者重新实现的一种技术。这种技术不仅仅可以用在 w indow s 上,其他 OS 上一样可以使用,我曾经在 brew mp 上的手机开发上测试过API hook。所以这里主要只讲 w indow s 下的API hook。 API的hook 基本思路都是想办法替换原来的API,使函数的调用关系,直接进行转换, 典型的如下 可以看到 client 端要调用的FunctionA,在 A 进入之后,就调用了 FunctionB , 在 Function B 中回到 FunctionA 做具体 A 应该做的事情,从 A 返回之后,FunctionB 然后在返回给 Client,那么在 FunctionB 中使用 FunctionA 的前后,它自己都可以干自己想要干的事情,这样就是一个 API 的hook, 下面我们主要讨论 Window s 上最常用的两种API hook 策略。 A)IAT 替换 API hook 所谓的IAT (import address table ) 这个是PE 文件中一个重要的部分,这里我们不详细讨论 PE 文件的构成,因为这个本来就可以写一张内容。我们主要了解的是PE 如何在一个已经加载在内存中的PE 文件如何找到它的IAT。 (1) 为什么要找 IAT? 一个模块,可能依赖别的API,也可能提供API,供别的模块调用,MS 为了在PE 文件中,分别用导入表和导出表进行描述两种关系。导入表 IAT 主要是描述了这个模块依赖那些其他模块提供的API。 而导出表 EAT 是描述这个模块中都提供那些函数供别的模Function A Client 1 Function B 2 3 4 块调用。如果我们在某个模块的导入表中替换它所依赖的函数,那么这样就可以实现 API hook. (2) 如何找 IAT? 要找 IAT 要稍微了解一下 PE 文件的结构, 一个PE 文件的大概长相就是这样,我们要找的IAT,就是要先找到PE 文件可选头,在这个数据结构中,描述了IAT 描述的位置在那里,然后给距IAT descriptor 就可以找到IAT 了。 另外要获得导入表描述符,只要使用这个API ImageDirectoryEntryToData 就可以了, 但是这个API 是有依赖的。我们使用 Du mpbin,或者 TC 都可以看到这个ex e 确实使用kernel32 dll, 所以,我们下一步要替换我们的自己 My CreateProcessW. 将上面函数稍微优化一下,修改一下,就...