Detours框架实现原理探究
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框架实现原理探究相关推荐
- KVM 虚拟化原理探究--启动过程及各部分虚拟化原理
KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...
- 并发队列-无界非阻塞队列 ConcurrentLinkedQueue 原理探究
并发队列-无界非阻塞队列 ConcurrentLinkedQueue 原理探究 http://www.importnew.com/25668.html 一. 前言 常用的并发队列有阻塞队列和非阻塞队列 ...
- 框架学习与探究之AOP--Castle DynamicProxy
前言 先说一点废话,在此之前博主也在早期就接触了或者看了些许AOP相关的文章,然后再去做了一些相关的实验,但是始终没有将AOP内化到自己的内功心法当中去,包括从概念还是应用环境,以及当前生态当中的AO ...
- 浏览器工作原理探究详解
浏览器工作原理探究 标签: 浏览器工作原理 / web性能优化 引言 最近对web的性能优化比较感兴趣,而前端代码主要在浏览器工作的.如果对浏览器的工作原理了解清楚,可以为web性能优化提供方向以及理 ...
- java lock的原理,Java中Lock原理探究
在对于lock锁的使用上,很多人只是掌握了最基础的方法,但是对实现的过程不是很清楚.这里我们对lock锁功能的实现进行分析,以ReentrantLock为例,分析它的锁类型,并对相关的调用方法进行展示 ...
- vmware nat模式原理探究,实现虚拟机跨网段管理
vmware nat模式原理探究: 理解nat模式,我们能更加了解主机与虚拟机之间如何通信,以及虚拟机如何实现上网. 以及便于我们分析虚拟机与主机无法通信和无法上外网的问题. 下面通过实战:虚拟网络拓 ...
- Ajax框架及原理分析--视频
Ajax框架及原理分析 下载地址:http://v.51work6.com/courseInfoRedirect.do?action=courseInfo&courseId=240576 AJ ...
- Android免Root环境下Hook框架Legend原理分析
0x1 应用场景 现如今,免Root环境下的逆向分析已经成为一种潮流! 在2015年之前的iOS软件逆向工程领域,要想对iOS平台上的软件进行逆向工程分析,越狱iOS设备与安装Cydia是必须的!几乎 ...
- KVO-基本使用方法-底层原理探究-自定义KVO-对容器类的监听
书读百变,其义自见! 将KVO形式以代码实现呈现,通俗易懂,更容易掌握 :GitHub -链接如果失效请自动搜索:https://github.com/henusjj/KVO_base 代码中有详 ...
- 底层框架_你有必要了解一下Flink底层RPC使用的框架和原理
1. 前言 对于Flink中各个组件(JobMaster.TaskManager.Dispatcher等),其底层RPC框架基于Akka实现,本文着重分析Flink中的Rpc框架实现机制及梳理其通信流 ...
最新文章
- 红旗Linux认证简介
- apply()和call()的区别
- 腾讯大数据平台,要“没人管”了
- iOS开发那些事-表视图UI设计模式
- HTTP 和 HTTPS
- DOM结点的渲染(attach)
- 廖雪峰 练习 把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字...
- 常熟理工学院计算机考研,2018江苏专转本考生必看-常熟理工学院介绍
- 二阶振荡环节的谐振频率_自动控制系统时域分析十三:对数频率特性
- 华为Mate 30 Pro再爆猛料:更“大”更高级了
- 测试自动化金字塔在软件开发中是如何使用的?
- scipy.optimize.curve_fit
- jsp企业员工请假管理系统
- 对MRPⅡ/ERP的认知
- C/C++去除行末空格
- c语言购买电影票程序,求助,怎么改把程序产生数据写入文件里,电影票管理系统,大佬们...
- Jstate JVM分析
- java_Annotation
- 编程示例:jsp在数据库中的编程
- 在SQL Server 2000中设置OPTION (MAXDOP 1) 性能提高问题