使用微軟的HOOK庫

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;
}

=======================

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末甸饱,一起剝皮案震驚了整個(gè)濱河市沦童,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叹话,老刑警劉巖偷遗,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異驼壶,居然都是意外死亡氏豌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門热凹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泵喘,“玉大人,你說我怎么就攤上這事般妙〖推蹋” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵碟渺,是天一觀的道長(zhǎng)鲜锚。 經(jīng)常有香客問我,道長(zhǎng)苫拍,這世上最難降的妖魔是什么烹棉? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮怯疤,結(jié)果婚禮上浆洗,老公的妹妹穿的比我還像新娘。我一直安慰自己集峦,他們只是感情好伏社,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布抠刺。 她就那樣靜靜地躺著,像睡著了一般摘昌。 火紅的嫁衣襯著肌膚如雪速妖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天聪黎,我揣著相機(jī)與錄音罕容,去河邊找鬼。 笑死稿饰,一個(gè)胖子當(dāng)著我的面吹牛锦秒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播喉镰,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼旅择,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了侣姆?” 一聲冷哼從身側(cè)響起生真,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捺宗,沒想到半個(gè)月后柱蟀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚜厉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年长已,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弯囊。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡痰哨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匾嘱,到底是詐尸還是另有隱情斤斧,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布霎烙,位于F島的核電站撬讽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏悬垃。R本人自食惡果不足惜游昼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尝蠕。 院中可真熱鬧烘豌,春花似錦、人聲如沸看彼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至标锄,卻和暖如春顽铸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背料皇。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工谓松, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人践剂。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓鬼譬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親舷手。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拧簸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,914評(píng)論 2 89
  • 用兩張圖告訴你劲绪,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料男窟? 從這篇文章中你...
    hw1212閱讀 12,704評(píng)論 2 59
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,871評(píng)論 25 707
  • 十年了,所有來不及說的話贾富,未完成的夢(mèng)都在成為別人新郎的那一刻開始再也沒有回頭路了歉眷! 那個(gè)我愛了十年的男人在
    南田日暖玉升煙閱讀 272評(píng)論 0 0
  • 杰寶是一個(gè)傻傻的愛笑的姑娘,也是一個(gè)會(huì)莫名沉默的姑娘颤枪,生活在自己的小世界汗捡,任性著…… 她總是在別人面前裝出我不在乎...
    杰寶的小思緒閱讀 191評(píng)論 0 0