自定义钩子
// 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; }
让数据变得更安全!