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框架实现机制及梳理其通信流 ...
最新文章
- Windows10上编译MXNet源码操作步骤(Python)
- Docker初学5:下载安装可视化图形工具Portainer
- Python删除list里面的重复元素的俩种方法
- centos 6.5安装VMware tools
- html h1 背影设为图片,CSS Backgrounds(背景)
- 高效 保活长连接:手把手教你实现 自适应的心跳保活机制
- Android 开发工程师自述:毕业两年后,我明白的那些事!
- Nexus1000v部署
- 如何列出所有用户的所有cron作业?
- python实现二分类_感知器做二分类的原理及python numpy实现
- PS制作视频字幕教程
- EJB是什么?有什么优点?
- C语言程序设计---跟随Frank-FuckPPT
- Cloudera Manager 安装
- mac系统下,vm虚拟机打不开/dev/vmmon,如何解决?
- 【厨艺提升】炒土豆丝
- php惠新宸框架,首位国人惠新宸加入PHP官方开发组
- Definer 预言机攻击事件分析
- Java毕业设计_基于javaweb的网上预约实验室管理系统的设计与实现
- echarts修改数据视图格式
热门文章
- 教你如何选择网络机顶盒
- 遥感影像几何校正方法
- 助推“内循环”,华侨城激活国内旅游市场
- 计算机病毒 爱虫病毒(lovebug),有哪些是典型计算机病毒
- windows11错误代码0x0000011b怎么解决? 0x0000011b问题的相应解决办法
- 图片去水印工具(Teorex Inpaint) v7.1
- 为什么要学习Linux内核,如何学习?
- DTCC | 2021中国图数据库技术大会链接分享
- dell 恢复介质_在戴尔计算机上重置或重新安装Windows 10
- 如何生成WIFI二维码供手机扫一扫连接WIFI