【翻译】使用 Windows API 行为检测键盘记录程序,保护您的设备免受信息盗窃
字数 2726 2025-08-22 22:47:31

Windows API 行为检测键盘记录程序教学文档

1. 键盘记录程序概述

键盘记录程序是一种监视和记录计算机上键入按键的软件,主要分为两类:

  • 合法用途:如用户监控
  • 恶意用途:窃取敏感信息(身份验证凭证、信用卡信息等)

主要风险

  • 信息盗窃
  • 作为进一步网络攻击的垫脚石
  • 常见于RAT、信息窃取器和银行恶意软件中

2. Windows键盘记录技术分类

2.1 轮询键盘记录器

  • 原理:以极短时间间隔轮询检查每个键的状态
  • 关键APIGetAsyncKeyState
  • 示例代码
while(true) {
    for(int key=1; key<=255; key++) {
        if(GetAsyncKeyState(key) & 0x01) {
            SaveTheKey(key, "log.txt");
        }
    }
    Sleep(50);
}

2.2 基于钩子的键盘记录器

  • 原理:使用Windows钩子机制插入自定义处理
  • 关键APISetWindowsHookEx
  • 示例代码
HMODULE hHookLibrary = LoadLibraryW(L"hook.dll");
FARPROC hookFunc = GetProcAddress(hHookLibrary, "SaveTheKey");
HHOOK keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)hookFunc, hHookLibrary, 0);

2.3 原始输入模型键盘记录器

  • 原理:直接从键盘设备获取原始输入数据
  • 关键APIRegisterRawInputDevicesGetRawInputData
  • 示例代码
RAWINPUTDEVICE rid;
rid.usUsagePage = 0x01;  // HID_USAGE_PAGE_GENERIC
rid.usUsage = 0x06;     // HID_USAGE_GENERIC_KEYBOARD
rid.dwFlags = RIDEV_NOLEGACY | RIDEV_INPUTSINK;
rid.hwndTarget = hWnd;
RegisterRawInputDevices(&rid, 1, sizeof(rid));

2.4 DirectInput键盘记录器

  • 原理:滥用DirectX功能获取键盘输入
  • 关键API:DirectInput相关API
  • 示例代码
LPDIRECTINPUT8 lpDI = NULL;
LPDIRECTINPUTDEVICE8 lpKeyboard = NULL;
BYTE key[256];
DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (LPVOID*)&lpDI, NULL);
lpDI->CreateDevice(GUID_SysKeyboard, &lpKeyboard, NULL);
lpKeyboard->SetDataFormat(&c_dfDIKeyboard);
lpKeyboard->SetCooperativeLevel(hwndMain, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE | DISCL_NOWINKEY);

3. 检测方法与规则

3.1 监控的Windows API

  • GetAsyncKeyState
  • SetWindowsHookEx
  • RegisterRawInputDevice

3.2 Elastic Defend检测规则

  1. GetAsyncKeyState API Call from Suspicious Process
  2. GetAsyncKeyState API Call from Unusual Process
  3. Keystroke Input Capture via DirectInput
  4. Keystroke Input Capture via RegisterRawInputDevices
  5. Keystroke Messages Hooking via SetWindowsHookEx
  6. Keystrokes Input Capture from a Managed Application
  7. Keystrokes Input Capture from a Suspicious Module
  8. Keystrokes Input Capture from Suspicious CallStack
  9. Keystrokes Input Capture from Unsigned DLL
  10. Keystrokes Input Capture via SetWindowsHookEx

3.3 示例检测规则(RegisterRawInputDevices)

api where 
    process.Ext.api.name == "RegisterRawInputDevices" 
    and not process.code_signature.status : "trusted" 
    and process.Ext.api.parameters.usage : ("HID_USAGE_GENERIC_KEYBOARD", "KEYBOARD") 
    and process.Ext.api.parameters.flags : "*INPUTSINK*" 
    and process.thread.Ext.call_stack_summary : "?*" 
    and process.thread.Ext.call_stack_final_user_module.hash.sha256 != null 
    and process.executable != null 
    and not process.thread.Ext.call_stack_final_user_module.path : (
        "*\\program files*", 
        "*\\windows\\system32\\*", 
        "*\\windows\\syswow64\\*", 
        "*\\windows\\systemapps\\*", 
        "*\\users\\*\\appdata\\local\\*\\kumospace.exe", 
        "*\\users\\*\\appdata\\local\\microsoft\\teams\\current\\teams.exe"
    ) 
    and not process.executable : (
        "?:\\Program Files\\*.exe", 
        "?:\\Program Files (x86)\\*.exe"
    )

4. 收集的数据字段

API 名称 字段 描述
GetAsyncKeyState process.Ext.api.metadata.ms_since_last_keyevent 最后一次GetAsyncKeyState事件之间经过的时间(毫秒)
GetAsyncKeyState process.Ext.api.metadata.background_callcount 最后一次成功调用间的所有GetAsyncKeyState调用数量
SetWindowsHookEx process.Ext.api.parameters.hook_type 要安装的hook子程类型
SetWindowsHookEx process.Ext.api.parameters.hook_module 包含hook子程的DLL
SetWindowsHookEx process.Ext.api.parameters.procedure 过程或函数的内存地址
SetWindowsHookEx process.Ext.api.metadata.procedure_symbol hook子程的摘要
RegisterRawInputDevices process.Ext.api.metadata.return_value API调用的返回值
RegisterRawInputDevices process.Ext.api.parameters.usage_page 设备的顶层采集(使用页面)
RegisterRawInputDevices process.Ext.api.parameters.usage "使用情况"页面中的具体设备
RegisterRawInputDevices process.Ext.api.parameters.flags 模式标志
RegisterRawInputDevices process.Ext.api.metadata.windows_count 调用者线程拥有的窗口数
RegisterRawInputDevices process.Ext.api.metadata.visible_windows_count 调用线程拥有的可见窗口数
RegisterRawInputDevices process.Ext.api.metadata.thread_info_flags 线程信息标志
RegisterRawInputDevices process.Ext.api.metadata.start_address_module 线程起始地址关联的模块名
RegisterRawInputDevices process.Ext.api.metadata.start_address_allocation_protection 线程起始地址关联的内存保护属性

5. 实施建议

  1. 启用ETW监控:利用Windows事件跟踪(ETW)机制监控API调用
  2. 部署行为检测规则:实施上述检测规则组合
  3. 关注异常行为:特别关注来自未签名进程或不受信任签名者的API调用
  4. 多层防护:结合其他恶意行为检测(如内存操作API监控)
  5. 定期更新规则:保持检测规则与最新威胁同步

6. 结论

通过监控关键Windows API调用并分析其行为特征,可以有效检测和防御键盘记录程序。Elastic Defend提供了一套全面的检测机制,不依赖签名而基于行为分析,能够有效识别各种类型的键盘记录活动。

Windows API 行为检测键盘记录程序教学文档 1. 键盘记录程序概述 键盘记录程序是一种监视和记录计算机上键入按键的软件,主要分为两类: 合法用途:如用户监控 恶意用途:窃取敏感信息(身份验证凭证、信用卡信息等) 主要风险 信息盗窃 作为进一步网络攻击的垫脚石 常见于RAT、信息窃取器和银行恶意软件中 2. Windows键盘记录技术分类 2.1 轮询键盘记录器 原理 :以极短时间间隔轮询检查每个键的状态 关键API : GetAsyncKeyState 示例代码 : 2.2 基于钩子的键盘记录器 原理 :使用Windows钩子机制插入自定义处理 关键API : SetWindowsHookEx 示例代码 : 2.3 原始输入模型键盘记录器 原理 :直接从键盘设备获取原始输入数据 关键API : RegisterRawInputDevices 和 GetRawInputData 示例代码 : 2.4 DirectInput键盘记录器 原理 :滥用DirectX功能获取键盘输入 关键API :DirectInput相关API 示例代码 : 3. 检测方法与规则 3.1 监控的Windows API GetAsyncKeyState SetWindowsHookEx RegisterRawInputDevice 3.2 Elastic Defend检测规则 GetAsyncKeyState API Call from Suspicious Process GetAsyncKeyState API Call from Unusual Process Keystroke Input Capture via DirectInput Keystroke Input Capture via RegisterRawInputDevices Keystroke Messages Hooking via SetWindowsHookEx Keystrokes Input Capture from a Managed Application Keystrokes Input Capture from a Suspicious Module Keystrokes Input Capture from Suspicious CallStack Keystrokes Input Capture from Unsigned DLL Keystrokes Input Capture via SetWindowsHookEx 3.3 示例检测规则(RegisterRawInputDevices) 4. 收集的数据字段 | API 名称 | 字段 | 描述 | |---------|------|------| | GetAsyncKeyState | process.Ext.api.metadata.ms_ since_ last_ keyevent | 最后一次GetAsyncKeyState事件之间经过的时间(毫秒) | | GetAsyncKeyState | process.Ext.api.metadata.background_ callcount | 最后一次成功调用间的所有GetAsyncKeyState调用数量 | | SetWindowsHookEx | process.Ext.api.parameters.hook_ type | 要安装的hook子程类型 | | SetWindowsHookEx | process.Ext.api.parameters.hook_ module | 包含hook子程的DLL | | SetWindowsHookEx | process.Ext.api.parameters.procedure | 过程或函数的内存地址 | | SetWindowsHookEx | process.Ext.api.metadata.procedure_ symbol | hook子程的摘要 | | RegisterRawInputDevices | process.Ext.api.metadata.return_ value | API调用的返回值 | | RegisterRawInputDevices | process.Ext.api.parameters.usage_ page | 设备的顶层采集(使用页面) | | RegisterRawInputDevices | process.Ext.api.parameters.usage | "使用情况"页面中的具体设备 | | RegisterRawInputDevices | process.Ext.api.parameters.flags | 模式标志 | | RegisterRawInputDevices | process.Ext.api.metadata.windows_ count | 调用者线程拥有的窗口数 | | RegisterRawInputDevices | process.Ext.api.metadata.visible_ windows_ count | 调用线程拥有的可见窗口数 | | RegisterRawInputDevices | process.Ext.api.metadata.thread_ info_ flags | 线程信息标志 | | RegisterRawInputDevices | process.Ext.api.metadata.start_ address_ module | 线程起始地址关联的模块名 | | RegisterRawInputDevices | process.Ext.api.metadata.start_ address_ allocation_ protection | 线程起始地址关联的内存保护属性 | 5. 实施建议 启用ETW监控 :利用Windows事件跟踪(ETW)机制监控API调用 部署行为检测规则 :实施上述检测规则组合 关注异常行为 :特别关注来自未签名进程或不受信任签名者的API调用 多层防护 :结合其他恶意行为检测(如内存操作API监控) 定期更新规则 :保持检测规则与最新威胁同步 6. 结论 通过监控关键Windows API调用并分析其行为特征,可以有效检测和防御键盘记录程序。Elastic Defend提供了一套全面的检测机制,不依赖签名而基于行为分析,能够有效识别各种类型的键盘记录活动。