吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3544|回复: 2
收起左侧

[C&C++ 转载] Windows API Inlinehook库基本使用-MHOOK

[复制链接]
bester 发表于 2021-5-20 16:26
本帖最后由 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添加到新建的项目中,如图
1.png

2.引入HOOK库的方法,在DLLHOOK项目右键--添加--现有项

3.展开文件夹,将所有红色圈圈标记的文件右键--包含在项目中
2.png

4.由于我是调试环境,所以我用MFC写了一个demo动态加载DLLHOOK动态链接库,所以我写了一个没用hello导出函数,像远程注入到其他进程的话,不需要写这个导入函数

3.png

5.demo写法

4.png



[C++] 纯文本查看 复制代码
// 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[MAX_PATH] = {0};
        memcpy_s(text, MAX_PATH, lpText, strnlen_s(lpText, MAX_PATH)); //这里是获取原API的参数内容,一般是拿来作为判断依据的

                                                                                                 //比如我们要获取到原参数的内容以后,再加一些自己的东西上去,在下面就可以直接传递Text这个变量

        char mystr[5] = "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,
                       DWORD  ul_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代码:
[C++] 纯文本查看 复制代码
        MessageBoxA(0,"原始","测试",0);
        typedef  int (*P_hello)();
        P_hello hello;
        HMODULE DllAddr = LoadLibraryA("DLLHOOK.dll");
        hello=(P_hello)GetProcAddress(DllAddr,"hello");
        hello();
        MessageBoxA(0, "原始", "测试", 0);

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
sam喵喵 + 1 + 1 谢谢@Thanks!
寒枫雨雪 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

第一品霄 发表于 2021-5-21 10:20
学习一下了
fuyunwg 发表于 2021-9-6 15:36
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 13:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表