Hook API在自动化测试、性能分析以及安全攻防领域有着广泛的应用。

Detours 作为微软研发并开源的API HOOK框架,在微软内部以及业界有着广泛的使用,正如它的官方说明一样:

Detours is a software package for re-routing Win32 APIs underneath applications. For almost twenty years, has been licensed by hundreds of ISVs and used by nearly every product team at Microsoft.

首先要介绍该框架用到的几个概念:

Source Function:用户编写的源代码

Target Function:被调用的函数(比如Windows API)

Detour Function: 自定义函数,用来替换Target Function的函数

Trampoline:从Detour Function 跳转回 Target Function 所需的指令

下面我们看一下HOOK之前的正常调用流程:

再看一下HOOK之后的流程:

为了方便理解,我们看一下伪代码示意图:

上面就是 Detours Hook API的基本原理了,下面我们在看一下源代码,是具体如何实现以上部分的。

在代码里面,如果我们想hook 一个api一般编写如下代码:

其中Old_ReadProcessMemory 与 My_ReadProcessMemory 分别为 Target Function 以及 Detour Function

看到上面的代码我们可以思考一下,函数最后为什么调用Old_ReadProcessMemory 而不是直接调用 ReadProcessMemory呢?

接下来的源码分析可以解答这个问题。

我们先分析DetourTransactionBegin这个函数

可以看到,这个函数的主要作用是修改之前已经分配的Trampoline内存的属性,确保它们是可以写入的,为之后的操作进行准备。

DetourUpdateThread函数的主要作用就是去让线程进入暂停状态,为后面的替换操作做准备。

接下来分析 DetourAttach函数

DetourAttach函数内部只有一句代码就是调用 DetourAttachEx函数。

由于DetourAttachEx函数特别长,下面的话就只指出几个关键片段

复制Target Function开始处的机器码到Trampoline

在复制到Trampoline的机器码结尾处填充跳转指令(跳转到Target Function没有被覆盖部分)

另外一个要注意的点就是 函数用数据结构保存了第一个参数

DetourAttach函数的主要作用就是把必要的信息都计算好保存起来,并没有执行真正的Hook动作

真正的Hook动作是在DetourTransactionCommit(DetourTransactionCommitEx)函数中完成的

LONG WINAPI DetourTransactionCommit()
{
return DetourTransactionCommitEx(NULL);
}

以下是关键代码片段:

将Target Function 开始处的机器码替换为跳转到Detour Function的跳转指令,同时将DetourAttach传入的第一个参数指向的地址改为Trampoline中备份的机器码

DetourAttach函数的第一个参数就传出了一个新的函数地址。

这样我们就可以回答前文的那个问题:为什么调用用Old_ReadProcessMemory 而不是直接调用 ReadProcessMemory呢?

因为Old_ReadProcessMemory 指向了Trampoline中备份的机器码,运行效果等同于被Hook前的Target Function

而ReadProcessMemory开始处的机器码已经被替换成了跳转到Detour Function的指令,如果Detour Function函数中再使用ReadProcessMemory的话就变成了死循环了~

参考文献:黑客防线2008.12《Detours源码探索》

Detours框架实现原理探究相关推荐

  1. KVM 虚拟化原理探究--启动过程及各部分虚拟化原理

    KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...

  2. 并发队列-无界非阻塞队列 ConcurrentLinkedQueue 原理探究

    并发队列-无界非阻塞队列 ConcurrentLinkedQueue 原理探究 http://www.importnew.com/25668.html 一. 前言 常用的并发队列有阻塞队列和非阻塞队列 ...

  3. 框架学习与探究之AOP--Castle DynamicProxy

    前言 先说一点废话,在此之前博主也在早期就接触了或者看了些许AOP相关的文章,然后再去做了一些相关的实验,但是始终没有将AOP内化到自己的内功心法当中去,包括从概念还是应用环境,以及当前生态当中的AO ...

  4. 浏览器工作原理探究详解

    浏览器工作原理探究 标签: 浏览器工作原理 / web性能优化 引言 最近对web的性能优化比较感兴趣,而前端代码主要在浏览器工作的.如果对浏览器的工作原理了解清楚,可以为web性能优化提供方向以及理 ...

  5. java lock的原理,Java中Lock原理探究

    在对于lock锁的使用上,很多人只是掌握了最基础的方法,但是对实现的过程不是很清楚.这里我们对lock锁功能的实现进行分析,以ReentrantLock为例,分析它的锁类型,并对相关的调用方法进行展示 ...

  6. vmware nat模式原理探究,实现虚拟机跨网段管理

    vmware nat模式原理探究: 理解nat模式,我们能更加了解主机与虚拟机之间如何通信,以及虚拟机如何实现上网. 以及便于我们分析虚拟机与主机无法通信和无法上外网的问题. 下面通过实战:虚拟网络拓 ...

  7. Ajax框架及原理分析--视频

    Ajax框架及原理分析 下载地址:http://v.51work6.com/courseInfoRedirect.do?action=courseInfo&courseId=240576 AJ ...

  8. Android免Root环境下Hook框架Legend原理分析

    0x1 应用场景 现如今,免Root环境下的逆向分析已经成为一种潮流! 在2015年之前的iOS软件逆向工程领域,要想对iOS平台上的软件进行逆向工程分析,越狱iOS设备与安装Cydia是必须的!几乎 ...

  9. KVO-基本使用方法-底层原理探究-自定义KVO-对容器类的监听

    书读百变,其义自见! 将KVO形式以代码实现呈现,通俗易懂,更容易掌握 :GitHub   -链接如果失效请自动搜索:https://github.com/henusjj/KVO_base 代码中有详 ...

  10. 底层框架_你有必要了解一下Flink底层RPC使用的框架和原理

    1. 前言 对于Flink中各个组件(JobMaster.TaskManager.Dispatcher等),其底层RPC框架基于Akka实现,本文着重分析Flink中的Rpc框架实现机制及梳理其通信流 ...

最新文章

  1. 红旗Linux认证简介
  2. apply()和call()的区别
  3. 腾讯大数据平台,要“没人管”了
  4. iOS开发那些事-表视图UI设计模式
  5. HTTP 和 HTTPS
  6. DOM结点的渲染(attach)
  7. 廖雪峰 练习 把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字...
  8. 常熟理工学院计算机考研,2018江苏专转本考生必看-常熟理工学院介绍
  9. 二阶振荡环节的谐振频率_自动控制系统时域分析十三:对数频率特性
  10. 华为Mate 30 Pro再爆猛料:更“大”更高级了
  11. 测试自动化金字塔在软件开发中是如何使用的?
  12. scipy.optimize.curve_fit
  13. jsp企业员工请假管理系统
  14. 对MRPⅡ/ERP的认知
  15. C/C++去除行末空格
  16. c语言购买电影票程序,求助,怎么改把程序产生数据写入文件里,电影票管理系统,大佬们...
  17. Jstate JVM分析
  18. java_Annotation
  19. 编程示例:jsp在数据库中的编程
  20. 在SQL Server 2000中设置OPTION (MAXDOP 1) 性能提高问题

热门文章

  1. matlab信道编码程序,信道编码作业matlab.doc
  2. 史上最全的大数据学习资源(Awesome Big Data)
  3. matlab 相位谱是直线,matlab幅度谱和相位谱
  4. 播布客里小布老师的全部视频收集
  5. 如何用安卓手机做代理服务器
  6. 快速排序(快排)——C语言实现
  7. C# winform中 选择文件和保存文件
  8. 电脑管家如何查看计算机配置,腾讯电脑管家怎么查看电脑硬件配置?
  9. 手机刷入其它系统跳过谷歌开机引导,谷歌安全验证
  10. Java EJB到底是什么?