Detour安装及简单使用实例
来源:互联网 发布:流氓推广软件是什么 编辑:程序博客网 时间:2024/05/01 15:28
Detours是微软开发的一个函数库,可用于捕获系统API。在用其进行程序开发之前,得做一些准备工作:
一.下载Detours
在http://research.microsoft.com/sn/detours 可免费下载Detours
二.安装Detours
一路NEXT
三.生成Detours库
在安装后的文件夹下找不到直接可以拿来用的LIB文件,但是却有SRC文件(在**\Microsoft Research\Detours Express 2.1\src下)。该文件夹下还有Makefile,可以直接用来生成库。
将Detours路径下的SCR文件夹拷贝到**\Microsoft Visual Studio 9.0\VC路径下,注意是整个文件夹(其它版本VC自己照着复制)
运行cmd,(win7需要在system32目录找到cmd右键以管理员身份运行),切换至 c:\Program Files\Microsoft Visual Studio 9.0\VC\bin目录运行vcvars32.bat
切换到\Microsoft Visual Studio9.0\VC\SRC,然后输入..\bin\nmake指令,编译成功后在\Microsoft Visual Studio9.0\VC\Lib文件下就能找到detoured.lib与detours.lib文件了。
来看几个关键函数:
在Detours库中,驱动detours执行的是函数
[cpp] view plain copy
LONG DetourAttach(
PVOID * ppPointer,
PVOID pDetour
);
这个函数的职责是挂接目标API,函数的第一个参数是一个指向将要被挂接函数地址的函数指针,第二个参数是指向实际运行的函数的指针,一般来说是我们定义的替代函数的地址。但是,在挂接开始之前,还有以下几件事需要完成:
需要对detours进行初始化. DetourTransactionBegin()
需要更新进行detours的线程. DetourUpdateThread(GetCurrentThread())
在这两件事做完以后,detour函数才是真正地附着到目标函数上。
在此之后,调用DetourTransactionCommit()是detour函数起作用并检查函数的返回值判断是正确还是错误。
想把HOOK的函数改回來则可以使用
[cpp] view plain copy
LONG WINAPI DetourDetach(
PVOID *ppPointer,
PVOID pDetour)
参数与DetourAttach相同
付使用简单例子:HOOK MessageBoxW函数
[cpp] view plain copy
include “stdafx.h”
include “DetourHook.h”
include
pragma comment(lib, “detours.lib”)
pragma comment(lib, “detoured.lib”)
static int (WINAPI* OLD_MessageBoxW)(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType)=MessageBoxW;
int WINAPI NEW_MessageBoxW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType)
{
//修改输入参数,调用原函数 int ret=OLD_MessageBoxW(hWnd,L"输入参数已修改",L"[测试]",uType); return ret;
}
VOID Hook()
{
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
//这里可以连续多次调用DetourAttach,表明HOOK多个函数 DetourAttach(&(PVOID&)OLD_MessageBoxW,NEW_MessageBoxW); DetourTransactionCommit();
}
VOID UnHook()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
//这里可以连续多次调用DetourDetach,表明撤销多个函数HOOK DetourDetach(&(PVOID&)OLD_MessageBoxW,NEW_MessageBoxW); DetourTransactionCommit();
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MessageBoxW(0,L”正常消息框”,L”测试”,0);
Hook();
MessageBoxW(0,L”正常消息框”,L”测试”,0);
UnHook();
return 0;
}
还有一個DetourCreateProcessWithDll函数,该函数是在以DLL注入方式拦截API时使用的,它其实就是封装“CreateProcess”,以“CREATE_SUSPEND”方式创建进程,然后修改IAT,把Detoured.dll和您的*.dll插入到它的导入表,然后再启动进程。所以它的参数就是在普通的CreateProcess基础上增加了两个DLL的路径参数,最后一个参数为创建进程的函数指针,默认为CreateProcessA,简单的说就是可以在创建进程的時候加载一個dll吧
示例代码:
[cpp] view plain copy
undef UNICODE
include
include
include
undef UNICODE
include
include
include
- Detour安装及简单使用实例
- Detour安装及简单使用实例
- Detour安装及简单使用实例
- 图解Detour安装及简单使用实例(Win7+VC6)
- (四)Detour安装及捕获系统API
- PHPMailer安装及简单实例
- Django 安装及简单实例
- Pig安装及简单实例
- Pig安装及简单实例
- Pig安装及简单实例
- Pig安装及简单实例
- Detour的安装
- Detour工具包使用
- Detour的使用
- Detour工具包使用
- mysql安装及使用实例
- ActiveMQ安装及使用实例
- centos mongodb安装及简单实例
- MongoDB 启动方式
- MYSQL GROUP BY用法详解
- 学习php自行开发mvc框架过程(七)
- Apache Jmeter3.0 HTTP压力测试
- 数字转换工具类:将阿拉伯数字转换成中文
- Detour安装及简单使用实例
- 欢迎使用CSDN-markdown编辑器
- STUN/TURN/ICE协议在P2P SIP中的应用(一)
- 解决过度绘制的过程以及遇到的一些坑
- Spring——IOC容器基本概念
- Scrapy爬虫(八):中间件的使用实例
- 文本的特征属性选择
- CSS3的4大伪元素选择器详解
- 奥斯卡奖章——第六届中山大学程序设计大赛