【翻译】使用 Windows API 行为检测键盘记录程序,保护您的设备免受信息盗窃
字数 2726 2025-08-22 22:47:31
Windows API 行为检测键盘记录程序教学文档
1. 键盘记录程序概述
键盘记录程序是一种监视和记录计算机上键入按键的软件,主要分为两类:
- 合法用途:如用户监控
- 恶意用途:窃取敏感信息(身份验证凭证、信用卡信息等)
主要风险
- 信息盗窃
- 作为进一步网络攻击的垫脚石
- 常见于RAT、信息窃取器和银行恶意软件中
2. Windows键盘记录技术分类
2.1 轮询键盘记录器
- 原理:以极短时间间隔轮询检查每个键的状态
- 关键API:
GetAsyncKeyState - 示例代码:
while(true) {
for(int key=1; key<=255; key++) {
if(GetAsyncKeyState(key) & 0x01) {
SaveTheKey(key, "log.txt");
}
}
Sleep(50);
}
2.2 基于钩子的键盘记录器
- 原理:使用Windows钩子机制插入自定义处理
- 关键API:
SetWindowsHookEx - 示例代码:
HMODULE hHookLibrary = LoadLibraryW(L"hook.dll");
FARPROC hookFunc = GetProcAddress(hHookLibrary, "SaveTheKey");
HHOOK keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)hookFunc, hHookLibrary, 0);
2.3 原始输入模型键盘记录器
- 原理:直接从键盘设备获取原始输入数据
- 关键API:
RegisterRawInputDevices和GetRawInputData - 示例代码:
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
GetAsyncKeyStateSetWindowsHookExRegisterRawInputDevice
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)
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. 实施建议
- 启用ETW监控:利用Windows事件跟踪(ETW)机制监控API调用
- 部署行为检测规则:实施上述检测规则组合
- 关注异常行为:特别关注来自未签名进程或不受信任签名者的API调用
- 多层防护:结合其他恶意行为检测(如内存操作API监控)
- 定期更新规则:保持检测规则与最新威胁同步
6. 结论
通过监控关键Windows API调用并分析其行为特征,可以有效检测和防御键盘记录程序。Elastic Defend提供了一套全面的检测机制,不依赖签名而基于行为分析,能够有效识别各种类型的键盘记录活动。