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

Detours HOOK 库 过滤LoadLibraryExW的更多相关文章

  1. MinHook库的使用 64位下,过滤LoadLibraryExW

    目录 一丶简介 1.minHook库的下载以及安装. 二丶使用MinHook库,过滤LoadLibraryExW 2.1编写X64测试程序. 2.2使用MinHook库 2.3完整HOOK代码 Min ...

  2. API HOOK库

    API HOOK库 API HOOK有两种做法,一种是SetWindowHookEx,简单易用,但如果做其它的HOOK,如HOOK OpenProcess,就需要修改内存地址了,内存地址可以通过Wri ...

  3. 我的API HOOK库

    API HOOK有两种做法,一种是SetWindowHookEx,简单易用,但如果做其它的HOOK,如HOOK OpenProcess,就需要修改内存地址了,内存地址可以通过WriteProcessM ...

  4. 【译】值得推荐的十大React Hook 库

    十大React Hook库 原文地址:https://dev.to/bornfightcompany/top-10-react-hook-libraries-4065 原文作者:Juraj Pavlo ...

  5. php扩展trie_filter: 利用词库, 过滤敏感词

    1. 先安装libiconv# wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz# tar -zxvf libiconv- ...

  6. share point 查询文档库 过滤 文档名称和上传时间

    SPQuery query = new SPQuery(); CAMLBuilder.WhereBuilder whereBuilder = null; pageCount = ; if (!stri ...

  7. Inline Hook 钩子编写技巧

    Hook 技术通常被称为钩子技术,Hook技术是Windows系统用于替代中断机制的具体实现,钩子的含义就是在程序还没有调用系统函数之前,钩子捕获调用消息并获得控制权,在执行系统调用之前执行自身程序, ...

  8. easyhook源码分析一

    easyhook简要说明: easyhook是一个开源的hook库(http://easyhook.github.io/),其支持托管代码(.NET)和非托管代码(C/C++)hook,这里只分析了其 ...

  9. Microsoft Detours 2.1简介

    http://blog.163.com/qcb_163/blog/static/9545466420117851038971/ Microsoft Detours 2.1简介 2011-08-0817 ...

随机推荐

  1. 在MySQL和PostgreSQL之外,为什么阿里要研发HybridDB数据库?

    http://www.infoq.com/cn/news/2016/12/MySQL-PostgreSQL-Greenplum 编者按 在大数据火遍IT界之前,大家对数据信息的挖掘通常聚焦在BI(Bu ...

  2. Golang 交叉编译 window/linux 文件

    gox - 一款简单的交叉编译工具 下载地址:https://github.com/mitchellh/gox 使用 go get 命令安装: go get github.com/mitchellh/ ...

  3. 使用xshell链接虚拟机的方法

    给大家介绍一下虚拟机和Xshell5连接的基本配置1.安装虚拟机,跟着提示一步一步安装即可,注意添加镜像文件,虚拟机就完成了.2.下载一个Xshell5,安装好之后.要修改虚拟机的网卡状态    1) ...

  4. CentOS的启动流程

    因6和7俩个系列的启动流程有区别,所以我把他们分开来写 linux可看作是内核和根文件系统组成我们把内核单独拿出来总结一下 CentOS6系列启动流程 首先总结一下总体的流程,接下来展开来叙述:POS ...

  5. 创建servlet的三种方式

    第一种方式,实现Servlet接口 package com.example.servlet; import java.io.IOException; import javax.servlet.Serv ...

  6. selenium+python自动化测试

    F12: 右键   选择复制  path 在selenium+python自动化测试(一)–环境搭建中,运行了一个测试脚本,脚本内容如下: from selenium import webdriver ...

  7. C语言检查ip是否合法

    在工作当中我们经常会遇到这种问题:判断一个输入的字符串是否为合法的IP地址,下面是一个测试小程序: #include <stdio.h> #include <string.h> ...

  8. 区分命令行模式和Python交互模式

    命令行模式 在Windows开始菜单选择"命令提示符",就进入到命令行模式,它的提示符类似C:\> Python交互模式 在命令行模式下敲命令python,就看到类似如下的一 ...

  9. 关于ArrayList的5道面试题

    我以面试官的身份参加过很多Java的面试,以下是五个比较有技巧的问题,我发现有些初级到中级的Java研发人员在这些问题上没有完全弄明白,似懂非懂.所以我写了一篇相关的文章,帮助初级Java研发人员弄清 ...

  10. springMVC框架在js中使用window.location.href请求url时IE不兼容问题解决

    是使用springMVC框架时,有时候需要在js中使用window.location.href来请求url,比如下面的路径: window.location.href = 'forecast/down ...