登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 80|回复: 2

逆向工程核心原理读书笔记 05

[复制链接]

40

主题

3

回帖

59

积分

版主

积分
59
发表于 2025-3-21 15:00:57 | 显示全部楼层 |阅读模式

第21章 Windows消息hook

将程序定义的挂钩过程安装到挂钩链中。

HHOOK SetWindowsHookExA(
  [in] int       idHook,//hook type
  [in] HOOKPROC  lpfn,//hook proc
  [in] HINSTANCE hmod,//hook proc的DLL句柄
  [in] DWORD     dwThreadId//与挂钩过程关联的线程的标识符。
);

DLL:

这里要注意nCode>=0

#include<Windows.h>
#include<stdio.h>

#define ProcessName  "notepad.exe"

HINSTANCE g_hInstance = NULL;
HHOOK g_hHook = NULL;
HWND g_hWnd = NULL;

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        g_hInstance = hModule;

    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    char szPath[MAX_PATH] = { 0 };
    char* p = NULL;
    if (nCode>=0)
    {
        // 31bit: 0:press, 1:release
        if (!(lParam & 0x80000000))
        {
            GetModuleFileNameA(NULL, szPath, MAX_PATH);
            p = strrchr(szPath, '\\')+1;
            printf("%s", p);
            if (!_stricmp(p, ProcessName))
            {
                return 1;
            }
        }

    }
    return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

extern "C" __declspec(dllexport) void hookStart()
{
    g_hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInstance, 0);
}

extern "C" __declspec(dllexport) void hookStop()
{
    UnhookWindowsHookEx(g_hHook);
    g_hHook = NULL;
}

c:

#include<Windows.h>
#include<stdio.h>
#include <conio.h>
#define DLLName "E:\\B\\RevEngBook\\Project1\\x64\\Debug\\Dll1.dll"
const char* ProcessName = "Project1.exe";
typedef void (*PFNHookStart)();
typedef void (*PFNHookStop)();

int main()
{
    HMODULE hDLL;
    PFNHookStart HookStart = NULL;
    PFNHookStop HookStop = NULL;
    hDLL = LoadLibraryA(DLLName);
    HookStart = (PFNHookStart)GetProcAddress(hDLL, "hookStart");
    HookStop = (PFNHookStop)GetProcAddress(hDLL, "hookStop");
    HookStart();
    printf("HoookStart\n");
    while (_getch() != 'q')
        ;
    HookStop();
    FreeLibrary(hDLL);
    return 0;
}

0

主题

7

回帖

14

积分

新手上路

积分
14
发表于 2025-3-21 23:47:43 | 显示全部楼层
水一水。。
回复

使用道具 举报

0

主题

10

回帖

22

积分

新手上路

积分
22
发表于 2025-3-22 06:40:07 | 显示全部楼层
来学习学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|断点社区 |网站地图

GMT+8, 2025-4-4 14:38 , Processed in 0.118730 second(s), 23 queries , Yac On.

Powered by XiunoBBS

Copyright © 2001-2025, 断点社区.

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