Windows API Inlinehook库基本使用-MHOOK
本帖最后由 bester 于 2021-6-5 09:29 编辑#### 下载MHOOK库 ####
---
下载地址:
https://github.com/ren1989419/mhook
#### 添加到VC工程 ####
---
需要的文件:<br>
1.disasm-lib (文件夹)<br>
2.mhook-lib (文件夹)
#### 必要的项目设置 ####
---
1.常规--字符集--使用Unicode字符集<br>
2.调试--命令 设置加载该动态链接库的宿主进程,需注意的是宿主进程需主动调用该动态链接库,如需远程注入调用,则无法使用VS进行调试动态链接库代码
3.设置不使用预编译头,将自己dllmain中的pch.h和framework.h删除,再设置不使用预编译头,最后再引入这个库
#### 实际应用 ####
---
1.BOOL Mhook_SetHook(PVOID *ppSystemFunction, PVOID pHookFunction);设置HOOK<br>
2.BOOL Mhook_Unhook(PVOID *ppHookedFunction);取消HOOK<br>
---
1.先新建一个DLL动态链接库项目,并将disasm-lib和mhook-lib添加到新建的项目中,如图
2.引入HOOK库的方法,在DLLHOOK项目右键--添加--现有项
3.展开文件夹,将所有红色圈圈标记的文件右键--包含在项目中
4.由于我是调试环境,所以我用MFC写了一个demo动态加载DLLHOOK动态链接库,所以我写了一个没用hello导出函数,像远程注入到其他进程的话,不需要写这个导入函数
5.demo写法
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include<windows.h>
#include"mhook.h"//加载HOOK库的头文件
static int (WINAPI *P_MyMessage)(_In_opt_ HWND hWnd, _In_opt_ LPCSTR lpText, _In_opt_ LPCSTR lpCaption, _In_ UINT uType) = MessageBoxA; //1.写法一
//typedef int (WINAPI* P_MessageBoxA)(_In_opt_ HWND hWnd,_In_opt_ LPCSTR lpText,_In_opt_ LPCSTR lpCaption,_In_ UINT uType); //2.写法二
//P_MessageBoxA P_MyMessage = (P_MessageBoxA)GetProcAddress(GetModuleHandleA("user32.dll"), "MessageBoxA"); //2.写法二
EXTERN_C __declspec(dllexport) void hello() //demo需要调用该导出函数才能加载DLL,远程注入则不需要该函数
{
int a = 5,b=0;
int c = a + b+1;
}
int WINAPI MyMessageA(_In_opt_ HWND hWnd,_In_opt_ LPCSTR lpText,_In_opt_ LPCSTR lpCaption,_In_ UINT uType) //照着MessageBoxA这个函数的参数,自定义仿照一个
{
char text = {0};
memcpy_s(text, MAX_PATH, lpText, strnlen_s(lpText, MAX_PATH)); //这里是获取原API的参数内容,一般是拿来作为判断依据的
//比如我们要获取到原参数的内容以后,再加一些自己的东西上去,在下面就可以直接传递Text这个变量
char mystr = "1234"; //我自定义了一个字符串,因为我在获取到原参数的内容以后 在后面加1234
int len = strnlen_s(lpText, MAX_PATH);
memcpy_s(text+len, MAX_PATH, mystr, 5); //我的写法很烂,俗话说会抓老鼠的就是好猫,管用即可。
return P_MyMessage(hWnd,text,"DLLHOOK",uType); //这个就是传递我们自己的参数进去,再调用MessageBoxA
//return P_MyMessage(hWnd, lpText, lpCaption, uType); //这个是直接调用原函数, 不做任何修改
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORDul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
Mhook_SetHook((PVOID*)&P_MyMessage, MyMessageA); //创建HOOK Mhook_SetHook(原始函数,自定义函数)
//Mhook_Unhook((PVOID*)&P_MyMessage); //卸载HOOK(原始函数)
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
demo代码:
MessageBoxA(0,"原始","测试",0);
typedefint (*P_hello)();
P_hello hello;
HMODULE DllAddr = LoadLibraryA("DLLHOOK.dll");
hello=(P_hello)GetProcAddress(DllAddr,"hello");
hello();
MessageBoxA(0, "原始", "测试", 0); 学习一下了
看看哪个好
看看哪个好
页:
[1]