Detours的作用和实例

Detours 可以用来拦截Win32的API函数,从而让程序按照我们自定义的方式进行处理,而不是Windows默认的。

Detours 也是通过Dll的方式,拦截Api函数。

例:拦截Win32的MessageBoxA()函数

1.先新建一个Dll工程

#include "detours.h"
#pragma comment(lib,"detours.lib") //导入detours.h和detours.lib文件

//static BOOL (WINAPI* Real_Messagebox)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)=MessageBoxA;
int (WINAPI *Real_Messagebox)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)= MessageBoxA; //注意是MessageBoxA函数
extern "C" _declspec(dllexport) BOOL WINAPI MessageBox_Mine(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
{
	CString temp= lpText;
	temp+="该MessageBox已被Detours截获!";
	return Real_Messagebox(hWnd,temp,lpCaption,uType);
}

//dll入口函数
BOOL WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpvReserved)
{
	if (DLL_PROCESS_ATTACH == fdwReason)
	{
		DetourTransactionBegin();
		DetourUpdateThread(GetCurrentThread()); //当前线程
		DetourAttach(&(PVOID&)Real_Messagebox,MessageBox_Mine); //设置detour
		DetourTransactionCommit();
	}
	else if (DLL_PROCESS_DETACH == fdwReason)
	{
		DetourTransactionBegin();
		DetourUpdateThread(GetCurrentThread());
		DetourDetach(&(PVOID&)Real_Messagebox,MessageBox_Mine);//卸载detour
		DetourTransactionCommit();
	}
	return TRUE;

}

特别要注意的就是MessageBox和MessageBoxA是不同的,我刚开始以为detours不会把它们区分,结果一直无法拦截成功。

2.新建一个MFC工程(在按扭响应函数中添加 MessageBoxA())

在其OnInitDialog()函数中 添加::LoadLibrary(L"messageDll.dll"); //注意路径问题

然后在按钮响应函数中添加 ::MessageBoxA(NULL,"4444443","23",0);

这样当成功后 点击按钮就可以拦截到MessageBox函数

效果如图:

时间: 2024-11-13 09:35:35

Detours的作用和实例的相关文章

mysql stored routine (存储例程) 中 definer 的作用 和实例

创建 例程语法参见https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html 创建procedure 的语法如下 CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body definer 的作用是进行一个权限的控制 只有super 权限或者 指定的 pr

Python中逗号作用的实例分析

逗号在类型转化中的使用 主要是元组的转换 例如: >>> a=11>>> b=(a)>>> b11>>> b=(a,)>>> b(11,)>>> b=(a,22)>>> b(11, 22)>>> b=(a,22,)>>> b(11, 22)>>> 从中可以看出  只有当b元组中只有一个元素的时候  需要逗号来转换为元组类型 另外

关于input 中 hidden属性在后台作用的实例

在双模的项目中,我遇到了一个问题,我公司的双模项目是基于ECShop的框架,在完成订单列表的页面时,我写了两个form表单来单独传输数据,第一个表单是用来做搜素的,第二个表单是用来显示表单信息的,在控制器中我并不是用index方法来渲染这个页面的,这是这个问题的关键,我用的是同一个控制器下的productionOrderList方法,所以在第一个form表单里,我需要传连个东西,分别是 app act.下面就来看看我的具体代码吧 <!-- 搜索表单 --> <form name='for

【05】Vue 之 实例详解与生命周期

Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理.数据模型等,当然它也有自己的一系列的生命周期的事件钩子,辅助我们进行对整个Vue实例生成.编译.挂着.销毁等过程进行js控制. 5.1. Vue实例初始化的选项配置对象详解 前面我们已经用了很多次 new Vue({...})的代码,而且Vue初始化的选项都已经用了data.methods.el.computedd等,估计您看到这里时,应该已经都明白了他们的作用,我们就详细讲解一下他们的使用情况.更

Vue入门系列(五)Vue实例详解与生命周期

[入门系列] [本文转自] http://www.cnblogs.com/fly_dragon Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理.数据模型等,当然它也有自己的一系列的生命周期的事件钩子,辅助我们进行对整个Vue实例生成.编译.挂着.销毁等过程进行js控制. 5.1. Vue实例初始化的选项配置对象详解 前面我们已经用了很多次 new Vue({...})的代码,而且Vue初始化的选项都已经用了data.methods.el.comp

面向对象高级编程——类、实例及其他对象的内建函数

内建函数 描      述 issubclass(sub,sup) 如果类sub是类sub的子类,则返回True,反之为False isinstance(obj1,obj2) 如果实例obj是类obj2或者obj2子类的一个实例,则返回True,反之为False hasattr(obj,attr) 如果obj有属性attr,则返回True getattr(obj,arrt[,default]) 返回对象obj的arrt属性,如果不存在,可以设置一个默认值,否则报错 setattr(obj,att

Vue 实例详解与生命周期

Vue 实例详解与生命周期 Vue 的实例是 Vue 框架的入口,其实也就是前端的 ViewModel,它包含了页面中的业务逻辑处理.数据模型等,当然它也有自己的一系列的生命周期的事件钩子,辅助我们进行对整个 Vue 实例生成.编译.挂着.销毁等过程进行 js 控制. Vue 实例初始化的选项配置对象详解 前面我们已经用了很多次 new Vue({...})的代码,而且 Vue 初始化的选项都已经用了data.methods.el.computedd等,估计您看到这里时,应该已经都明白了他们的作

汉语-词语:实例

ylbtech-汉语-词语:实例 实例,指实际存在的例子.语出鲁迅 <呐喊·风波>:“总之现在的世界是不对了.何况 六斤 比伊的曾祖,少了三斤,比伊父亲 七斤 ,又少了一斤,这真是一条颠扑不破的实例.” 1.返回顶部 1. 中文名:实例 注    音:ㄕㄧˊ ㄌㄧˋ 拼    音:shí lì 词    目:实例 目录 1 词语概念 ? 基本解释 ? 引证解释 2 计算机用语 2. 2.返回顶部 1. 词语概念 基本解释 [living example] 实际存在的例子 用实例来证明 引证解释

(6)类型和成员基础

6.1 类型的各种成员 在一个类型中,可以定义0个或者多个以下种类的成员: 常量 常量是在编译时设置其值并且永远不能更改其值的字段.使用常量可以为特殊值提供有意义的名称以代替数字文本,以使代码变得更容易阅读及维护.定义常量请使用关键字const.private const Int32 SomeConstant = 1; 字段 字段存储着类满足其设计所必须拥有的数据.例如,表示日历日期的类可能有三个整数字段:一个表示月份,一个表示日期,还有一个表示年份.强烈建议将字段声明为私有字段,防止类型的状态