• Detours 劫持


    在使用 Detours 劫持之前必须得拥有这两个东西:detours.h 和 detours.lib

    为了这两个东西我真的是弄了大半天,本着自己动手丰衣足食的思想:

    我去 GitHub 克隆了一份来自己编译,对着网上的教程弄,在编译的时候就是各种 bug。

    试了一次又一次,算了还是找别人编译好了的用吧!目前最新版本是 Detours 4.01 版。

    拿到编译好的头文件和库后,我放到 VC6.0 相应的文件中去,结果在编程时发现头文件出错!

    这时我就懵逼了,最后发现是因为 VC6.0版本太低导致的。因此最后便放到 VS2017 中去了。

    说到这里,如果你不想自己动手尝试的话,这里给你编译好的 Detours 库。请点击下载

    关于 Detours 里的函数发现网上并没有比较详细的介绍:这里就借鉴一下别人的博客吧!

    我觉的这两个博客还是挺不错的:心梦无痕吹成狗的攻城狮

    这里我们同样来拦截两个函数:通常情况下代码是这样的:

    复制代码
    #include "stdafx.h"
    #include<detours.h>
    #include<Windows.h>
    #pragma comment(lib,"detours.lib")
    
    void HookOn();
    void HookOff();
    
    static int (WINAPI *OldMesssageBoxA)
    (
        HWND hWnd,
        LPCSTR lpText,
        LPCSTR lpCaption,
        UINT uType
    ) = MessageBoxA;
    
    static int (WINAPI *OldMesssageBoxW)
    (
        HWND hWnd,
        LPCWSTR lpText,
        LPCWSTR lpCaption,
        UINT uType
    ) = MessageBoxW;

    // 注意了,自定义函数得和被 HOOK 的函数一样,否则会发生异常。 int WINAPI MyFunction0 ( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType ); int WINAPI MyFunction1 ( HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType ); BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: HookOn(); break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: HookOff(); break; } return TRUE; } void HookOn() { //开始事务 DetourTransactionBegin(); //更新线程信息 DetourUpdateThread(GetCurrentThread()); //将拦截的函数附加到原函数的地址上,这里可以拦截多个函数。 DetourAttach(&(PVOID&)OldMesssageBoxA, MyFunction0); DetourAttach(&(PVOID&)OldMesssageBoxW, MyFunction1); //结束事务 DetourTransactionCommit(); } void HookOff() { //开始事务 DetourTransactionBegin(); //更新线程信息 DetourUpdateThread(GetCurrentThread()); //将拦截的函数从原函数的地址上解除,这里可以解除多个函数。 DetourDetach(&(PVOID&)OldMesssageBoxA, MyFunction0); DetourDetach(&(PVOID&)OldMesssageBoxW, MyFunction1); //结束事务 DetourTransactionCommit(); }
    // 调用被 HOOK 的函数可以用被 HOOK 函数的指针,不能用原函数。 int WINAPI MyFunction0(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType) { return OldMesssageBoxA(NULL, "Hooking your MessageBoxA!", "Warming", MB_OKCANCEL); } int WINAPI MyFunction1(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType) { return OldMesssageBoxW(NULL, L"Hooking your MessageBoxW!", L"Warming", MB_OKCANCEL); }
    复制代码

    这段代码是在 VS2017 上生成的,我一般都是在虚拟机里运行的,所以需要进行一些设置:

    调试 ---> Dll 属性 ---> C/C++ ---> 代码生成 ---> 运行库---多线程/MT,这样设置完后就可以了。

    我们将生成的 dll 文件注入到记事本后,会看到这样:

    链接:https://pan.baidu.com/s/1VMIO068JBYPl7v7inWfGvw
    提取码:t7kf

  • 相关阅读:
    java中为什么notify()可能会导致死锁,而notifyAll()则不会
    java中wait()和sleep()的区别;notify()和notifyall()区别
    你不知道的Golang盲点汇总【持续更新】
    rsync性能终极优化【Optimize rsync performance】
    基于cephfs搭建高可用分布式存储并mount到本地
    检测代码潜在bug和质量之SonarQube
    玩透二叉树(Binary-Tree)及前序(先序)、中序、后序【递归和非递归】遍历
    好用到哭!8个技巧让Vim菜鸟变专家
    Golang fmt Printf 格式化参数手册/详解/说明
    淘宝滑动验证码研究
  • 原文地址:https://www.cnblogs.com/ruingking/p/13961503.html
Copyright © 2020-2023  润新知