2016-05-05 15 views
0

Ich versuchte zu überprüfen, dass Nachrichten mit Spy ++ (unter Windows 7) an mein Fenster gesendet wurden, aber ich versuchte versehentlich ein Konsolenfenster auszuspionieren, das mein Programm für die Debugausgabe verwendete. Spion ++ hat mich sofort benachrichtigt, dass "das angegebene Fenster nicht ausspioniert werden kann. Windows erlaubt keinen Zugriff auf den Nachrichtenstrom für dieses Fenster."Warum Spy ++ mit Konsolenfenstern fehlschlägt

Während Spy ++ andere Informationen über das Fenster korrekt sammelt (e.x. Name, Stil, Klassenname), kann es die Nachrichtenwarteschlange nicht verarbeiten. Warum ist das? Und gibt es aus morbider Neugier eine Möglichkeit, zu verhindern, dass Spy ++ mit der Windows API auf die Nachrichtenwarteschlange meines eigenen benutzerdefinierten Fensters zugreift?

Antwort

4

Während Spy ++ andere Informationen über das Fenster korrekt sammelt (e.x. Name, Stil, Klassenname), kann es die Nachrichtenwarteschlange nicht verarbeiten. Warum ist das?

Das Konsolenfenster gehört zum Prozess CSRSS, nicht zum Prozess CMD.EXE. CSRSS ist ein kritischer Systemdienst, der geschützt ist und nicht ohne spezielle Debug-Berechtigungen angehängt werden kann.

"Wenn ein Benutzer-Modus-Prozess, Prozess-/Thread-Erzeugung oder Seite-an-Seite-Unterstützung, eine Funktion beteiligt Konsolenfenster fordert stattdessen einen Systemaufruf auszugeben, die Win32-Bibliotheken (kernel32.dll, user32.dll, gdi32.dll) einen inter-Prozess-Aufruf an den CSRSS Prozess senden, ohne die Kernel der meisten der eigentlichen Arbeit tut. "

Und aus morbider Neugier, ist es eine Möglichkeit, um zu verhindern, dass Spy ++ über die Windows-API auf die Nachrichtenwarteschlange meines eigenen benutzerdefinierten Fensters zugreift?

In der Regel keine. Es sei denn, Sie verwalten Ihr Fenster in einem geschützten Systemprozess.

+0

Sie haben meine Neugier geweckt. Nachdem ich mehr darüber auf Wikipedia gelesen habe, entdeckte ich den sekundären Mechanismus, conhost.exe (erstellt von CSRSS unter dem aktuellen Benutzerkonto) wird verwendet, um das Konsolenfenster anzuzeigen. Scheint so, als wäre ein unter dem Benutzerkonto laufender Vorgang faires Spiel zu Spy ++, aber wiederum wird das Desktop-Fenster auch nicht ausspioniert. Ist es die Methode, in der CreateProcess aufgerufen wird, die verhindert, dass Spy ++ funktioniert? –

+0

@BrianDavis: Das Desktop-Fenster wird nicht speziell behandelt, und Spy ++ kann zur Überwachung von Nachrichten verwendet werden. Verwenden Sie möglicherweise Spy ++ mit der falschen Bitanzahl (z. B. 32-Bit-Spy ++ auf einem 64-Bit-Betriebssystem)? – IInspectable

0

Also, ich entdeckte dies selbst vor kurzem, ich erstellte eine Konsole .NET-Anwendung, die einen Prozess mit CMD.EXE startet und ich lief auf ein Problem mit einigen Win32-Interop rund um die Tastatur. Also habe ich das vorher vertraute Spy ++ - Hilfsprogramm ausgebrütet, um zu sehen, was passiert, dass ich die Nachrichtenwarteschlange für meine Anwendung nicht vollständig überwachen konnte.

So laut der Frage des op:

„? Gibt es eine Möglichkeit Spy zu verhindern ++ aus der Nachrichtenwarteschlange meiner eigenen benutzerdefinierten Fenster Zugriff auf den Windows-API unter Verwendung von

Es gibt eine Liste von beschränkt Fenster Klassen in Spy gebacken ++:

  • SpyxxHk (vermutlich seine eigene Haken Klasse),
  • # 32768 (Kontextmenü),
  • # 32769 (der Desktop),
  • ttyGrab,
  • ConsoleWindowClass (Eingabeaufforderung)

Also, wenn Sie in irgendeiner Weise Spy Ihre App zu diesen Klassen binden ++ wird diese Block-Nachricht angezeigt werden, wenn sie versuchen, Beobachten Sie ihre Nachrichten, natürlich kann dies nicht nützlich sein, da es nur diese Klassen beschränkt.

Mit Bezug auf MS-Dokumentation.

https://msdn.microsoft.com/en-us/library/windows/desktop/dd373640(v=vs.85).aspx

„out-of-context Ereignisse, wird das Ereignis auf dem gleichen Thread geliefert, die SetWinEventHook genannt In einigen Situationen, auch wenn Sie WINEVENT_INCONTEXT Ereignisse anfordern, Diese Szenarien umfassen Ereignisse von Konsolenfenstern und Ereignisse von Prozessen mit unterschiedlicher Bittiefe (64 Bit im Vergleich zu 32 Bit) "

Schlägt vor, dass es möglich ist, zu erhalten Konsole w Indow Ereignisse.