2016-05-16 9 views
1

Es gibt eine Tastatur Haken wie folgt installiert:Absturz nach von Windows-Tastatur Hookprozedur Rückkehr

s_hKeyboardHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyboardHookProc, nullptr, ::GetCurrentThreadId()); 

(Dies ist ein Plug-in, will Tastaturereignisse abfangen, die auf seinen Host (64-Bit gesendete), obwohl der Host keine Tastaturereignisse zu seinen Plugins auf die normale Weise bereitstellt. Ich habe nicht den Quellcode des Hosts, obwohl ich den Quellcode des Plugins habe.)

Nach dem Tastatur-Hook-Prozedur läuft erfolgreich und kehrt zurück, das Programm stürzt ab. Der Absturz findet innerhalb von Windows 'ZwCallbackReturn() statt und führt die syscall Anweisung aus. Die Ausnahme ist 0XC0000005 (Zugriffsverletzung). Der Absturz tritt nur auf, wenn eine bestimmte Taste gedrückt wird, die eine bestimmte Logik auslöst.

This is how it looks like in the debugger (animated gif)

ich diesen Absturz stecken Diagnose und wirklich etwas Hilfe gebrauchen könnte. Ich bin mir sicher, dass das Problem in diesem großen Teil des Codes liegt, der in der Hook-Prozedur enthalten ist. Worauf ich Probleme habe, ist zu verstehen, wo der Absturz stattfindet und wo der Haltepunkt im Grunde genommen platziert werden muss, um ihn vorzutäuschen.


Zusätzliche Informationen:

1) Die Hook-Prozedur ist wirklich sehr schwer, mit viel zu blockieren, I/O und Speichernutzung (es in ein paar Sekunden auf einer schnellen Maschine abgeschlossen) . Vielleicht ist das ein Teil des Problems.

2) Wird als 32-Bit kompiliert wird, sieht der Stapel direkt nach dem Absturz interessanter, aber ich bezweifle es vertrauen kann:

2a71f510() Unknown 
[email protected]() Unknown 
[email protected]() Unknown 
[email protected]() Unknown 
[email protected]() Unknown 
2a10f24a() Unknown 
[email protected]() Unknown 
[email protected]() Unknown 
[email protected]() Unknown 
[email protected]() Unknown 
[email protected]() Unknown 
AfxInternalPumpMessage() Line 153 C++ 
AfxWinMain(0x00000000, 0x00000020, 0x00000001, 1638280) Line 47 C++ 
@[email protected]() Unknown 

, wo die Top-5-Linien viele Male wiederholt werden.


Hier ist, was ich bisher versucht habe. Es ist mein Verständnis, dass der syscall Befehl selbst die Ausnahme nicht erzeugt: die Register sehen vernünftig aus, und ich denke, der Stapel würde gleich bleiben, wenn er abgestürzt wäre. Also denke ich, dass nachdem dieser Befehl den Übergang zurück in den Kernel-Modus initiiert hat, woher der "Benutzer-Callback" (der Hook-Prozedur-Aufruf) stammt, läuft der Kernel weiter gut. Irgendwann sollte es die Kontrolle wieder an userland zurückgeben - GetMessage() ich vermute). Dann, denke ich, wird der Stapel beschädigt und das Programm stürzt ab. Aber leider kann ich meinen Visual C++ - Debugger nicht anweisen, bei der ersten Benutzermodus-Anweisung zu brechen, bevor der Stapel beschädigt wird. Ich habe versucht, Conditional Breakpoints in TranslateMessage() und DispatchMessage() zu installieren, die höchstwahrscheinlich direkt nach GetMessage() ausgeführt werden, aber sie feuern zwischen der letzten guten Benutzermodusanweisung und dem Absturz nicht.

+0

'Der Absturz passiert nur, wenn eine bestimmte Taste gedrückt wird, die eine bestimmte Logik auslöst." - Dies ist ein bisschen vage, um das Problem zu erkennen. –

+0

Wenn Sie die gesamte Logik aus Ihrem Haken entfernen und einfach sofort zurückkehren, stürzt es immer noch ab? Wenn nicht, wissen Sie, wo Sie suchen müssen. –

+0

Wird das Plugin im selben Prozess wie der Host ausgeführt? Wenn ja, nehme ich an, dass das Plugin eine DLL ist, die explizit geladen wird. Ist es möglich, dass die Plugin-DLL entladen wird, vielleicht als Reaktion auf den Tastendruck? –

Antwort

1

Der Absturz ist passiert, weil das Tastatur-Hook-Verfahren NICHT der erste in der Hakenkette war. Es wurde von einem vorherigen Haken in der Hakenkette über CallNextHookEx() aufgerufen. Und dieser vorherige Hook wurde von einer DLL registriert, die in "unserem" Tastatur-Hook entladen wurde.

Nachdem alle Haken schließlich aufgerufen wurden, kehrte die Steuerung zu der ersten Hook-Prozedur zurück, die nicht mehr existierte. Und der Absturz versuchte eine ungültige Adresse auszuführen.

Verwandte Themen