2010-08-22 8 views
7

Loguje klucze do pola tekstowego, dzięki czemu jest bezpieczny.Problem Global Hook Keylogger

PROBLEM Problem polega na tym, że uruchomię to na maszynie wirtualnej lub mój laptop znajomych, zawiesza się po naciśnięciu pewnej ilości kluczy (losowo). Działa doskonale w moim.

http://i34.tinypic.com/29o1im8.jpg

class GlobalKeyboardHook 
{ 


    #region Definition of Structures, Constants and Delegates 

    public delegate int KeyboardHookProc(int nCode, int wParam, ref GlobalKeyboardHookStruct lParam); 

    public struct GlobalKeyboardHookStruct 
    { 
     public int vkCode; 
     public int scanCode; 
     public int flags; 
     public int time; 
     public int dwExtraInfo; 
    } 

    const int WM_KEYDOWN = 0x100; 
    const int WM_KEYUP = 0x101; 
    const int WM_SYSKEYDOWN = 0x104; 
    const int WM_SYSKEYUP = 0x105; 
    const int WH_KEYBOARD_LL = 13; 

    #endregion 

    #region Events 

    public event KeyEventHandler KeyDown; 
    public event KeyEventHandler KeyUp; 

    #endregion 

    #region Instance Variables 

    public List<Keys> HookedKeys = new List<Keys>(); 
    IntPtr hookHandle = IntPtr.Zero; 

    #endregion 

    #region DLL Imports 

    [DllImport("kernel32.dll")] 
    static extern IntPtr LoadLibrary(string lpFileName); 

    [DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall, SetLastError = true)] 
    static extern IntPtr SetWindowsHookEx(int hookID, KeyboardHookProc callback, IntPtr hInstance, uint threadID); 

    [DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall, SetLastError = true)] 
    static extern bool UnhookWindowsHookEx(IntPtr hookHandle); 

    [DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall)] 
    static extern int CallNextHookEx(IntPtr hookHandle, int nCode, int wParam, ref GlobalKeyboardHookStruct lParam); 




    #endregion 

    #region Public Methods 

    public int hookProc(int nCode, int wParam, ref GlobalKeyboardHookStruct lParam) 
    { 

     if (nCode >= 0) 
     { 
      Keys key = (Keys)lParam.vkCode; 

      if (HookedKeys.Contains(key) == true) 
      { 
       KeyEventArgs kea = new KeyEventArgs(key); 

        if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && KeyUp != null) 
        { 
         KeyUp(this, kea); 
        } 
        else if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && KeyDown != null) 
        { 
         KeyDown(this, kea); 
        } 
        if (kea.Handled) return 1; 


      } 
     } 

    return CallNextHookEx(hookHandle, nCode, wParam, ref lParam); 
    } 


    public void hook() 
    { 
      IntPtr hInstance = LoadLibrary("user32"); 
      hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, hInstance, 0); 
    } 


    public void unhook() 
    { 
     UnhookWindowsHookEx(hookHandle); 
    } 

    #endregion 

    #region Constructors and Destructors 

    public GlobalKeyboardHook() 
    { 
     hook(); 
    } 

    ~GlobalKeyboardHook() 
    { 
     unhook(); 
    } 

    #endregion 
+0

mógłbyś być trochę bardziej konkretnego? Jak, gdzie to się zawiesza, kiedy? Jakieś komunikaty o błędach? Czy mógłbyś edytować swoje pytania za pomocą minimalnego przykładu kodu, który odtwarza problem ?. I spróbuj zrobić to pytanie. –

+0

Proszę pana, wygląda na to, że nie wystąpił błąd środowiska wykonawczego. Nie mam pojęcia, która część kodu przyczynia się do powstania problemu. Spójrz na plik i link. Ma obraz błędu -> "Keylogger nie odpowiada". – RSTYLE

+0

Cóż, możesz dołączyć debugger i przerwać proces, aby sprawdzić, gdzie to jest. –

Odpowiedz

9

Spróbuj debugowania aplikacji z "CallbackOnCollectedDelegate" MDA włączony (Debug -> Wyjątki -> Zarządzane Debugowanie Asystenci -> zaznacz "CallbackOnCollectedDelegate").

Powszechnie występującym błędem jest to, że delegat do procedury haka jest automatycznie gromadzony przez GC po ustawieniu haka (jest tworzony jako część P/Invoke marszu do SetWindowsHookEx). Po zebraniu delegata przez GC program ulega awarii, gdy próbuje wywołać wywołanie zwrotne. To również tłumaczy przypadkowość.

Jeśli jest to Twój problem, zobaczysz błąd jak poniżej:

zwrotna została wykonana na śmieci zebranych delegat typu „...”. Może to spowodować awarie aplikacji, uszkodzenie i utratę danych. Przekazując delegatów do niezarządzanego kodu, muszą oni utrzymywać przy życiu przez zarządzaną aplikację , dopóki nie zostanie zagwarantowane , że nigdy nie zostaną wywołani.

Spróbuj utrzymując odniesienie do procedury haka jako członek w swojej klasie, np .:

public delegate int KeyboardHookProc(int nCode, int wParam, ref GlobalKeyboardHookStruct lParam); 

public int hookProc(int nCode, int wParam, ref GlobalKeyboardHookStruct lParam) 
{ 
    // ... 
} 

public void hook() 
{ 
    _hookProc = new KeyboardHookProc(hookProc); 
    IntPtr hInstance = LoadLibrary("user32"); 
    hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, _hookProc, hInstance, 0); 
} 

KeyboardHookProc _hookProc; 
+0

WOW. OMG Dziękuje za bardzo !! Działa idealnie. wow wow wow – RSTYLE

+0

Chcesz zaakceptować odpowiedź? Pomaga innym, którzy mają podobne problemy i zachęca innych do udziału. Dzięki :) –

+0

Alrite (za mało słów) – RSTYLE