孙鑫 第二十课HOOK
来源:互联网 发布:java数据库编程 编辑:程序博客网 时间:2024/06/06 01:09
说明
20个视频终于看完了,看到最后有点不给力了,有点累了,走走停停,全套视频看了很长时间了,中间浪费了很长时间,
三天打鱼两天晒网。
现在是2011年5月27日 09:22:40,马上就六月份了,想来这个视频看了有两个多月吧,惭愧啊!
废话不说,写完孙鑫老师视频的最后一个笔记吧,关于这节课的数据库就省略了,已经过时了,就不提了。
钩子分为局部钩子和全局钩子,顾名思义,局部钩子也叫线程钩子, 只能对某一进程中的某一线程起到作用。
全局钩子可以对正在桌面上运行的所有进程中的所有线程进行监视。
全局钩子依托与DLL,安装 / 释放钩子的函数都写在DLL中,钩子消息处理函数也在DLL中。
钩子的作用就是当期望的事件发生的时候在这一事件(消息)发送到目的窗口前处理这个一消息。钩子消息处理函数都是回调函数!
简单介绍下几个函数
①安装钩子
HHOOK SetWindowsHookEx(
int idHook, //钩子种类
HOOKPROC lpfn, //钩子过程函数,每种钩子种类对应相应的钩子过程函数的格式, 格式基本类似
HINTSTANCE hMod, //钩子函数所在模块的句柄,如为局部钩子此参数为NULL,如为全局钩子则为DLL句柄(GetModuleHandle)
DWORD dwThread, //线程ID,如为局部钩子则此参数用GetCurrentThreadId取得,如为全局钩子此参数为0
);
eg.
//局部钩子, 鼠标钩子
HHOOK hMouse = SetWindowsHookEx(WH_MOUSE, MouseProc, NULL, GetCurrentThreadId());
//全局钩子,GetMessage钩子,在DLL中
HHOOK h_gMessage = SetWindowsHookEx(WH_GETMESSAGE, MessageProc, GetModuleHandle("xxx.dll"), 0);
②获得当前模块或DLL的句柄
HMODULE GetModuleHandle(
LPCTSTR lpModuleName //模块名字,null-terminated字符串,.exe或.dll格式的模块,如果没有后缀则自动认为是.dll,
//如果为NULL,则返回调用进程的句柄
);
eg.
HINSTANCE hModule = GetModuleHandle("Dlltest.dll");
返回Dlltest.dll的句柄,HINSTANCE和HMODULE可以通用
③取消钩子
BOOL UnhookWindowsHookEx(
HHOOK hhk //hook句柄, SetWindowsHookEx返回的句柄
);
eg.
UnhookWindowsHookEx(hMouse);
UnhookWindowsHookEx(h_gMessage);
实例
一个全局钩子,依托于DLL,由于是全局钩子,因此要注入每个正在桌面上运行的进程,对于每个变量,每个进程
都有各自的值,为了让各个进程共用一份变量的拷贝,用如下的方式:
#pragma data_seg("Myseg") //开始,定义新的数据段
int a = 0; //必须初始化
#pragma data_seg(); //结束
#pragma comment(linker, "/section:Myseg, RWS"); //设置该数据段的读写共享
//////////////////////////////////////////////////////////////////////////////////////////////////////////
说明 该全局钩子的作用是截获系统中的消息,并且进行处理,只是简单示例
//GetMessage.dll
#define WIN_DEF _declspec(dllexport)
#include <afxwin.h>
typedef unsigned short WORD
#pragma data_seg("Msgseg")
HWND g_hWnd = NULL; //窗口句柄,不一定用到,只是示例
#pragma data_seg()
#pragma comment(linker, "/section:Msgseg,RWS")
HHOOK g_hMessage = NULL;
FILE* pFile = NULL;
//消息函数,回调函数是由系统调用的,lParam为一指向MSG结构体的指针,wParam为PM_REMOVE或PM_NOREMOVE
LRESULT CALLBACK GetMsgProc(
int code,
WPARAM wParam,
LPARAM lParam)
{
if(code < 0)
{
return CallNextHookEx(g_hMessage, code, wParam, lParam);
}
else
{
MSG* pMsg = (MSG*)lParam;
if( (WORD)(pMsg->message) == WM_CHAR && wParam == PM_REMOVE)
{
char szChar[1] = {'\0'};
sprintf(szChar,"%c",pMsg->wParam);
fwrite(szChar, 1, sizeof(szChar), pFile);
fflush(pFile);
}//if
}//else
}//GetMssageProc
WIN_DEF BOOL _stdcall StartHook(HWND hWnd)
{
g_hWnd = hWnd;
g_hMessage = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, GetModuleHandle("GetMessage.dll"), 0);
if(NULL == g_hMessage)
{
return FALSE;
}
pFile = fopen("keyboardRecord.txt", w+);
}
WIN_DEF BOOL _stdcall StopHook()
{
fclose(pFile);
return UnhookWindowsHookEx(g_hMessage);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//在某一进程中安装钩子
/////////////////////////////////MyDlg.h//////////////////////////////////////////
#pragma comment(lib, "GetMessage.lib")
_declspec(dllimport) BOOL _stdcall StartHook(HWND hWnd);
_declspec(dllimport) BOOL _stdcall StopHook();
/////////////////////////////////MyDlg.cpp//////////////////////////////////////////
BOOL CMyDlg::OnInitDialog()
{
//codes
if( !StartHook(m_hWnd) ) //安装钩子
{
MessageBox("安装钩子失败!");
return FALSE;
}
//codes
}
CMyDlg::~CMyDlg()
{
StopHook();
}
- 孙鑫 第二十课HOOK
- 孙鑫VC学习笔记:第二十讲 Hook编程
- 孙鑫VC学习笔记:第二十讲 (一) Hook编程
- 孙鑫:第二十讲 Hook过程函数与数据库基础知识
- MFC(HOOK和数据库访问,孙鑫C++第二十讲笔记整理)
- MFC - HOOK和数据库访问 ( 孙鑫C++第二十讲笔记整理 )
- 第二十课(续)
- 第二十课 字符串库
- 第二十课 管理事务处理
- 第二十
- 韩语学习之第二十课
- 第二十一次课课后作业
- 《VC++深入详解》学习笔记 第二十章 HOOK和数据库访问
- c#错误处理机制(第二十课)
- 2013-05-11《第二十课情景对话》
- OpenGL教程翻译 第二十课 点光源
- Android第二十课;DataPicker与TimePicker
- 【第二十课】流---字节流的使用
- Java 集合类的一点总结
- 颜色16进制值
- 孙鑫 第十八课ActiveX控件
- 孙鑫 第十九课 动态链接库DLL
- Android Fragement学习笔记(三)----PreferenceFragment的使用
- 孙鑫 第二十课HOOK
- C++ vector用法
- C++vector 迭代器iterator
- C++ bitset
- C++ Primer笔记 C++ 异常处理
- C++ Primer笔记 预处理器进行调试
- C++ Primer笔记 函数指针
- Linux进程控制及守护进程
- C++ Primer笔记 数组做形参