钩子要点
上次修改时间: 2007-8-3, 22:48
SetWindowsHookEX 安装一个应用程序定义的钩子过程到一个钩子链中。最后安装排在链的前面。
钩子可与某个线程相关,也可与运行同一桌面下所有线程。
安装钩子过程来监控系统的某些类型的事件。
HHOOK SetWindowsHookEx(
int idHook,
HOOKPROC lpfn,
HINSTANCE hMod,
DWORD dwThreadId
);得到当前线程的ID
DWORD GetCurrentThreadId(void);
删除通过SetWindowsHookEx安装的钩子
BOOL UnhookWindowsHookEx(
HHOOK hhk
);主要程序如下:
// 全局变量保存钩子变量和窗口变量
HHOOK g_hKeyboard = NULL;
HHOOK g_hMouse = NULL;
HWND g_wnd = NULL;
//
LRESULT CALLBACK MouceProc( int nCode,
WPARAM wParam,
LPARAM lParam
)
{
return 1; // 返回非0值将屏蔽
}
LRESULT CALLBACK KeyProc( int nCode,
WPARAM wParam,
LPARAM lParam
)
{
// if(VK_SPACE == wParam ) // || VK_RETURN == wParam )
// return 1;
// else if (VK_F4 == wParam && 1 == (lParam>>29 & 1) ) // 屏蔽组合键
// return 1;
// else
// return CallNextHookEx(g_hKeyboard,nCode,wParam,lParam);
::MessageBox(g_wnd,_T("点击F2"),_T("结束钩子"),MB_OK);
if( VK_F2==wParam)
{
// SendMessage( g_wnd, WM_CLOSE, 0, 0 );
UnhookWindowsHookEx(g_hKeyboard);
UnhookWindowsHookEx(g_hMouse);
}
return 1;
}
//
g_wnd = m_hWnd;
g_hMouse = SetWindowsHookEx(WH_MOUSE,MouceProc,NULL,GetCurrentThreadId());
g_hKeyboard = SetWindowsHookEx(WH_KEYBOARD,KeyProc,NULL,GetCurrentThreadId());
--------------------------------------
可见这是相当牛B的钩子。
如果要屏蔽所有系统的所有鼠标和键盘消息,就更牛逼了,呵呵
设置全局的钩子与所有线程相关,需要将钩子放在动态链接库中:
1。建立一个基于控制平台的动态链接库,放上个类似上面的钩子,代码如下:
// Hook.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "windows.h"
#include "tchar.h"
#ifdef _MANAGED
#pragma managed(push, off)
#endif
HWND g_hWnd = NULL;
HHOOK g_hMouse = NULL;
HHOOK g_hKeyBoard = NULL;
// BOOL APIENTRY DllMain( HMODULE hModule,
// DWORD ul_reason_for_call,
// LPVOID lpReserved
// )
// {
// return TRUE;
// }
LRESULT CALLBACK MouceProc( int nCode,
WPARAM wParam,
LPARAM lParam
)
{
return 1; // 返回非0值将屏蔽
}
LRESULT CALLBACK KeyboardProc( int nCode,
WPARAM wParam,
LPARAM lParam
)
{
if( VK_F4==wParam)
{
//SendMessage( g_wnd, WM_CLOSE, 0, 0 );
UnhookWindowsHookEx(g_hKeyBoard);
UnhookWindowsHookEx(g_hMouse);
}
return 1;// 返回非0值将屏蔽
}
void SetHook(HWND hwnd)
{
g_hWnd = hwnd;
g_hMouse = SetWindowsHookEx(WH_MOUSE,MouceProc,GetModuleHandle( _T("Hook.dll")),0);
g_hKeyBoard= SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle( _T("Hook.dll")),0);
}
#ifdef _MANAGED
#pragma managed(pop)
#endif
2.定制一个Def文件,书写导出函数:
LIBRARY "Hook"
EXPORTS
SetHook @2
SEGMENTS // 设置节属性
MySec read write share
- 建一个客户端程序:
静态加载函数,在工程设置中加入.lib文件,然后声明:
//
// 作为全局钩子动态链接库的客户端
_declspec(dllimport) void SetHook();
界面控制调用。
void CHookTestDlg::OnBnClickedButton2()
{
// TODO: Add your control notification handler code here
SetHook();
}
- 可用于锁定用户的操作,或者记录下键盘信息。这应该是最简单的黑客手法了.
通过创建新的节在不同的进程之间共享数据:
Dumpbin -headers Hook.dll
查看本dll的所有的节
#pragma data_seg(".Mysec");
// 放入一个变量,必须初始化
#pragma data_seg
为连接器提供一个选项,主要设置共享设置。
#pragma comment(linker,"/section:.Mysec,RWS");
这种方式可用于通过动态链接库共享数据
钩子要点
最新推荐文章于 2021-12-05 16:20:35 发布