首页
社区
课程
招聘
[分享]Win API HOOK 之 Detours
发表于: 2012-11-4 13:45 8576

[分享]Win API HOOK 之 Detours

2012-11-4 13:45
8576
相信不少刚学HOOK的朋友,还在苦恼HOOK代码写起来麻烦,有的朋友甚至不会计算HOOK地址.
Detours 解决了所有的问题了.
Detours 是M$ 出的一个库.
下载地址:http://research.microsoft.com/en-us/projects/detours/  最新版本是3.0. 下载后,需自行安装 编译.

配置:
1 将Detours安装目录中的src拷贝至VS安装目录/Microsoft Visual Studio 9.0/VC/bin
2 打开CMD控制台
3 将/Microsoft Visual Studio 9.0/VC/bin/vcvars32.bat拖入控制台运行
4 控制台进入到/Microsoft Visual Studio 9.0/VC/bin目录下,输入运行nmake


Detours功能:

1 拦截x86机器上的任意的win32 API函数。
2 插入任意的数据段到PE文件中,修改DDL文件的导入表。


Detours库可以拦截任意的API调用,拦截代码是在动态运行时加载的。Detours替换目标API最前面的几条指令,使其无条件的跳转到用户提供的拦截函数。被替换的API函数的前几条指令被保存到trampoline 函数(就是内存中一个数据结构)中. trampoline保存了被替换的目标API的前几条指令和一个无条件转移,转移到目标API余下的指令。
当执行到目标API时,直接跳到用户提供的拦截函数中执行,这时拦截函数就可以执行自己的代码了。当然拦截函数可以直接返回,也可以调用trampoline函数,trampoline函数将调用被拦截的目标API,目标API调用结束后又会放回到拦截函数。下图就是Detours API拦截的逻辑流程:



#include "stdafx.h"
#include "detours.h"
#pragma comment(lib, "detours.lib")
#pragma warning(disable : 4098)



static int (WINAPI* MESSAGEBOXA)(HWND hWnd, 
                                 LPCTSTR lpText, 
                                 LPCTSTR lpCaption, 
                                 UINT uType) = MessageBoxA;

int  WINAPI DealMsgProc(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) 
{  
    BOOL bRet;

    strcpy((PCHAR)lpText, "Hello Kitty!");

    bRet = MESSAGEBOXA(hWnd, lpText, lpCaption, uType);

    return bRet;
}
  
VOID Hook()
{
    DetourTransactionBegin();  

    DetourUpdateThread(GetCurrentThread());  

    DetourAttach(&(PVOID&)MESSAGEBOXA, DealMsgProc);  

    DetourTransactionCommit();  
}


VOID UnHook ()
{
    DetourTransactionBegin();  

    DetourUpdateThread(GetCurrentThread());  

    DetourDetach(&(PVOID&)MESSAGEBOXA, DealMsgProc);  

    DetourTransactionCommit();  
}

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    if (ul_reason_for_call == DLL_PROCESS_ATTACH)
    {  
        Hook (); 
    }  
    else if (ul_reason_for_call == DLL_PROCESS_DETACH) 
    {  
        UnHook ();
    }  

    return TRUE;
}


模块和头文件.7z

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 69
活跃值: (157)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
VOID UnHook ()
{
    DetourTransactionBegin();  

    DetourUpdateThread(GetCurrentThread());  

    DetourAttach(&(PVOID&)MESSAGEBOXA, DealMsgProc);  //函数貌似用错了,用DetourDetach

    DetourTransactionCommit();  
}
2012-11-4 14:21
0
雪    币: 223
活跃值: (516)
能力值: ( LV13,RANK:520 )
在线值:
发帖
回帖
粉丝
3
Tks!


再请教你一下,

Deleting intermediate files and output files for project 'Local - Win32 Debug'.
--------------------Configuration: Local - Win32 Debug--------------------
Compiling resources...
Compiling...
StdAfx.cpp
Compiling...
Local.cpp
SeggingDlg.cpp
Generating Code...
Linking...
   Creating library Debug/Local.lib and object Debug/Local.exp
libcmtd.lib(crt0init.obj) : warning LNK4098: defaultlib "libc.lib" conflicts with use of other libs; use /NODEFAULTLIB:library

Local.dll - 0 error(s), 1 warning(s)

这个错误,在VC中,如何忽略...
2012-11-4 14:37
0
雪    币: 242
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
http://blog.csdn.net/smilecup/article/details/2078885
2012-11-4 15:07
0
雪    币: 223
活跃值: (516)
能力值: ( LV13,RANK:520 )
在线值:
发帖
回帖
粉丝
5
谢谢,解决了.你这个贴子我没看懂,我是在
http://hi.baidu.com/linzch/item/579f505ba56976454eff20d2
看懂了..

Deleting intermediate files and output files for project 'Local - Win32 Debug'.
--------------------Configuration: Local - Win32 Debug--------------------
Compiling resources...
Compiling...
StdAfx.cpp
Compiling...
Local.cpp
SeggingDlg.cpp
HotKey.cpp
Generating Code...
Linking...
   Creating library ../exe/Local.lib and object ../exe/Local.exp

Local.dll - 0 error(s), 0 warning(s)

我是在setting->link->input->ignore libraries中 忽略了 libc.lib 就解决了.

另外学了一个参数.

加一个/VERBOSE选项就可以看到详尽的链接过程
verbose  
英 [vɜː'bəʊs]  美 [vɜː'bəʊs] 
2012-11-4 16:03
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
Detours  无法下载啊
2012-11-5 13:08
0
雪    币: 184
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这个要了解一下
2013-3-19 17:26
0
雪    币: 60
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
叫我们下载3.0版本的库,自己却上传的是2.1版本的库,
2013-3-23 04:50
0
游客
登录 | 注册 方可回帖
返回
//