ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Detours HOOK 库 过滤LoadLibraryExW

2020-11-11 23:04:19  阅读:348  来源: 互联网

标签:函数 HMODULE WINAPI HOOK LoadLibraryExW Detours DWORD


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 出处:https://www.cnblogs.com/iBinary/

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

详情请点击链接查看置顶博客 https://www.cnblogs.com/iBinary/p/7572603.html

标签:函数,HMODULE,WINAPI,HOOK,LoadLibraryExW,Detours,DWORD
来源: https://www.cnblogs.com/ruingking/p/13961513.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有