Nisy 发表于 2014-12-31 16:59:04

Detours3 使用示例代码





// stdafx.h

#include <Windows.h>
#include "..\\include\\detours.h"
#ifdef WIN32
#pragma comment(lib,"..\\lib\\x86\\Detours.lib")
#endif
#ifdef WIN64
#pragma comment(lib,"..\\lib\\x64\\Detours.lib")
#endif




//TestDetours.cpp

#include "stdafx.h"

typedef int (WINAPI * FP_MessageBoxW)(HWND hWnd,
               LPCWSTR lpText,
               LPCWSTR lpCaption,
               UINT uType
               );

FP_MessageBoxW pMessageBoxW = MessageBoxW;

int WINAPI NsMessageBoxW(HWND hWnd,
                        LPCWSTR lpText,
                        LPCWSTR lpCaption,
                        UINT uType
                        )
{
    lpText = L"Detours!文字被修改!";
    return pMessageBoxW( hWnd, lpText, lpCaption, uType );
}


VOID TestDetours()
{
    // 目标 HOOK MessageBoxW
    MessageBoxW(NULL,L"测试弹窗,未被修改。",L"PYG",0);
}

// 启用 Detours HOOK
BOOL InitDetours()
{

    BOOL bRet = FALSE;

    __try
    {
      // 简单判一下函数是否成功,也可以不用判断返回值
      // 第一步
      if ( DetourTransactionBegin() )
            __leave;
      // 第二步
      if ( DetourUpdateThread( ::GetCurrentThread() ) )
            __leave;

      // 第三步 添加我们HOOK的替换函数
      DetourAttach( &(PVOID&)pMessageBoxW, NsMessageBoxW );
      // 继续添加其他的HOOK
      // DetourAttach( &(PVOID&)pMessageBoxA, NsMessageBoxA );

      // 第四步
      if ( DetourTransactionCommit() != NO_ERROR )
            __leave;

      bRet = TRUE;

    }
    __finally
    {
      ;
    }

    return bRet;
}

// 停用 Detours HOOK
BOOL UnInitDetours()
{
    BOOL bRet = FALSE;

    __try
    {

      // 第一步
      if ( DetourTransactionBegin() != NO_ERROR )
            __leave;
      // 第二步
      if ( DetourUpdateThread( ::GetCurrentThread() ) != NO_ERROR )
            __leave;

      // 第三步 同上添加了几个这里就反安装几个
      DetourDetach( &(PVOID&)pMessageBoxW, NsMessageBoxW );

      // 第四步
      if ( DetourTransactionCommit() != NO_ERROR )
            __leave;

      bRet = TRUE;

    }
    __finally
    {
      ;
    }

    return bRet;
}

int _tmain(int argc, _TCHAR* argv[])
{

    DWORD TickCount = GetTickCount();

    // 原始弹窗
    TestDetours();

    // 设置钩子
    InitDetours();

    TestDetours();

    // 恢复钩子
    UnInitDetours();

    // 原始弹窗
    TestDetours();

        return 0;
}





qqlinhai 发表于 2014-12-31 17:03:53

沙发~

gujin162 发表于 2014-12-31 18:25:42


感谢楼主分享!

small-q 发表于 2014-12-31 18:26:23

感谢NISY提供实例!

Nisy 发表于 2014-12-31 18:32:22

mHook 测试代码 X86\X64

small-q 发表于 2014-12-31 18:26
感谢NISY提供实例!


Detours 和 mHook 这些库的好处就在于,可以在函数执行前或函数执行后用C语言来做一些事情。

int WINAPI NsMessageBoxW(HWND hWnd,
                        LPCWSTR lpText,
                        LPCWSTR lpCaption,
                        UINT uType
                        )
{
    lpText = L"Detours!文字被修改!";
    // 原函数执行前做你想做的事情
    int lRet = pMessageBoxW( hWnd, lpText, lpCaption, uType );
    // 原函数执行后做你想做的事情
    return lRet;
}

tree_fly 发表于 2014-12-31 18:56:52

很强大的Detour,感谢提供64位。

lucky_789 发表于 2015-1-1 11:41:06

你这是泄露版吗?{:soso_e113:}

sdnyzjzx 发表于 2015-1-1 11:49:06

谢谢分享!

xdnice 发表于 2015-1-1 15:27:39

谢谢N大。收到了。。

sunflover 发表于 2015-1-1 18:05:57

不是很会用,限制比较多,比如无法HOOK任意地址
页: [1] 2
查看完整版本: Detours3 使用示例代码