微软Hook库<detours>初体验

1.安装

今天突然心血来潮,想随便研究些东西。网上看到这个库就下载安装了一下。

整体还算顺利

首先官网下载此库

地址是:微软

进去之后选择download。

下载文件到本地之后目录下面有个src文件夹,还有一些简单的实例。

这里就不看了,直接进行编译。

我的开发环境是vs2013,编译的采用markfile编写的。用微软出的nmake编译。

首先进入vs目录下的vc目录,C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin下面有个vcvars32.bat

是设置vc编译环境变量的。通过dos先执行此批处理。

执行后切换到src目录,执行命令

cmake

编译成功后会在父级目录生成两个文件夹,include ,obj.x86

这两个文件夹.

通过vs打开后

创建一个项目,配置项目属性 引用目录 > inlcude目录.

添加预处理 命令

#pragma comment(lib,"detours.lib")

2.使用

DetourRestoreAfterWith(); //不知道什么用
DetourTransactionBegin(); //不知道什么用 
DetourUpdateThread(GetCurrentThread()); //不知道什么用 
DetourAttach(&(PVOID&)OldMessageBoxA, MyMessageBoxA); //Hook跳转实现 
error = DetourTransactionCommit(); // 错误返回.

下面是一个完成的代码。hook MessageBoxA

算是自己做一个备忘吧。

#include <windows.h> 
 #include "detours.h" 
 #include <string>

#pragma comment(lib,"detours.lib")

static int (WINAPI * OldMessageBoxA)( 
    _In_opt_ HWND hWnd, 
    _In_opt_ LPCSTR lpText, 
    _In_opt_ LPCSTR lpCaption, 
    _In_ UINT uType) = MessageBoxA;

int 
 WINAPI 
 MyMessageBoxA( 
 _In_opt_ HWND hWnd, 
 _In_opt_ LPCSTR lpText, 
 _In_opt_ LPCSTR lpCaption, 
 _In_ UINT uType){ 

     return OldMessageBoxA(NULL, "Hello Hook","hello", MB_OK); 
}

int __stdcall WinMain( 
    HINSTANCE hInstance, 
    HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, 
    int nCmdShow 
    ) 
 { 
     long error;

    MessageBoxA(NULL, "Hello wolrd!", "hello", MB_OK);

    DetourRestoreAfterWith();

    DetourTransactionBegin(); 
    DetourUpdateThread(GetCurrentThread()); 
    DetourAttach(&(PVOID&)OldMessageBoxA, MyMessageBoxA); 
    error = DetourTransactionCommit();

    if (error == NO_ERROR) { 
        OutputDebugStringA("Done"); 
    } 
    else { 
        OutputDebugStringA("Error"); 
    }

    switch (error) 
    { 
        case ERROR_INVALID_BLOCK: 
            OutputDebugStringA("ERROR_INVALID_BLOCK"); 
            break; 
        case ERROR_INVALID_HANDLE: 
            OutputDebugStringA("ERROR_INVALID_HANDLE"); 
            break; 
        case ERROR_INVALID_OPERATION: 
             OutputDebugStringA("ERROR_INVALID_OPERATION"); 
             break; 
        case ERROR_NOT_ENOUGH_MEMORY: 
            OutputDebugStringA("ERROR_NOT_ENOUGH_MEMORY"); 
            break; 
        default: 
            break; 
    }

    MessageBoxA(NULL, "Hello wolrd!", "hello", MB_OK);

    return 0; 
 }

仅有一条评论

添加新评论