zoukankan      html  css  js  c++  java
  • 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

    作者:IBinary


    坚持两字,简单,轻便,但是真正的执行起来确实需要很长很长时间.当你把坚持两字当做你要走的路,那么你总会成功. 想学习,有问题请加群.群号:725864912(收费)群名称: 逆向学习小分队 群里有大量学习资源. 以及定期直播答疑.有一个良好的学习氛围. 涉及到外挂反外挂病毒 司法取证加解密 驱动过保护 VT 等技术,期待你的进入。

    详情请点击链接查看置顶博客 https://www.cnblogs.com/iBinary/p/7572603.html
  • 相关阅读:
    Codeforces Round #649 (Div. 2) D. Ehab's Last Corollary
    Educational Codeforces Round 89 (Rated for Div. 2) E. Two Arrays
    Educational Codeforces Round 89 (Rated for Div. 2) D. Two Divisors
    Codeforces Round #647 (Div. 2) E. Johnny and Grandmaster
    Codeforces Round #647 (Div. 2) F. Johnny and Megan's Necklace
    Codeforces Round #648 (Div. 2) G. Secure Password
    Codeforces Round #646 (Div. 2) F. Rotating Substrings
    C++STL常见用法
    各类学习慕课(不定期更新
    高阶等差数列
  • 原文地址:https://www.cnblogs.com/ruingking/p/13961513.html
Copyright © 2011-2022 走看看