Detour教程(下)
来源:e股脑
Figure 5中的代码片断描述了如何使用Detours库。要使用Detours必须包含detours.h并将detours.lib链接到工程中。
Figure 5. 一个截获函数的例子。
trampoline函数可以动态或者静态的创建。要使用静态的trampoline函数来截获目标函数,应用程序生成trampoline的时候必须使用DETOUR_TRAMPOLINE宏。DETOUR_TRAMPOLINE有两个输入参数:trampoline的原型和目标函数的名字。
注意,对于正确的截获模型,包括目标函数,trampoline函数,以及截获函数都必须是完全一致的调用形式,包括参数格式和调用约定。当通过trampoline函数调用目标函数的时候拷贝正确参数是截获函数的责任。由于目标函数仅仅是截获函数的一个可调用分支,这种责任几乎就是一种下意识的行为。
使用相同的调用约定可以确保寄存器中的值被正确的保存,并且保证调用堆栈在截获函数调用目标函数的时候能正确的建立和销毁。
可以使用DetourFunctionWithTrampoline函数来截获目标函数。这个函数有两个参数:trampoline函数以及截获函数的指针。因为目标函数已经被加到trampoline函数中,所有不需要在参数中特别指定。
我们可以使用DetourFunction函数来创建一个动态的trampoline函数,它包括两个参数:一个指向目标函数的指针和一个截获函数的指针。DetourFunction分配一个新的trampoline函数并将适当的截获代码插入到目标函数中去。
如果目标函数本身是一个链接符号,使用静态的trampoline函数将非常简单。如果目标函数不能在链接时可见,那么可以使用动态trampoline函数。通常可以使用其他函数获得目标函数的指针。这个时候,当目标函数不是很容易使用的时候,DetourFindFunction函数可以找到那个函数,不管它时DLL中导出的函数,或者是可以通过二进制目标函数的调试符号找到。
DetourFindFunction接受两个参数:库的名字和函数的名字。如果DetourFindFunction函数找到了指定的函数,返回该函数的指针,否则将返回一个NULL指针。DetourFindFunction会首先使用Win32函数LoadLibrary 和GetProcAddress来定位函数,如果函数没有在DLL的导出表中找到,DetourFindFunction将使用ImageHlp库来搜索有效的调试符号(译注:这里的调试符号是指Windows本身提供的调试符号,需要单独安装,具体信息请参考Windows的用户诊断支持信息)。DetourFindFunction返回的函数指针可以用来传递给DetourFunction以生成一个动态的trampoline函数。
我们可以调用DetourRemoveTrampoline来去掉对一个目标函数的截获。
注意,因为Detours中的函数会修改应用程序的地址空间,请确保当加入截获函数或者去掉截获函数的时候没有其他线程在进程空间中执行,这是程序员的责任。一个简单的方法保证这个时候是单线程执行就是在加载Detours库的时候在DllMain中呼叫函数。
4 评价
存在一些其他的技术可以截获函数调用,这些技术包括:
通过源代码在应用程序中替换被呼叫的函数: 通过修改应用程序的源代码,将对目标函数的调用替换成对截获函数的调用。这种方法的主要弊端就在于它需要源代码。在应用程序的二进制文件中替换被呼叫的函数: 通过修改应用程序的二进制文件将对目标函数的调用替换成对截获函数的调用。虽然这种技术不需要源代码,但是这种方法需要标识出可以使用的调用地点,这需要二进制文件中有可用的符号信息,而通常的应用程序并不会提供这种信息。DLL
重定向: 如果目标函数驻留在一个动态库中,可以通过修改二进制文件的导入表将调用重定向到一个截获用的DLL。重定向过程可以是在应用程序加载以前替换导入表中原始的DLL,或者是在加载以后在间接导入跳转表中替换函数地址[2]。不幸的是,在应用程序中通过导入表来重定向到截获函数的方法对于那些DLL的内部函数调用以及那些使用LoadLibrary和GetProcAddress加载的函数指针毫无作用。 断点陷阱: 不同于替换DLL,目标函数可以通过插入一个调试断点的方法被捕获。截获函数可以被调试中断句柄调用。这种技术的主要弊端在于,断点陷阱会将应用程序所有的线程挂起。另外,调试中断必须在另外一个操作系统进程中捕获。经由断点陷阱进行的捕获,在执行时对效率有很大的牺牲。
Table 1 列出了捕获一个空函数和一个CoCreateInstance API所花费的时间。这个小测试是在一台主频200MHz的Pentium Pro机器上执行的。分别列出了没有使用截获花费的时间,使用调用替换,使用DLL替换,使用Detours库,或者使用断点陷阱所花费的时间。你可以看到,使用Detours库仅仅比其他一些方法多一点点时间(比最快的方法不超过400纳秒)。
Table 1. 捕获技术在时间花费上的对比。
5 经验
在过去的两年里,Detours库被广泛的用于Win32应用程序和Windows NT操作系统的研究和功能扩展。
Detours本来是为Coign Automatic Distributed Partition System [7]所开发的。Coign将本地桌面应用程序从COM组件转换为分布式客户端/服务器应用程序。在进行系统检测分析的时候,Coign使用Detours来截获对COM实例函数的调用,例如:CoCreateInstance 函数。截获函数通过trampoline函数来调用原始的库函数,然后在一个附加的检测输出层封装一个输出接口指针(请参考[8])。这个检测输出层决定应用程序组件怎样通过网络来执行。这样,通过分布式执行,一个新的Coign截获函数会截获到COM实例函数的调用并利用分布式机制将这些调用重新分配调用路径。本质上来说,Coign扩展了COM库并支持灵活的远程调用。
尽管DCOM对一些COM实例函数支持远程调用,Coign通过迂回扩展(即截获行为)支持对大约50个COM函数进行远程调用。Coign使用Detours的DLL重定向函数将一个运行时加载器附着到应用程序的二进制码上,同时使用负载函数(payload)将一个系统统计数据节表也附着到应用程序的二进制码上。
我们的一些同事也使用Detours来检测DCOM协议栈的用户模式部分,包括Marshaling proxies,DCOM运行库,RPC运行库,WinSock运行库,以及Marshaling stubs [11]。对结果的分析被用于对DCOM的结构进行重新构建,以生成到一个速度更快的用户模式网络。并且他们可以使用源代码来产生一个特殊版本的DCOM来进行系统检测分析,在进行系统检测分析的计算机上,这个基于源代码的检测可以做到版本独立并且为所有的DCOM应用程序所共享。通过基于Detours的二进制检测方法,系统分析工具可以附着到任意的Windows NT 4版本的DCOM并且只影响被检测的进程。
在另一次进行功能扩展的试验中,Detours被用于为COP(基于组件的操作系统代理服务器[14])生成一个thunking层。
COP是一个基于COM的Win32 API版本。使用COP的应用程序通过COM接口,例如IWin32FileHandle,来访问操作系统提供的功能。由于COP接口是由DCOM发布的,一个COP应用程序可以通过网络上的计算机来使用操作系统资源,包括文件系统,鼠标,键盘,显示器,注册表,等等。为了给子程序提供支持,COP使用截获函数来捕获所有到Win32 API的调用。本地应用程序的API调用被转换为到COP接口的调用。在底层,COP使用trampoline函数来检测同下面操作系统的通讯。COP不需要对应用程序的二进制代码做任何的修改。在加载时,COP 的DLL被Detours的注入函数注入到应用程序的地址空间。通过Detours的简单截获,使得这种对Win32 API的笨重扩展变得更简单了。
Detour教程(下)相关推荐
- Web前端-JavaScript基础教程下
Web前端-JavaScript基础教程下 <script>有6个属性: async对外部脚本有效,可以用来异步操作,下载东西,不妨碍其他操作. charset为src属性指定字符集. d ...
- Hyperledger Fabric 2.0 官方文档中文版 第6章 教程(下)
Hyperledger Fabric 2.0 官方文档中文版 第6章 教程下 总目录 6.教程(下) 使用CouchDB 为什么使用CouchDB? 在Hyperledger Fabric中启用Cou ...
- 酷狗音乐的爬取,基于python,从无到有完整教程-下:功能代码讲解
酷狗音乐的爬取,从无到有完整教程-下:功能代码讲解 是的我又回来了,这次是代码的讲解哦. 参数项生成 上一章我们提到,在包含了歌曲url,歌曲信息的请求中,有几个参数项的值是随机数就可以,但是,你仔细 ...
- 最详细的***教程 下
第十七章------关于后门和*** 简单说明: 后门一般是指一个系统或是应用软件存在的一些设计缺陷,或是设计人员为了方便解决问题而特别留下的后门,总之无论怎么样?如果后门被其他人知道,或是在发布软件 ...
- 高等代数第3版下 [丘维声 著] 2015年版_机器学习与线性代数简明教程(下)
机器学习与线性代数简明教程(上) 线性代数在机器学习(ML)和深度学习(DL)中是必不可少的.即使我们努力为许多理论创建精确的机器学习模型,线性代数仍然是这些研究中的重要工具. 正交矩阵 如果方形矩阵 ...
- 动力节点-javaweb项目入门到实战教程-下
继续上文的内容,are you ready?let's go !!! 熟悉的配方搭配精美的视频:动力节点最新JavaWeb视频教程,javaweb零基础入门到精通IDEA版-持续更新中_哔哩哔哩_bi ...
- 【win】Photoshop+蓝湖插件安装小白教程(下)
本教程为Photoshop安装及蓝湖插件安装教程,windows系统下.本篇紧跟上篇,讲蓝湖插件的下载安装和使用. 蓝湖 Photoshop插件安装: 1.首先下载蓝湖photoshop插件,插件ma ...
- 天龙八部TLBB从0到1搭建教程-下
首先我们要知道一个完整的游戏的端包括 服务器端和补丁文件 tlbb.tar.gz为服务器端文件,大小应该在50-60左右 补丁的话看版本的修改情况未定,有大有小 tlbb.tar.gz解压之后会的文件 ...
- jenkins 入门教程(下)
接上回继续学习jenkins,这次主要来看一些疑难杂症: 一.yum install安装方式 除了直接java -jar jenkins.war方式,还可以用yum安装,这种方式下提供了更多的可配置选 ...
最新文章
- nginx+iis实现负载均衡
- js弹框带传值父窗口给子框_JavaScript实现弹出子窗口并传值给父窗口
- 源码 linux下编译_Linux云服务器软硬链接及源码编译安装python3.8的一些备注
- 理解依赖注入(IOC)
- springboot 订单重复提交_瞬间几千次的重复提交,我用Spring Boot+Redis扛住了
- Flink编程入门(二)
- bzoj2733 永无乡 splay树的启发式合并
- .net vue漂亮登录界面_基于 electron-vue 开发的音乐播放器「实践」
- 模拟调制解调matlab仿真实验报告,基于MATLAB调制解调仿真
- 智慧(灯杆)路灯系统集成解决方案详解
- 如何更改文件夹图标和颜色
- 有效防御DDOS的八规则
- HTML基础期末速成笔记
- [cesium] | 视频融合 | 基于3dtileset的视频投射插件 | 支持动态调整角度
- 金融反作弊中的设备指纹
- cad简化螺纹lisp_二维螺纹的AutoLISP工具
- UPS不间断电源除尘技巧分析
- electron应用通过web页面按钮唤醒
- 一周跑步锻炼总结(100301——100307)
- 读者写者模型---读优先与写优先
热门文章
- 千亿市值今天解禁 美团点评“心里没谱”
- 一文读懂链上身份:赛道及项目一览
- java rgb cmyk_Java CMYK图片转RGB图片(TwelveMonkeys方式)
- dubbo注册服务和消费服务---入门篇
- 华中科技大学计算机科学与技术学院郑强教授,华中科技大学教授声讨后勤被处分 校方:通报批评,取消2年评优...
- java四则运算程序_java实现四则运算程序
- C语言买金鱼问题答案,发现一条品相不错的小金鱼,可惜炸鳞了,购买金鱼如何判断疾病?...
- 原学而思培优、智联招聘CTO李京峰加盟T3出行
- 【Arduino+ESP32专题】案例:简单的实现NTC热敏电阻检测板卡温度
- Android开发之百度地图(soso地图,搜狗地图,阿里云地图)转高德地图经纬度的方法