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的更多相关文章

  1. Ubuntu 14.04 AMD 64位 下 Android Studio 的安装

    Ubuntu 14.04 AMD 64位 下 Android Studio 的安装 作者:yoyoyosiyu 邮箱:yoyoyosiyu@163.com 时间:2015年8月25日 Android ...

  2. 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 ...

  3. 64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 )

    64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 ) [PS: 如果在64位系统下,出现调用测试demo,返回false的情况下,请修改Hook Dll的代码] glhH ...

  4. Linux 64位下一键安装scipy等科学计算环境

    Linux 64位下一键安装scipy等科学计算环境 采用scipy.org的各种方法试过了,安装还是失败.找到了一键式安装包Anaconda,基本python要用到的库都齐了,而且还可以选择安装到其 ...

  5. centos 64位 下hadoop-2.7.2 下编译

    centos 64位 下hadoop-2.7.2 下编译 由于机器安装的是centos 6.7 64位 系统  从hadoop中下载是32位  hadoop 依赖的的库是libhadoop.so 是3 ...

  6. Windows10 64位下安装TensorFlow谷歌人工智能系统已官方原生支持

    Windows10 64位下安装TensorFlow谷歌人工智能系统已官方原生支持 GitHub - tensorflow/tensorflow: Computation using data flo ...

  7. 2 pygraphviz在windows10 64位下的安装问题(反斜杠的血案)

    可以负责任的说,这篇文档是windows10安装pygraphviz中,在中文技术网站中最新的文档,没有之一.是自己完全结合各种问题,包括调试等,总结出来的. 问题来源:主要是可视化RvNN网络的树结 ...

  8. 64位下pwntools中dynELF函数的使用

    这几天有同学问我在64位下怎么用这个函数,于是针对同一道题写了个利用dynELF的方法 编译好的程序 http://pan.baidu.com/s/1jImF95O 源码在后面 from pwn im ...

  9. win7(64)位下WinDbg64调试VMware10下的win7(32位)

    win7(64)位下WinDbg64调试VMware10下的win7(32位) 一 Windbg32位还是64位的选择 参考文档<Windbg 32位版本和64位版本的选择> http:/ ...

随机推荐

  1. @Valid注解的使用springmvc pojo校验

    @Valid注解用于校验,所属包为:javax.validation.Valid. ① 首先需要在实体类的相应字段上添加用于充当校验条件的注解,如:@Min,如下代码(age属于User类中的属性): ...

  2. asp.net 报错 SAP 报错 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

    “/”应用程序中的服务器错误. 试图加载格式不正确的程序. (异常来自 HRESULT:0x8007000B) 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该 ...

  3. 用python完成排序算法

    排序算法总结 冒泡排序 相邻两个元素,两两循环比较,每趟筛选出一个最大或者最小的元素(有序区在后面) def bubble_sort(data): # 第一层循环:循环一次,代表一趟,并筛选出一个最大 ...

  4. 【转载】C#通过Clone方法快速创建相同架构的DataTable

    在C#中的Datatable数据变量的操作过程中,如果需要克隆当前DataTable变量的结构,包括所有 DataTable 架构和约束等信息,可以使用DataTable中的Clone方法来实现,Cl ...

  5. Django:RestFramework之-------序列化器

    8.序列化 功能: 对请求数据进行验证 对Queryset进行序列化 8.1一个简单序列化: import json from api import models from rest_framewor ...

  6. iframe中操作主体页面的元素,方法

    在不使用三大框架的情况下,iframe的使用可以做到在页面中直接引入别的页面作为当前页面的一部分,但是在iframe的使用过程中存在一些相互之间的操作 例如在iframe中获取主页面的元素,使用主页面 ...

  7. 基于JPA的分页/排序实现

    Page<ClassOrder> findByMember_MemberID(long id, Pageable pageable); Controller代码: public Model ...

  8. 英语orientaljasper鸡血石orientaljasper单词

    鸡血石(orientaljasper),是辰砂条带的地开石,因鲜红色似鸡血的辰砂(朱砂)而得名.鸡血石含有辰砂(朱砂).石英.玉髓35%-45%.磁铁矿.赤铁矿6%-12%.辰砂约5%-8%. 鸡血石 ...

  9. jQuery(function(){})和$(function(){ }) 和 $(document).ready(function(){ })关系

    转自:https://www.jianshu.com/p/3b0fe5d07996 $(function(){ })和jQuery(function(){ })都是 $(document).ready ...

  10. js修改页面标题 title

    如果对你有帮助的话麻烦点个[推荐]~最好还可以follow一下我的GitHub~感谢观看! /* * *添加首页description元数据meta标签 *创建一个meta元素,sName为该meta ...