自定义钩子

// 02 自定义Hook注入器.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "..\SelfHook\SelfHook.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;
}

 

posted @ 2016-03-31 19:16  天还是那么蓝  阅读(292)  评论(0编辑  收藏  举报