Detours是微軟開發(fā)的一個(gè)函數(shù)庫,可用于捕獲系統(tǒng)API。在用其進(jìn)行程序開發(fā)之前腺晾,得做一些準(zhǔn)備工作:
一.下載Detours
在http://research.microsoft.com/sn/detours 可免費(fèi)下載Detours,當(dāng)前的最新版本是
· 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.
由于我只是用于研究學(xué)習(xí),所以下載的是第一個(gè)版本。
二.安裝Detours
從網(wǎng)上下載的是DetoursExpress.msi麦牺,安裝該文件
三.生成Detours庫
在安裝后的文件夾下找不到直接可以拿來用的LIB文件钮蛛,但是卻有SRC文件(在**\Microsoft Research\Detours Express 2.1\src下)鞭缭。該文件夾下還有Makefile,可以直接用來生成庫魏颓。
安裝后的文件夾目錄
具體生成庫的做法是:
1.將Detours路徑下的SCR文件夾拷貝到**\Microsoft Visual Studio\VC98路徑下,注意是整個(gè)文件夾
2.運(yùn)行**\Microsoft Visual Studio\VC98\Bin下VCVARS32.BAT文件.
在開始->運(yùn)行里面輸入CMD命令,在出來的命令行窗口里,將路徑換至**\Microsoft Visual Studio\VC98\Bin,再將VCVARS32.BAT文件拖進(jìn)命令行窗口里就行
3.運(yùn)行NMAKE命令
在命令行窗口里將路徑換到**\Microsoft Visual Studio\VC98\SRC,然后輸入..\bin\nmake指令岭辣,回車
4.待此命令運(yùn)行完后,在**\Microsoft Visual Studio\VC98\Lib文件下就能找到detoured.lib與detours.lib文件.
// HOOK_使用微軟的HOOK庫.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
#include "stdafx.h"
//1. 添加HOOK庫的頭文件.
#include "detours/detours.h"
//2. 包含靜態(tài)庫
#ifdef _X64
#pragma comment(lib,"detours/lib.X64/detours.lib")
#else
#pragma comment(lib,"detours/lib.X86/detours.lib")
#endif // _X64
// 3. 定義想要HOOK的API的函數(shù)原型.
// 定義函數(shù)類型
typedef DWORD( WINAPI *fnMessageBox )( DWORD , TCHAR* , TCHAR* , DWORD );
// 4. 定義一個(gè)函數(shù)指針變量, 用于保存原始版本的API(沒有被HOOK的API)
fnMessageBox g_pSrcMessageBoxW ;
// 5. 盜版的MessageBox
DWORD WINAPI MyMessageBox( HWND hWnd , TCHAR* pText , TCHAR* pTitle , DWORD type ) {
// 調(diào)用原版函數(shù)
g_pSrcMessageBoxW( 0 , L"在盜版的MessageBox中彈出此框" , L"提示" , 0 );
return 0;
}
/*!
* \brief : hookFunction
* \return: LPVOID
* \param : LPVOID pSrcFcuntion 要被HOOK的API函數(shù)地址
* \param : LPVOID pDesFcuntion 要安裝的鉤子函數(shù).
*/
LPVOID hookFunction( LPVOID pSrcFcuntion , LPVOID pDesFcuntion ) {
//
DetourTransactionBegin( );
DetourUpdateThread( GetCurrentThread( ) );
// 攔截函數(shù),并把被鉤住的的函數(shù)輸出.
// 作用:
// 將pSrcFcuntion所保存的函數(shù)地址進(jìn)行HOOK
// 并將被HOOK前的API輸出到pSrcFcuntion
DetourAttach( &pSrcFcuntion , pDesFcuntion );
// 提交所有的更改(所有的HOOK)
if( DetourTransactionCommit( ) == NO_ERROR )
return pSrcFcuntion;// 返回原始版本的API地址
return NULL;
}
int _tmain(int argc, _TCHAR* argv[])
{
// detours使用步驟:
// 1. 初始化detours
// 2. 更新進(jìn)行detours的線程
// 3. 設(shè)置鉤子
// 4. 檢查鉤子是否設(shè)置錯(cuò)誤
MessageBoxW( 0 , L"正版函數(shù)" , L"提示" , 0 );
g_pSrcMessageBoxW =
(fnMessageBox)hookFunction( &MessageBoxW , &MyMessageBox );
MessageBoxW( 0 , L"正版函數(shù)" , L"提示" , 0 );
DetourTransactionBegin( );
DetourUpdateThread( GetCurrentThread( ) );
// 卸載鉤子
DetourDetach( (LPVOID*)&g_pSrcMessageBoxW , &MyMessageBox );
DetourTransactionCommit( );
MessageBoxW( 0 , L"正版函數(shù)" , L"提示" , 0 );
return 0;
}
=======================