• 自定义钩子


    // 02 自定义Hook注入器.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "..SelfHookSelfHook.h"
    #pragma comment(lib,"..\Debug\SelfHook.lib")
    int _tmain(int argc, _TCHAR* argv[])
    {
        //MessageBoxA(0, 0, 0, 0);
    
    
        InstallHook();
    
        system("pause");
    
        UnstallHook();
        return 0;
    }
    // dllmain.cpp : 定义 DLL 应用程序的入口点。
    
    
    
    
    
    #include "stdafx.h"
    #include "stdio.h"
    BYTE g_NewCode[5]; //用于存储新的二进制代码
    BYTE g_OldCode[5];  //用于存储旧的二进制代码
    
    
    
    
    void  OnHook();
    void  OffHook();
    
    
    int WINAPI  MyMessageBoxA(
                _In_opt_ HWND hWnd,
                _In_opt_ LPCSTR lpText,
                _In_opt_ LPCSTR lpCaption,
                _In_     UINT uType)
                 {
                    //截获一下MessageBox的信息
                    lpText = new char[10];
                    memset((void*)lpText, 0, 10);
                    sprintf_s((char*)lpText, 10, "hehe");
                    //关闭Hook,能够方便调用函数
                    OffHook();
                    int Result = MessageBoxA(hWnd, lpText, lpCaption, uType);
                    //再次开启Hook,能够使得下一次调用MessageBox的时候,
                    //还能够进入自己的函数
                    OnHook();
                    return Result;
                  }
    
    
    
    void  OnHook()
    {
        //将MessageBox的前5个字节修改为跳转到自己的地址
        DWORD dwOld = 0;
        VirtualProtect(MessageBoxA, 5, PAGE_EXECUTE_READWRITE, &dwOld);
        memcpy(MessageBoxA, g_NewCode, 5);
        VirtualProtect(MessageBoxA, 5, dwOld, &dwOld);
    }
    
    
    
    void  OffHook()
    {
        //将MessageBox的前五个字节还原
        DWORD dwOld = 0;
        VirtualProtect(MessageBoxA, 5, PAGE_EXECUTE_READWRITE, &dwOld);
        memcpy(MessageBoxA, g_OldCode, 5);
        VirtualProtect(MessageBoxA, 5, dwOld, &dwOld);
    }
    
    
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
                         )
    {
        switch (ul_reason_for_call)
        {
            //当DLL加载的时候把钩子加上
        case DLL_PROCESS_ATTACH:
        {
            //1 使用自己的MessageBox与User32.dll中的MessageBox的地址计算跳转的偏移
            DWORD Offect = (DWORD)MyMessageBoxA - (DWORD)MessageBoxA - 5;
    
    
            //E9 Offect
            g_NewCode[0] = 0xE9;
    
    
            //2 设置新的5个字节到一个全局数组
            memcpy(g_NewCode + 1, &Offect, 4);
    
    
            //3 保存一下原来MessageBox的前五个字节
            memcpy(g_OldCode, MessageBoxA, 5);
    
            //4 开启Hook
            OnHook();
            break;
        }
    
    
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
    
        case DLL_PROCESS_DETACH:
        {
            OffHook();
        }
            break;
        }
        return TRUE;
    }
    // SelfHook.cpp : 定义 DLL 应用程序的导出函数。
    //
    
    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include "SelfHook.h"
    
    HHOOK  g_Hook = 0;
    LRESULT CALLBACK KeyboardProc(
        int code,           // 消息类型
        WPARAM wParam,      // 虚拟码
        LPARAM lParam)
    {
        return CallNextHookEx(g_Hook, code, wParam, lParam);
    }
    //安装钩子,能够将Dll注入到所有的窗口程序
    extern "C" _declspec(dllexport)  BOOL    InstallHook()
    {
        if (g_Hook == 0)
        {
            g_Hook =
                SetWindowsHookEx(WH_GETMESSAGE,
                KeyboardProc,
                GetModuleHandleA("SelfHook.dll"),
                0);
            return TRUE;
        }
        return FALSE;
    }
    //卸载钩子,能够将Dll从所有的窗口程序卸载
    extern "C" _declspec(dllexport) BOOL UnstallHook()
    {
        if (g_Hook != 0)
        {
            UnhookWindowsHookEx(g_Hook);
            g_Hook = 0;
            return TRUE;
        }
        return FALSE;
    }
  • 相关阅读:
    十五、docker的隔离namespace和资源限制cgroup
    十四、docker-compose
    十三、搭建SSL的私有harbor仓库
    帆软常用JS
    oracle_ cursor.executemany
    sql常用语句
    考勤清洗
    JAVA基础教程day03--运算符
    B站视频爬虫
    ES6
  • 原文地址:https://www.cnblogs.com/Alyoyojie/p/5342402.html
Copyright © 2020-2023  润新知