windows钩子,APIhook

全局监控剪贴板

 

思路,DLL全局APIhook,在应用层做的话比较简单,但是可能会有很多情况无法实现。

 

1钩子

 

---- 在Windows系统中,钩子(hook)是一种特殊的消息处理机制。勾子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的勾子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。
 
多多查看msdn
 

HHOOK SetWindowsHookEx(

    int idHook, // 类型的钩子安装 

    HOOKPROC lpfn, // 对应钩子的消息处理过程

    HINSTANCE hMod, // 全局时需要的DLL句柄
    DWORD dwThreadId  //线程ID号

); 

 
全局钩子
 
孙鑫的光盘视频教材里有,讲的很详细。
 
DLL工程 Hook.dll
 
导出函数
#include HHOOK g_hKeyboard=NULL; #pragma data_seg("MySec") #pragma data_seg() #pragma comment(linker,"/section:MySec,RWS") /*HINSTANCE g_hInst; BOOL WINAPI DllMain( HINSTANCE hinstDLL, // handle to the DLL module DWORD fdwReason, // reason for calling function LPVOID lpvReserved // reserved ) { g_hInst=hinstDLL; } */ HC_ACTION LRESULT CALLBACK KeyboardProc( int code, // hook code WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information ) { if(VK_F2==wParam) { UnhookWindowsHookEx(g_hKeyboard); } return 1; } void SetHook() { g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0); }
 
在MFC下导入该DLL,并使用SetHook函数开始屏蔽键盘信息
 
动态导入dll
__declspec(dllimport) BOOL SetHook(HWND hwnd); start { HINSTANCE hInst; hInst = LoadLibrary("KeyHooKDll.dll"); typedef int (*KeyHook)(); KeyHook SetHook=(KeyHook)GetProcAddress(hInst,"SetHook"); if(!SetHook) { MessageBox("获取函数地址失败!"); return; } else { SetHook(); } }
ApiHook
API 比全局钩子要难~~~把windows核心编程 看了好几遍,书中的代码改了又改才能够实现简单的APIhook,现在还存在很多问题。
包含的类
APIHOOK.H
APIHOOK.CPP
VS2008下编译代码如下
#pragma data_seg("shared") //全局代码段,在所有进程都可以共享 HHOOK g_HookApi; #pragma data_seg() #pragma comment(linker, "/section:shared,rws") //函数定义,APIHOOK实例 typedef HANDLE (WINAPI *OriginSetClipboardData) (UINT uFormat,HANDLE hMem); extern CAPIHook g_MySetClipboardData; CAPIHook g_MySetClipboardData("user32.dll", "SetClipboardData", (PROC) Hook_SetClipboardData, TRUE); BOOL Start() { ...... // Install the Windows' hook g_HookApi = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc,ModuleFromAddress(Start), 0); ...... } /************************************************************************/ /*根据函数名指针,获取当前模块的句柄 */ /************************************************************************/ static HMODULE ModuleFromAddress(PVOID pv) { MEMORY_BASIC_INFORMATION mbi; return((VirtualQuery(pv, &mbi, sizeof(mbi)) != 0) ? (HMODULE) mbi.AllocationBase : NULL); } // /************************************************************************/ /*API的钩子过程 */ /************************************************************************/ static LRESULT WINAPI GetMsgProc(int code, WPARAM wParam, LPARAM lParam) { // NOTE: On Windows 2000, the 1st parameter to CallNextHookEx can // be NULL. On Windows 98, it must be the hook handle. //MessageBoxA(NULL,"123","TYSTS",MB_OK); return 0;//(CallNextHookEx(g_HookApi, code, wParam, lParam)); } /************************************************************************/ /*HOOK到剪贴板时间后的响应函数 */ /************************************************************************/ HANDLE WINAPI Hook_SetClipboardData(UINT uFormat,HANDLE hMem) { //MessageBoxA(NULL,"fuck","TYSTS",MB_OK); HANDLE res = NULL; {//调用原始的API函数 res = ((OriginSetClipboardData)(PROC) g_MySetClipboardData)(uFormat,hMem); } return res; }
遇到的问题
1。在cmd下无法使用键盘钩子,MS在控制台下的按钮是中断信号,不是简单的键盘响应。而且用WH_KEYBOARD钩子时只针对GDI的程序才能执行
2。全局HOOKapi对桌面进程支持不好,经常报错。

你可能感兴趣的:(C++/C,WINDOWS安全)