MinHook库的使用 64位下,过滤LoadLibraryExW
MinHook库的使用 x64
一丶简介
minHook库是一个支持x64跟x86HOOK的库.Detours也支持x64.不过是收费的所以在x64下使用minHook也是一个不错的选择.
1.minHook库的下载以及安装.
MinHook 我已经打包了一份.可以在我的百度网盘中下载
链接:https://pan.baidu.com/s/1QJcf5_Q9naL2Y48IN2Y5MQ
提取码:ndmq
当然也可以在Github下载.
库源文件:
https://github.com/m417z/minhook
解压之后:

有4个文件目录
build
dll_resources
include
src
我们打开build目录

可以看到从 VC9 - VC15 这个代表VS编译器的版本号.
比如我用的是VS2013.其版本号就是VC12.我们进入文件目录

打开后缀名为.sln或者.vcxproj都可以.

打开之后如上所示.
一个libMinHook
一个MinHOOK
libMinHook是生成 lib供我们使用的.
MinHook工程是生成DLL供我们使用的.
x86编译跟x64编译
比如我们要HOOK的程序是x64程序的话.我这里选择的是生成lib库.
你需要将你的VS配置管理器改成x64.来生成libMinHook的库.
这样你的程序引用x64的lib库.就可以Hookx64程序了.
二丶使用MinHook库,过滤LoadLibraryExW
2.1编写X64测试程序.
既然我们要使用Hook.那么就编写一个X64程序.这个程序就是加载DLL
代码如下:
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
HMODULE hDll;
hDll = LoadLibraryExW(TEXT("x64Hook.dll"), NULL, 0); //加载HOOK的DLL
hDll = LoadLibraryExW(TEXT("kernel32.dll"),NULL,NULL);//判断是否被HOOK
system("pause");
return 0;
}
2.2使用MinHook库
在使用之前.我们有必要介绍一下 Minhook.h头文件中提供给我的函数声明
MH_STATUS WINAPI MH_Initialize(VOID); //初始化HOOK引擎
MH_STATUS WINAPI MH_Uninitialize(VOID); //反初始化
MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal);//创建HOOK跳板
MH_STATUS WINAPI MH_CreateHookApi( //创建APIhook跳板
LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal);
MH_STATUS WINAPI MH_CreateHookApiEx( //扩展
LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal, LPVOID *ppTarget);
MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget); //删除HOOK
MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget); //启动HOOK
MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget); //结束HOOK
MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget);
MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget);
MH_STATUS WINAPI MH_ApplyQueued(VOID);
const char * WINAPI MH_StatusToString(MH_STATUS status);
如果我们要写成HOOK总共步骤如下;
1.初始化HOOK引擎
2.创建HOOK跳板函数
3.启用HOOK
4.结束HOOK
5.删除HOOK
6.反初始化HOOK引擎
特别注意创建HOOK跳板函数.我们可以用的接口有 MB_CreateHook MB_CreateHookApi MB_CreateHookApiEx
以第一个为例: 参数1: 你要HOOK的函数的函数指针(&LoadLibraryExW) 参数2:你自定义的函数 (&MyLoadLibraryExW) 参数3:跳板函数指针
参数3的意思就是 我们的函数内部调用参数3.相当于调用原函数.
2.3完整HOOK代码
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
#include "MinHook.h"
#include <tchar.h>
#include <windows.h>
#if defined _M_X64
#pragma comment(lib, "libMinHook.x64.lib")
#elif defined _M_IX86
#pragma comment(lib, "libMinHook.x86.lib")
#endif
typedef HMODULE (WINAPI *PFNloadLibraryExw)(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); //函数的定义
PFNloadLibraryExw pfnLoadLibraryExW = NULL;
BOOL HOOK();
BOOL UnHOOK();
void __cdecl MyOutputDebugStrig(const _TCHAR* pszFormat, ...)
{
_TCHAR buf[1024] = { 0 };
// ZeroMemory( buf, 1024*sizeof(TCHAR ) );
swprintf_s(buf, 1024, _T("线程ID = [%lu]"), GetCurrentThreadId());
va_list arglist;
va_start(arglist, pszFormat);
int nBuffSize = _tcslen(buf);
vswprintf_s(&buf[nBuffSize], 1024 - nBuffSize, pszFormat, arglist);
va_end(arglist);
nBuffSize = _tcslen(buf);
_tcscat_s(buf, 1024 - nBuffSize, _T("\n"));
OutputDebugString(buf);
}
HMODULE WINAPI MyLoadLibraryExW(
LPCSTR lpLibFileName,
HANDLE hFile,
DWORD dwFlags
)
{
MyOutputDebugStrig(TEXT("已经HOOK过了 LoadLibraryExW函数"));
return pfnLoadLibraryExW(lpLibFileName,hFile,dwFlags);
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
HOOK();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
UnHOOK();
break;
}
return TRUE;
}
BOOL HOOK()
{
//初始化MinHOOK HOOK他的函数
if (MH_Initialize() != MH_OK)
{
MyOutputDebugStrig(TEXT("MH_Initialize Error"));
return FALSE;
}
// Create a hook for MessageBoxW, in disabled state.
if (MH_CreateHook(&LoadLibraryExW, &MyLoadLibraryExW, //创建HOOK
reinterpret_cast<void**>(&pfnLoadLibraryExW)) != MH_OK)
{
MyOutputDebugStrig(TEXT("MH_CreateHook Error"));
return FALSE;
}
// Enable the hook for MessageBoxW.
if (MH_EnableHook(&LoadLibraryExW) != MH_OK) //启动HOOK
{
MyOutputDebugStrig(TEXT("MH_EnableHook Error"));
return FALSE;
}
return TRUE;
}
BOOL UnHOOK()
{
// Disable the hook for MessageBoxW.
if (MH_DisableHook(&MessageBoxW) != MH_OK)
{
MyOutputDebugStrig(TEXT("MH_DisableHook Error"));
return FALSE;
}
// Expected to tell "Not hooked...".
// Uninitialize MinHook.
if (MH_Uninitialize() != MH_OK)
{
MyOutputDebugStrig(TEXT("MH_Uninitialize Error"));
return FALSE;
}
}
注意这个dll 是64的.我们要HOOK的是测试程序中的LoadLibraryExW函数.
结果:

这样说明我们的DLL已经起作用了.我们的测试程序加载我们的x64HookDLL.而我们的X64HookDLL则会进行HOOK.
代码链接:
链接:https://pan.baidu.com/s/1A-eyJ_CxvptYeerqKKHHyg
提取码:iayb
MinHook库的使用 64位下,过滤LoadLibraryExW的更多相关文章
- Ubuntu 14.04 AMD 64位 下 Android Studio 的安装
Ubuntu 14.04 AMD 64位 下 Android Studio 的安装 作者:yoyoyosiyu 邮箱:yoyoyosiyu@163.com 时间:2015年8月25日 Android ...
- win7 64位下如何安装配置mysql-5.7.4-m14-winx64
win7 64位下如何安装配置mysql-5.7.4-m14-winx641. mysql-5.7.4-m14-winx64.zip下载 官方网站下载地址:http://dev.mysql.com/g ...
- 64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 )
64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 ) [PS: 如果在64位系统下,出现调用测试demo,返回false的情况下,请修改Hook Dll的代码] glhH ...
- Linux 64位下一键安装scipy等科学计算环境
Linux 64位下一键安装scipy等科学计算环境 采用scipy.org的各种方法试过了,安装还是失败.找到了一键式安装包Anaconda,基本python要用到的库都齐了,而且还可以选择安装到其 ...
- centos 64位 下hadoop-2.7.2 下编译
centos 64位 下hadoop-2.7.2 下编译 由于机器安装的是centos 6.7 64位 系统 从hadoop中下载是32位 hadoop 依赖的的库是libhadoop.so 是3 ...
- Windows10 64位下安装TensorFlow谷歌人工智能系统已官方原生支持
Windows10 64位下安装TensorFlow谷歌人工智能系统已官方原生支持 GitHub - tensorflow/tensorflow: Computation using data flo ...
- 2 pygraphviz在windows10 64位下的安装问题(反斜杠的血案)
可以负责任的说,这篇文档是windows10安装pygraphviz中,在中文技术网站中最新的文档,没有之一.是自己完全结合各种问题,包括调试等,总结出来的. 问题来源:主要是可视化RvNN网络的树结 ...
- 64位下pwntools中dynELF函数的使用
这几天有同学问我在64位下怎么用这个函数,于是针对同一道题写了个利用dynELF的方法 编译好的程序 http://pan.baidu.com/s/1jImF95O 源码在后面 from pwn im ...
- win7(64)位下WinDbg64调试VMware10下的win7(32位)
win7(64)位下WinDbg64调试VMware10下的win7(32位) 一 Windbg32位还是64位的选择 参考文档<Windbg 32位版本和64位版本的选择> http:/ ...
随机推荐
- asp.net core web的导入导出excel功能
这里主要记录下asp.net core web页面上进行导入导出excel的操作. 主要是导入,因为现在使用的很多前端框架(例如kendo ui)本身就有导出的功能. 这里使用到EPPlus.Core ...
- java之maven之maven的使用
这里使用的工具是 myeclipse ,所以这里讲的是在 myeclipse 上使用maven. 1.什么是仓库? 用于存放依赖包.配置文件.其他插件等. 项目添加依赖时,默认从 本地仓库 读取依赖包 ...
- C# Linq 使用总结
隐式类型匿名类型自动属性初始化器委托泛型泛型委托匿名方法Lambda表达式扩展方法迭代器LINQ System.Linq var arr = new[] { "c", " ...
- Android 8.0的平台上,应用不能对大部分的广播进行静态注册
引言在Android 8.0的平台上,应用不能对大部分的广播进行静态注册,也就是说,不能在AndroidManifest文件对有些广播进行静态注册,这里必须强调是有些广播,因为有些广播还是能够注册的. ...
- java.net.URLEncoder对中文的编码和解码
// java.net.URLEncoder对中文的编码和解码String str = URLEncoder.encode("测试字符串", "utf-8"); ...
- Redux 中间件和异步操作
回顾一下Redux的数据流转,用户点击按钮发送了一个action, reducer 就根据action 和以前的state 计算出了新的state, store.subscribe 方法的回调函数中 ...
- 【Spring Boot】Spring Boot之使用Alibaba Cloud Toolkit(Idea插件)本地一键部署Spring Boot项目到远程服务器
一.Alibaba Cloud Toolkit(Idea插件)的安装 1)Alibaba Cloud Toolkit 介绍 Cloud Toolkit 是本地 IDE 插件,帮助开发者更高效地开发.测 ...
- 树莓派3b+更改静态IP
ubuntu系统修改静态IP的方法是在修改/etc/network/interfaces文件,而树莓派此文件下有说明: # interfaces() ) and ifdown() # Please n ...
- python的一些包安装
Linux下pip 的安装方法: 使用get-pip.py安装 要安装pip,请安全下载get-pip.py.1: curl https://bootstrap.pypa.io/get-pip.py ...
- 团队第四次——Alpha版本的发布
这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanalysisanddesign/ 这个作业要求在哪里 https:// ...