• Detours HOOK 库 过滤LoadLibraryExW


    Detours HOOK 库 Hook 过滤LoadLibraryExW

    一丶简介

    1.1 Detours库简介

    Detours是微软提供的HOOK库.为我们Hook提供了方便.再也不用手撸 HOOK了.当然手撸比较好.可以锻炼.不过工作中要求效率.所以使用这个库.
    这个库很强大.对于初学者来说也很简单.

    1.2 使用Detours需要注意的问题

    为什么说我们需要注意.很多博客也有说.但是往往都不太注意.比如我.一开始使用这个Hook库的时候各种崩溃.最后调试一下.发现了问题.
    所以这里列举出来

    1. 如果HOOK API 一定要注意调用约定

    比如我们如果HOOK一个API.一定要注意它的调用约定.否则最后平栈的时候返回地址不对.就会引发错误.当时我就犯了这个错误.不过调试之后解决了.

    比如你HOOK 自定义函数.的时候,如果是自己写的.没加调用约定的时候,那么就是C调用约定

    2. 不要使用typedef 重新定义函数指针
    为什么说不要使用.也不是不要使用.主要是当时比较急.解决棘手问题.
    用了typedef. 导致函数地址不一样就出错了.所以能使用但是你需要了解一下.因为我工作原因.并没有深究.

    二丶使用Detours的步骤

    2.1下载Detours.以及使用

    说到使用,我们必须要下载Detours.当然我会上传.你可以去CSDN下载.或者自己下载源码编译.我下了好多.也编译好了.会上传.直接下载即可.
    首先使用Detours.
    Detours有两个头文件.我们都包含即可.

    #include "detours.h"
    #include "detver.h"
    
    

    还需要一个lib库.我们放在VS工程中即可.

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

    2.2使用Detours步骤很简单.都是固定API

    如下:

    
    void DetoursHook()
    {
    	DetourRestoreAfterWith();
    	DetourTransactionBegin();           
    	DetourUpdateThread(GetCurrentThread());
    	DetourAttach(&(LPVOID&)PFnLoadLibraryExW, MyLoadLibraryExw);
    	DetourTransactionCommit();
    
    }
    
    

    总共五步
    1.AfterWith()避免重复HOOK
    2.TransactionBegin();开始HOOK
    3.UpdateThread();更新到当前线程
    4.DetourAttch();你要HOOK的函数的函数的地址,以及你自定义的函数的函数地址.
    5.TransactionCommit();提交HOOK 这一步才是最终进行HOOK.

    看一下第4步,DetourAttch();
    这一个函数指针我们需要定义为下面这样.比如
    LoadLibraryExW

    static HMODULE(WINAPI *PFnLoadLibraryExW)(LPCWSTR lpLibFileName, HANDLE  hFile, DWORD   dwFlags) = (HMODULE(WINAPI *)(LPCWSTR, HANDLE, DWORD))DetourFindFunction("KernelBase.dll", "LoadLibraryExW");
    

    前边是LoadLibraryExW的函数指针定义. 后面的 = 是对他进行赋值.不过需要强转.
    DetourFindFunction函数就是寻找函数地址.给一个模块名,给一个函数名他就去找.然后找到就返回.不过你需要强转进行赋值即可.

    我们上面说了,既然要进行绑定.那么需要提供一个我们自己的函数才可以.
    自己定义的函数如下:

    HMODULE  WINAPI MyLoadLibraryExw(LPCWSTR lpLibFileName, HANDLE  hFile, DWORD   dwFlags)
    {
    	 
    	
    	
    	 
        if( wcscmp(lpLibFileName,TEXT("XXX) == 0)
        {
          return NULL; //return NULL的意思就是loadlibrary直接返回NULL就是没有加载,这一步就相当于拦截了.
        }
    	return PFnLoadLibraryExW(lpLibFileName, hFile, dwFlags); //调用原函数,就是不做处理
    	
    }
    
    

    2.2 HOOK 自定义 函数

    上面说我们使用DetourFindFunction寻找API,其实我们HOOK自己的我们也可以写一个跟它一样的函数. 原理就是返回一个地址.
    你知道你的函数地址在哪你都可以写成如下;

    static HMODULE(WINAPI *PFnLoadLibraryExW)(LPCWSTR lpLibFileName, HANDLE  hFile, DWORD   dwFlags) = (HMODULE(WINAPI *)(LPCWSTR, HANDLE, DWORD))0x40001200
    
    

    假设你的函数地址是0x40001200,那么Detours就会去HOOK这个地方.

    3.UnHOOK

    有了HOOK,那么自然有UnHOOK(卸载HOOK).也很简单.不一一说了.直接贴完整代码.

    
    #include "detours.h"
    #include "detver.h"
    #include <winnt.h>
    
    
    
    
    using namespace std;
    #pragma comment(lib,"Detours.lib")
    
    
    
    
    
    
    
    static HMODULE(WINAPI *PFnLoadLibraryExW)(LPCWSTR lpLibFileName, HANDLE  hFile, DWORD   dwFlags) = (HMODULE(WINAPI *)(LPCWSTR, HANDLE, DWORD))DetourFindFunction("KernelBase.dll", "LoadLibraryExW");
    
    void DetoursUnHook();
    void DetoursHook();
    
    
    
     HMODULE  WINAPI MyLoadLibraryExw(LPCWSTR lpLibFileName, HANDLE  hFile, DWORD   dwFlags)
    {
    	 
    	
    	
    	 
    	return PFnLoadLibraryExW(lpLibFileName, hFile, dwFlags);
    	
    }
    
    void DetoursHook()
    {
    	DetourRestoreAfterWith();
    	DetourTransactionBegin();           //开始
    	DetourUpdateThread(GetCurrentThread());//初始化当前线程
    	DetourAttach(&(LPVOID&)PFnLoadLibraryExW, MyLoadLibraryExw);//进行附加
    
    	DetourTransactionCommit();//进行HOOK  
    
    }
    
    void DetoursUnHook()
    {
    	DetourTransactionBegin();
    	DetourUpdateThread(GetCurrentThread());
    	DetourDetach((void **)&PFnLoadLibraryExW, MyLoadLibraryExw);//撤销拦截函数
    	DetourDetach(&(LPVOID&)PfnFreeLibrary, NewFreeLibrary);
    	DetourTransactionCommit();//
    	
    
    }
    
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
    					 )
    {
    
    	switch (ul_reason_for_call)
    	{
    	case DLL_PROCESS_ATTACH:
    		
    		
    		DisableThreadLibraryCalls(hModule);
    		DetoursHook();
    		
    		break;
    	case DLL_THREAD_ATTACH:
    		
    		break;
    	case DLL_THREAD_DETACH:
    		//DetoursUnHook();
    		break;
    	case DLL_PROCESS_DETACH:
    		//DeleteCriticalSection(&testCS);
    		//DetoursUnHook();
    		break;
    	}
    	return TRUE;
    }
    
    
    
    

    HOOK 库打包下载链接:
    链接:https://pan.baidu.com/s/1zhXqPfPhZdSWsipDuWVVQg
    提取码:tcg5

  • 相关阅读:
    Ubuntu apt-get "Hash Sum mismatch" 问题解决方法
    模型压缩相关工作
    bn两个参数的计算以及layer norm、instance norm、group norm
    cascade rcnn论文总结
    c++ 堆和栈以及区别
    c++ 浅拷贝和深拷贝 指针和引用的区别 malloc(free)和new(delete)的区别 重载重写重定义
    c++ 多态,虚函数、重载函数、模版函数
    c++问题整理
    repulsion-loss
    smooth l1
  • 原文地址:https://www.cnblogs.com/iBinary/p/10771002.html
Copyright © 2020-2023  润新知