首页 > 代码库 > HOOK技术演示

HOOK技术演示

一、首先创建一个dll工程,取名为KeyboardHookDll,代码如下:

// KeyboardHookDll.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

#define MYAPI extern "C" _declspec(dllexport)  //导出函数声明

HHOOK hHook = NULL;

LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)

{

if (code >= 0)

return 1;                              //消息不再传递个下一个HOOK子程,也不会再发送给目的窗口

else

return CallNextHookEx(hHook, HC_ACTION, wParam, lParam);

}

MYAPI int SetHook()

{

hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, GetModuleHandleA("KeyboardHookDll.dll"), 0);

if (hHook == NULL)

{

printf("SetWindowsHookEx() error :%d\n", GetLastError());

return -1;

}

return 0;

}

MYAPI int StopHook()

{

if (UnhookWindowsHookEx(hHook) == FALSE)

{

printf("UnhookWindowsHookEx() error :%d\n");

return -1;

}

return 0;

}
二、新建一个控制台程序,用来启用HOOK,代码如下:


#include "stdafx.h"
#include "windows.h"
#include <iostream>

#pragma comment(lib,"KeyboardHookDll.lib")

using namespace std;



extern "C" _declspec(dllimport) void SetHook();
extern "C" _declspec(dllimport) void StopHook();

int _tmain(int argc, _TCHAR* argv[])

{

    char YesNo;

printf("这是一个关于全局键盘钩子的测试...\n");

printf("安装全局键盘钩子...\n");

SetHook();

printf("是否卸载键盘钩子: (Y or N)\n"); //当然了,下面的语句根本无法执行

YesNo = getchar();

if (YesNo == ‘Y‘ || YesNo == ‘y‘)

{

printf("开始卸载钩子...\n\n");

StopHook();

printf("钩子已经卸载...\n");

}
    

    system("pause");

    return 0;

}