微软开源库 Detours 详细介绍与使用实例分享

news2024/11/25 19:00:45

目录

1、Detours概述

2、Detours功能特性

3、Detours工作原理

4、Detours应用场景

5、Detours兼容性

6、Detours具体使用方法

7、Detours使用实例 - 使用Detours拦截系统库中的UnhandledExceptionFilter接口,实现对程序异常的拦截


C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931C/C++实战进阶(专栏文章已更新400多篇,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.htmlWindows C++ 软件开发从入门到精通(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12695902.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_2276111.html       微软Detours是微软官方推出并开源的一个工具库,主要用于在运行时动态地拦截和修改Windows平台上的Win32 API函数调用。下面从Detours的功能、特性、工作原理、应用场景、兼容性以及使用方法等方面,详细介绍一下Detours。

1、Detours概述

       Detours是微软开发的一个开源库,它允许开发者在不需要重新编译或修改原始代码的情况下,轻松地修改其他进程中的函数调用行为。这一特性使得Detours成为调试、监控、性能测试、安全检测以及插件扩展等场景下的强大工具。Detours通过Hook技术(也称为“钩子”技术)实现其功能,能够在运行时“绕道”目标函数,将控制流转向自定义的处理函数,并在适当的时候恢复到原函数的执行。

Detours提供了高效的API,支持32位和64位系统,Detours通过修改目标函数在内存中的代码,实现拦截Win32函数的目的,同时它还支持将任意的DLL或数据片段(称之为有效载荷)注入到任意Win32二进制文件中。

       微软已经将Detours源码开源,可以到github上去下载完整源码:

https://github.com/microsoft/Detoursicon-default.png?t=N7T8https://github.com/microsoft/Detours

2、Detours功能特性

       Detours的主要功能特性如下:

  • 高效API支持:Detours提供了一套高效的API,支持在32位和64位Windows操作系统上拦截和修改Win32函数,降低了使用难度。开发者可以轻松地通过Detours API实现函数拦截、修改和重定向,而无需深入了解底层汇编语言。
  • 灵活性强:Detours不仅可以拦截函数,还可以拦截向特定地址的内存写入操作,为开发者提供了前所未有的运行时行为控制力。
  • 内存和线程安全:Detours提供了内存安全的接口,避免了因动态内存分配和释放不当导致的问题。同时,它针对多线程环境进行了优化,保证了在多线程环境下的正确性和可靠性。
  • 跨平台支持:Detours支持在x86、x64、IA64以及ARM和ARM64等架构的Windows系统上运行,为开发者提供了广泛的平台兼容性。
  • 高效稳定:Detours基于汇编语言实现,确保了高效性和兼容性。同时,经过微软多年内部使用的验证,Detours具有高度可靠性和稳定性,能够稳定运行在各种Windows操作系统上。
  • 丰富的应用场景:Detours广泛应用于调试、监控、性能分析、安全检测、插件系统等领域。开发者可以利用Detours对应用程序进行扩展,如添加日志记录、性能测试、错误检查等。

3、Detours工作原理

       Detours的工作原理基于汇编语言实现,通过修改目标函数在内存中的二进制映像来达到拦截和修改函数调用的目的。具体来说,Detours会替换目标函数的前几条指令为一个无条件跳转指令(JMP),将控制流引导到用户提供的拦截函数(Detour函数)。同时,Detours会将被替换的指令保存在一个被称为“Trampoline”的函数中,以便在需要时恢复目标函数的原始行为。

       当程序执行到目标函数时,它会直接跳转到拦截函数执行。拦截函数可以执行自定义的代码,如修改参数、记录日志等,并可以选择直接返回或调用Trampoline函数来恢复目标函数的原始行为。拦截函数执行完毕后,控制流会返回到源函数调用处,完成整个拦截过程。


       在这里,给大家重点推荐一下我的几个热门畅销专栏,欢迎订阅:(博客主页还有其他专栏,可以去查看)

专栏1:(该精品技术专栏的订阅量已达到500多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!欢迎订阅!)

C++软件调试与异常排查从入门到精通系列文章汇总icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931

本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的项目问题实战分析实例(很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!

考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!

专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2:  

C++常用软件分析工具从入门到精通案例集锦汇总(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795

常用的C++软件辅助分析工具有SPY++、PE工具、Dependency Walker、GDIView、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro等,本专栏详细介绍如何使用这些工具去巧妙地分析和解决日常工作中遇到的问题,很有实战参考价值!

专栏3:(本专栏涵盖了多方面的内容,是当前重点打造的专栏,专栏文章已经更新到400多篇,持续更新中...)

C/C++实战进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.html

以多年的开发实战为基础,总结并讲解一些的C/C++基础与项目实战进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域多个方面的内容,包括C++基础及编程要点(模版泛型编程、STL容器及算法函数的使用等)、C++11及以上新特性(不仅看开源代码会用到,日常编码中也会用到部分新特性,面试时也会涉及到)、常用C++开源库的介绍与使用、代码分享(调用系统API、使用开源库)、常用编程技术(动态库、多线程、多进程、数据库及网络编程等)、软件UI编程(Win32/duilib/QT/MFC)、C++软件调试技术(排查软件异常的手段与方法、分析C++软件异常的基础知识、常用软件分析工具使用、实战问题分析案例等)、设计模式、网络基础知识与网络问题分析进阶内容等。

专栏4:   

VC++常用功能开发汇总(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585

将10多年C++开发实践中常用的功能,以高质量的代码展现出来。这些常用的高质量规范代码,可以直接拿到项目中使用,能有效地解决软件开发过程中遇到的问题。

专栏5: 

Windows C++ 软件开发从入门到精通(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12695902.html

根据多年C++软件开发实践,详细地总结了Windows C++ 应用软件开发相关技术实现细节,分享了大量的实战案例,很有实战参考价值。


4、Detours应用场景

       Detours在多个领域都有广泛的应用,以下是一些典型的应用场景:

  • 调试和监控:在不修改源代码的情况下,开发者可以在关键点插入跟踪代码,观察程序行为。这对于调试复杂的应用程序或监控应用程序的运行状态非常有用。
  • 性能分析:通过插入计时器来测量函数的执行时间,Detours可以帮助开发者找到性能瓶颈,优化程序性能。
  • 安全检测:监控敏感函数调用,防止恶意活动。例如,可以拦截系统API调用以检测潜在的恶意软件行为。
  • 插件系统:为无插件支持的应用程序添加插件功能。通过拦截和修改函数调用,Detours可以扩展应用程序的功能而无需修改其源代码。
  • 应用增强:为旧版软件添加新特性或修复已知问题。通过拦截和修改函数调用,Detours可以使旧版软件焕发新生。

5、Detours兼容性

       Detours兼容Windows NT家族的操作系统,包括Windows NT、Windows XP、Windows Server 2003以及更高版本的Windows操作系统(如Windows 7、Windows 8、Windows 10等)。

       然而,需要注意的是,Windows Store应用程序只能使用Win32 API的一个子集,且Detours需要使用的某些Win32 API在Windows应用程序认证中是被禁止的,因此Windows Store新应用程序不能使用Detours,这一点有待验证。

6、Detours具体使用方法

       使用Detours需要遵循一定的步骤和规则。首先,需要下载并安装Detours库及其依赖项。然后,在项目中包含Detours的头文件和库文件,并编写自定义的拦截函数。接下来,通过调用Detours提供的API函数(如DetourAttach、DetourDetach等)来挂载和卸载拦截函数。最后,编译并运行项目以验证拦截效果。

       具体来说,使用Detours的步骤如下:

  • 1)包含Detours头文件和库文件:在项目中包含Detours的头文件(如detours.h)和库文件(如detours.lib),以便使用Detours提供的API。
  • 2)定义目标函数和detour函数:确定要拦截的目标函数,并定义一个与之具有相同参数和返回类型的detour函数。在detour函数中编写自定义的代码逻辑。
  • 3)初始化Detours:在程序的适当位置(如DllMain函数的DLL_PROCESS_ATTACH阶段)调用DetourTransactionBegin()函数开始一个事务,并通过DetourUpdateThread()函数更新当前线程的Detours状态。
  • 4)挂接detour函数:使用DetourAttach()函数将detour函数挂接到目标函数上。DetourAttach()函数的第一个参数是指向目标函数地址的指针,第二个参数是指向detour函数的指针。
  • 5)提交事务:调用DetourTransactionCommit()函数提交事务,使detour函数生效。如果挂接成功,DetourTransactionCommit()将返回NO_ERROR;否则,将返回错误码。
  • 6)卸载Detours:在程序的适当位置(如DllMain函数的DLL_PROCESS_DETACH阶段)调用DetourTransactionBegin()、DetourDetach()和DetourTransactionCommit()函数来卸载Detours,并恢复目标函数的原始行为。

7、Detours使用实例 - 使用Detours拦截系统库中的UnhandledExceptionFilter接口,实现对程序异常的拦截

        当程序中发生异常,系统感知到,如果异常是不可恢复的、致命的异常且当前是非调试状态,最终会走到系统库的UnhandledExceptionFilter接口中。为了让我们的程序有效感知并拦截程序中发生的异常,我们直接将系统库中的UnhandledExceptionFilter给hook掉,在自定义函数中添加相关的处理代码。下面给出hook系统库中UnhandledExceptionFilter接口的代码实现:

1)我们定义了一个hook类CHookUnhandledExceptionFilter,在类的构造函数中去hook系统库接口UnhandledExceptionFilter;
2)在CHookUnhandledExceptionFilter类的析构函数中去卸载对UnhandledExceptionFilter接口的hook;
3)使用这个CHookUnhandledExceptionFilter类时,只要用该类定义一个全局变量即可,类对象构造时设置hook,类对象析构时卸载hook。

       CHookUnhandledExceptionFilter类的头文件定义:

//用来hook 系统库中的UnhandledExceptionFilter
class CHookUnhandledExceptionFilter
{
public:
	CHookUnhandledExceptionFilter(void);
	~CHookUnhandledExceptionFilter(void);

private:
	void* m_lpUnhandledExceptionFilter;
};

        CHookUnhandledExceptionFilter类的cpp源文件如下:

// 将系统函数hook成该函数
LONG WINAPI NewUnhandledExceptionFilter( struct _EXCEPTION_POINTERS *ExceptionInfo )
{
    // 处理代码省略
}

// 1、在构造函数中设置对UnhandledExceptionFilter的hook,将之hook成NewUnhandledExceptionFilter
CHookUnhandledExceptionFilter::CHookUnhandledExceptionFilter(void)
{
	m_lpUnhandledExceptionFilter = NULL;
	do {
		SetErrorMode(SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
		
		if ( IsWindowsVersionGreater( HIBYTE( _WIN32_WINNT_WIN10 ), LOBYTE( _WIN32_WINNT_WIN10 ), 0 ) )
		{
			m_lpUnhandledExceptionFilter = DetourFindFunction( "KERNELBASE.DLL", "UnhandledExceptionFilter" );
		}
		else
		{
			m_lpUnhandledExceptionFilter = DetourFindFunction( "KERNEL32.DLL", "UnhandledExceptionFilter" );
		}

		if ( NULL == m_lpUnhandledExceptionFilter ) {
			WriteCrashLog(_T("DetourFindFunction return null"));
			break;
		}

		CString strErr;
		LONG lRes = NO_ERROR;
		lRes = DetourTransactionBegin();
		if ( NO_ERROR != lRes ) {
			strErr.Format( _T("DetourTransactionBegin fails ret:%d"), lRes );
			WriteCrashLog( strErr.GetBuffer(0) );
			break;
		}

		lRes = DetourAttach( &m_lpUnhandledExceptionFilter, NewUnhandledExceptionFilter );
		if ( NO_ERROR != lRes ) {
			strErr.Format( _T("DetourAttach fails ret:%d"), lRes );
			WriteCrashLog( strErr.GetBuffer(0) );
			break;
		}

		lRes = DetourTransactionCommit();
		if ( NO_ERROR != lRes ) {
			strErr.Format( _T("DetourTransactionCommit fails ret:%d"), lRes );
			WriteCrashLog( strErr.GetBuffer(0) );
			break;
		}
	} while (0);
}

// 2、在析构函数中卸载对UnhandledExceptionFilter的hook
CHookUnhandledExceptionFilter::~CHookUnhandledExceptionFilter(void)
{
	if ( m_lpUnhandledExceptionFilter ) {
		do {
			LONG lRes = NO_ERROR;
			lRes = DetourTransactionBegin();
			if ( NO_ERROR != lRes ) {
				break;
			}

			lRes = DetourDetach( &m_lpUnhandledExceptionFilter, NewUnhandledExceptionFilter );
			if ( NO_ERROR != lRes ) {
				break;
			}

			lRes = DetourTransactionCommit();
			if ( NO_ERROR != lRes ) {
				break;
			}
		} while (0);
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2041642.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring SSM框架--MVC

一、介绍 Spring 框架是一个资源整合的框架,可以整合一切可以整合的资源(Spring 自身和第三方),是一个庞大的生态,包含很多子框架:Spring Framework、Spring Boot、Spring Data、Spring Cloud…… 其中Spr…

全球海事航行通告解析辅助决策系统

“全球海事航行通告解析辅助决策系统”是一个针对海事行业设计的智能系统,旨在帮助海上导航和航运操作人员解析和应对全球发布的海事航行通告。 要做这样的系统我们必须要了解海事签派员的日常工作。 海事签派员,也称为船舶操作员或船运调度员&#xff0…

国产车规级TSN芯片获十万片订单,将步入规模化应用

近日,从北京科技企业东土科技获悉,其研发并孵化的我国首颗列入工信部国产汽车芯片名录的车规级时间敏感网络(TSN)交换网络芯片,于近期获得国家新能源汽车技术创新中心10万片芯片订单,将规模化应用于车载网关…

bluecmsphp代码审计

bluecms代码审计 (一) 运行环境需求: 可用的 httpd 服务器(如 Apache、Zeus、IIS 等) PHP 4.3.0 及以上 MySQL 4.1 及以上配置文件审计 看到uploads/install/include/common.inc.php 当然我们可能自己根本不知道那个是重要的文件&#x…

从送外卖到自学编程,再到AI绘画,我的副业之路助我一年还清房贷车贷

一、引言 在这个快速变化的时代,每个人都有可能通过自己的努力改变命运。我,一个普通的外卖员,通过自学编程,最终掌握了AI绘画技能,实现了下班后赚取额外收入,一年内还清了房贷和车贷。以下是我的故事&…

力扣题/二叉树/路径总和 III

路径总和 III 力扣原题 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能…

Nios II的BSP Editor

1.菜单打开BSP Editor (1) (2) (3) 项目文件夹 -> software文件夹 -> ... _bsp文件夹 -> settings.bsp文件 2.文件打开BSP Editor 选中项目文件,右键,Nios II -> …

【区块链+食品安全】海南省市场监管局:进口冷链食品可信追溯平台 | FISCO BCOS应用案例

2020 年 10 月,海南省市场监管局联合腾讯基于 FISCO BCOS 区块链底层技术建设“海南省进口冷链食品可信追 溯平台”( 简称“海南冷链”),在全国范围内首批实现了与市场监管总局数据对接。平台以冷 ( 冻 ) 库为抓手,从 进口冷链食品进入海南省…

Vatee万腾平台:数据驱动的决策新引擎

在数字化时代,数据已成为企业决策的核心驱动力。Vatee万腾平台,凭借其卓越的数据处理与分析能力,正逐步成为企业数据驱动的决策新引擎,引领着企业向更加精准、高效的决策模式迈进。 Vatee万腾平台深刻理解到,在数据爆炸…

爬虫:写了一个解析拖动滑块进行登录校验的伪代码

完成滑动拼图验证码是一个更复杂的任务,因为它通常涉及准确地将滑块拖动到正确的位置以匹配拼图缺口的位置。要实现这一点,通常需要进行以下步骤: 识别拼图缺口的位置。计算滑块的拖动距离。模拟人类行为完成拖动。 由于 Playwright 本身没…

Doxygen程序注释文档制作教程

Doxygen教程 Doxygen软件下载安装Doxygen软件的使用Doxygen Comments扩展参考文献Doxygen软件下载安装 首先,在官网下载windows环境下的doxygen,网址: Doxygen: Downloads 找到对应安装包点击下载 下载完成后傻瓜式一步一步安装就可以了。安装完成后在开始栏点击Doxywizar…

ptrade排坑笔记——量化界面一直无法正常访问!

前言 今天和大家分享的一个问题是量化界面相关的,量化界面打不开的一个问题,具体界面如图! 一、问题描述 问题很简单,就是客户的量化交易界面无法打开,问题简单但是关系很大,量化策略的研究、回测都是在…

教你如何在同一台手机上同时登录两个微信

我们先手机应用中点开设置 里面找到应用公设置 在里面点击应用双开 或者 应用分身 手机不同会有所不同 然后 我们将微信的这个开关打开 这样 手机上就能同时使用两个微信啦

安防监控视频平台视图服务系统视频监控汇聚平台图库使用说明

视图汇聚共享网关是一款软硬件一体化的设备,支持多种协议的IPC/NVR/DVR视图数据接入,包括ONVIF、GB/T 28181、RTSP、1400、FTP以及海康、大华的私有协议。该设备还通过GB/T 28181、1400、FTP等协议共享视图数据,具备广泛的接入范围和开放共享…

【leetcode图文详解】特殊数组II : 空间换时间的“记忆化”,越多越好吗?

题目详解 需求:判断给定区间内的元素是否满足“特殊数组”要求 尝试: 暴力求解? 如果试着直接对每个queries中的区间进行检测而不做其他处理,那么最后不出意外地超时了。。 细想优化策略,不难察觉到其中可能存在大量的重复运算 那还等什…

Python Word文档安全 - 设置和解除Word文档保护

目录 使用工具 Python 给 Word 文档设置密码保护 Python 限制 Word 文档的编辑 Python 保护 Word 文档的同时留出可编辑区域 Python 解除 Word 文档的密码保护 Python 解除 Word 文档的编辑限制 在日常工作和学习中,我们经常需要使用Word文档来记录和分享重要…

【附源码】Python :圆锥建模

系列文章目录 Python 建模入门:圆锥建模 文章目录 系列文章目录一、建模需求二、源代码三、代码分析四、效果展示总结 一、建模需求 使用matplotlib库和mpl_toolkits.mplot3d模块来绘制一个带有坐标轴的圆锥体的3D图形 二、源代码 代码如下: import ma…

检验流程的信息化系统——LIS

LIS系统源码,C#LIS系统源码,自主版权医院应用案例 医院检验系统的发展历程 医院检验系统的发展经历了多个阶段,从最初的简单手工操作到自动化仪器应用,再到数字化信息管理系统的建立,逐渐实现了检验流程的信息化、智…

JAVA实现GB/T 32960.3—2016电动汽车远程服务与管理系统技术规范 第3部分:通信协议及数据格式

完整的TCP服务端解析代码 1.maven依赖 不要的依赖自行删除&#xff0c;懒的删了 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-in…

C语言实现数据结构之队列

目录 队列一. 队列的概念及结构二. 队列的实现1. 要实现的功能2 具体的实现2.1 结构体2.2 初始化2.3 入队列2.4 出队列2.5 返回队首元素2.6 返回队尾元素2.7 队列元素个数2.8 队列判空2.9 队列销毁 三. 队列相关OJ题设计循环队列用队列实现栈用栈实现队列 四. 概念选择题五. 参…