Microsoft Detours 2.1简介

http://blog.163.com/qcb_163/blog/static/9545466420117851038971/

Microsoft Detours 2.1简介

2011-08-0817:10:38| 分类: VC编程 | 标签: |字号大中小 订阅

一、简介

《Windows高级调试》第一章中提到了一个基于Microsoft Detours库的内存泄露检查工具LeakDiag。本文对这个库进行一些介绍。

一句话来说,Detours是一个用来在二进制级别上对程序中的函数(Function)或者过程(Procedure)进行修改的工具 库。一般我们将这种技术称为"Hook"。Detours的实现原理是将目标函数的前几个字节改为jmp指令跳转到自己的函数地址,以此接管对目标函数的 调用,并插入自己的处理代码。在现实中,这种技术可以应用在很多场景下。比如Hook某些Windows API,在实际调用到系统函数前进行一些过滤工作;软件中使用到了一些没有源代码的第三方库,但是又想增强其中某些函数的功能,等等。

图1 Hook前后的程序执行流程对比。

图2 Hook前后目标函数和跳板代码的改变

Detours相对其他一些Hook库和自己实现的代码来说,通常有以下这些优点:

·      考虑全面,代码非常稳定,并且经过了微软自己众多产品的验证。

·      可以简单的用纯C/C++代码实现对类的成员函数的Hook。

·      购买版权之后的Detours Professional还可以支持x64和IA64处理器。以此为基础编写的代码拥有更强的可移植性。

·      使用简单,不需要了解汇编指令以及技术细节。

二、使用方法

一般来说,使用Detours的代码都具有固定的模式。Detours1.5和Detours 2.1的接口函数变了很多,这里按照2.1版本对基本的使用方法进行说明。

常用的函数有下面几个:

·      DetourTransactionBegin() :开始一次Hook或者Unhook过程。

·      DetourUpdateThread() :列入一个在DetourTransaction过程中要进行update的线程。这个函数的作用稍微有一些复杂,会在后面专门说明。

·      DetourAttach() :添加一个要Hook的函数。

·      DetourDetach () :添加一个要Unhook的函数。

·      DetourTransactionCommit() :执行当前的Transaction过程。在这个函数中才会真正进行Hook或者Unhook操作。前面三个函数都只是做一些记录工作。

在使用的时候,这几个函数的调用步骤基本上也是按照上面列出来的顺序。举例来说,现在想Hook掉API函数MessageBoxA,将消息框弹出的消息修改掉,可以按下面的方法做。

进行Hook的步骤:

1.       首 先需要定义目标函数的原型。如果目标函数是Windows API,可以到MSDN中查阅,但是需要注意ANSI版本和Unicode版本的区别。如果没有确切的原型声明,或者目标函数是通过逆向工程找出来的,那 么需要定义一个和目标函数原型兼容的声明,即参数个数和调用约定要相同。如MessageBoxA的原型是:

int MessageBoxA( HWND hWnd, LPCSTR lpText, LPCSTRlpCaption, UINT uType);

使用typedef定义如下:

typedef int (WINAPI *pfnMessageBoxA)( HWND hWnd,LPCSTR lpText, LPCSTR lpCaption, UINT uType);

2.       声明一个指向目标函数的函数指针:

pfnMessageBoxA g_pMessageBoxA = ::MessageBoxA;

3.       编写Hook函数的代码,用于替换目标函数。

4.       调用DetourTransactionBegin开始一次Detours事务。

5.       对进程中每个可能调用到目标函数的线程,都需要使用DetourUpdateThread加 入到update队列中。这是因为Hook时修改目标函数的前几个字节,如果某个线程刚好执行到这几个字节的位置时,粗暴的修改掉会造成该线程出现异常。 Detours事务处理时,会先枚举并暂停update队列中所有线程,获取它们的指令指针,如果发现这种情况,则将指令指针修改到跳板代码的对应字节 上。这样就避免出现崩溃的问题。

6.       对每个需要Hook的函数,调用DetourAttach加入到事务列表中。

7.       调用DetourTransactionCommit进行实际的Hook操作。

Unhook的过程和上面的流程基本一样,只是第6步改为调用DetourDetach函数。

Hook MessageBoxA的完整示例代码如下:

//Hook函数的向前声明

int WINAPIHook_MessageBoxA( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);

//目标函数原型声明

typedef int(WINAPI *pfnMessageBoxA)( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINTuType);

//指向目标函数的指针

pfnMessageBoxAg_pMessageBoxA = ::MessageBoxA;

BOOLStartHook()

{//开始Hook

DetourTransactionBegin();

//只有一个线程,所以GetCurrentThread

DetourUpdateThread(GetCurrentThread());

//添加MessageBoxA的Hook

if(DetourAttach( &(PVOID&)g_pMessageBoxA, Hook_MessageBoxA) != NO_ERROR)

{

printf("Hook MessageBoxA fail.\n");

}

//完成事务

if(DetourTransactionCommit() != NO_ERROR)

{

printf("DetourTransactionCommit fail\n");

return FALSE;

}

else

{

printf("DetourTransactionCommit ok\n");

return TRUE;

}

}

BOOLStopHook()

{//停止Hook

DetourTransactionBegin();

DetourUpdateThread(GetCurrentThread());

if(DetourDetach( &(PVOID&)g_pMessageBoxA, Hook_MessageBoxA) != NO_ERROR)

{

printf("Hook MessageBoxA fail.\n");

}

if(DetourTransactionCommit() != NO_ERROR)

{

printf("DetourTransactionCommit fail\n");

return FALSE;

}

else

{

printf("DetourTransactionCommit ok\n");

return TRUE;

}

}

int WINAPIHook_MessageBoxA( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)

{

//需要调用原函数时,可以直接使用前面定义的指针变量

returng_pMessageBoxA( hWnd, "MessageBox after hook.","TestDetours", MB_OK);

}

在附件的示例代码中还包含了Hook类成员函数的代码。流程和上面基本一致,只是需要用一些强制转换来对付编译器的类型检查。

另外,Detours还包含一系列其他函数,如果需要使用的话,可以参考Detours安装目录下的示例。

三、使用Detours的注意事项

总体来说,Detours库的代码是非常稳定的,但是如果使用方法不对,会造成一些问题。有下面一些地方需要特别注意:

1.       一定要枚举线程并调用DetourUpdateThread函数。否则可能出现很低几率的崩溃问题,这种问题很难被检查出来。

2.       如果Hook函数在DLL中,那么绝大多数情况下不能在Unhook之后卸载这个DLL,或者卸载存在造成崩溃的危险。因为某些线程的调用堆栈中可能还包含Hook函数,这时卸载掉DLL,调用堆栈返回到Hook函数时内存位置已经不是合法的代码了。

3.       Detours库设计时并没有考虑到卸载的问题,这 是因为钩子的卸载本身是不安全的。当Detours库代码存在于DLL中的时候,即使Unhook了所有函数,清理了所有自己使用到的函数,还是会占用一 些内存。卸载这个DLL会造成内存泄露,特别是反复的进行加载DLL->Hook->Unhook->卸载DLL的过程,会让这个问题 变得非常严重。后面会用一篇专题文章来讨论Detours内存泄露问题的调试和解决。

4.       有一些非常短的目标函数是无法Hook的。因为jmp指令需要占用一定空间,有些函数太过短小,甚至不够jmp指令的长度,自然是没有办法Hook掉的。

Detours不支持9x内核的Windows系统。因为9x内核下的内存模型和NT内核下有非常大的差别。

如何生成Detours.lib——Detours的使用准备

http://blog.csdn.net/sliufen/article/details/3932236

Detours是微软开发的一个函数库,可用于捕获系统API。在用其进行程序开发之前,得做一些准备工作:

一.下载Detours

http://research.microsoft.com/sn/detours 可免费下载Detours,当前的最新版本是

  • Detours Express 2.1 is available for immediate download under a no-fee, click-through license for research, non-commercial, and non-production use on 32-bit code.
  • Detours Professional 2.1 includes a license for use in production environments and the right to distribute detour functions in products. In addition to support for 32-bit x86 code, Detours Professional 2.1 includes support for 64-bit code on x64 and IA64 processors. For information on licensing Detours Professional 2.1 visit Microsoft‘s IP Licensing Group at www.microsoft.com/iplicensing and search under Detours.

由于我只是用于研究学习,所以下载的是第一个版本。

二.安装Detours

从网上下载的是DetoursExpress.msi,安装该文件

三.生成Detours库

在安装后的文件夹下找不到直接可以拿来用的LIB文件,但是却有SRC文件(在**/Microsoft Research/Detours Express 2.1/src下)。该文件夹下还有Makefile,可以直接用来生成库。

安装后的文件夹目录

具体生成库的做法是:

1.将Detours路径下的SCR文件夹拷贝到**/Microsoft Visual Studio/VC98路径下,注意是整个文件夹

2.运行**/Microsoft Visual Studio/VC98/Bin下VCVARS32.BAT文件.

在开始->运行里面输入CMD命令,在出来的命令行窗口里,将路径换至**/Microsoft Visual Studio/VC98/Bin,再将VCVARS32.BAT文件拖进命令行窗口里就行

3.运行NMAKE命令

在命令行窗口里将路径换到**/Microsoft Visual Studio/VC98/SRC,然后输入../bin/nmake指令,回车

4.待此命令运行完后,在**/Microsoft Visual Studio/VC98/Lib文件下就能找到detoured.lib与detours.lib文件.

http://blog.csdn.net/jiangxinyu/article/details/8086831

时间: 2024-11-15 06:23:16

Microsoft Detours 2.1简介的相关文章

Microsoft Word Documents from ASP.NET

原网页链接: http://www.codeproject.com/Articles/3959/Microsoft-Word-Documents-from-ASP-NET 官网demo链接;可以不用注册下载; http://download.csdn.net/detail/sat472291519/7794739 在ASP.NET中创建和打开Microsoft Word文档 简介 在一个ASP.NET项目中需要创建和打开来操作Microsoft Word文档. 文章演示了如何使用Microsof

SkinTK编译使用

简介 MFC这个东西已经落伍了,不建议使用.我就是吃饱了撑着,还在折腾这个. 平时写点带界面的小程序一般都用Qt来做,简单好用,也很容易做的比较漂亮.我觉得唯一一个算不得多大缺点的缺点就是Qt体积太大了. 之前用MFC写过几个小程序,那天看见一个介绍MFC美化的文章,就想着也给来加个皮肤.只是MFC没有像Qt的qss这么方便的东西. 网上看到一个开源的库SkinTK,就下载回来试试. 这个库不知道与CJ60Lib有什么关系,在这里下载的源码里面有一部分是来自cj60的.附上CJ60LIB的一篇编

微软-创建业务逻辑层

https://msdn.microsoft.com/zh-cn/dd255899 简介 在教程一中创建的数据访问层 (DAL) 将数据访问逻辑与表示逻辑清晰地分离开来.然而,尽管 DAL 从表示层中清晰地分离出数据访问层细节,它却并没有实施任何可能采用的业务规则.例如,我们想让我们的应用程序在 Discontinued 字段设为 1 时禁止对 Products 表的 CategoryID 或 SupplierID 字段的修改,还有,我们可能想实施一些资历规则以便禁止发生这样的情况:雇员被其后入

asp008网上购物系统access

目录 摘 要: 1 Abstract: 2 目录 3 第一章 概  述 1 1.1  系统研究对象 1 1.2  系统特点 1 1.3  系统研究内容 1 1.3.1 基本功能 1 1.3.2  高级功能 2 第二章   开发方法 3 2.1 系统运行环境配置 3 2.2  ASP简介 3 2.2.1 ASP的使用环境 4 2.2.2 配置Microsoft IIS 4 2.3  动态网页开发工具Dreamweaver MX简介 5 2.4  系统数据库介绍 6 2.4.1 数据库的概念 6 2

C# Json 写到吐

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using cuiplus; namespace ConsoleApplication6 { c

Detours简介 (拦截x86机器上的任意的win32 API函数)

Detours 当然是用detours,微软明显高腾讯一筹,同上,至今没失败过.写这种HOOK一定要再写个测试程序,不要直接HOOK你的目的程序,例如QQ,因为这样不方面更灵活的测试.说明一下:Detours是微软开发的一个函数库(源代码可在http://research.microsoft.com/sn/detours 免费获得)用于修改运行中的程序在内存中的影像,从而即使没有源代码也能改变程序的行为.具体用途是:拦截WIN32 API调用,将其引导到自己的子程序,从而实现WIN32 API的

Detours简介

HOOK api以前的做法是修改PE文件输入表,使其加载自定义的DLL去挂载对应的HOOK. 具体实现方式是在调用原API函数前,将其前8个字节修改为跳转到自己定义的函数地址,执行完函数,又将原API前8个字节恢复,再调用原API,到达对API劫持的功能. 在每次调用过程中,先修改前8字节,跳转到自定义函数,执行完再改回前8字节,执行原API,一次调用,多次修改. 而Dotours则是微软开发的一个函数库,专门用于捕获系统API.在使用之前,必须做以下相关准备工作: 1.下载dotours,下载

Microsoft SQL Server 简介

SQL Server 是Microsoft 公司推出的关系型数据库管理系统.具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2012 的大型多处理器的服务器等多种平台使用.Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理.Microsoft SQL Server 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存

云计算与数据科学:Microsoft Azure 机器学习与R 简介

通过易于使用的强大的基于云技术的数据处理与机器学习工具,微软Azure机器学习平台 (Azure ML)极大地简化了机器学习模型的开发和部署. O'Reilly 发布的技术文档 < Data Science in the Cloud with Microsoft Azure Machine Learning and R >介绍了基于Microsoft Azure 机器学子平台 数据操作.建模.模型评估等方面的内容. 该文档利用 R 语言深入探讨了Azure机器学习平台.(另一篇使用 Pytho