SetWindowsHookEx für WH_JOURNALRECORD schlägt unter Vista / Windows 7 fehl

8

Ich bereite ein Delphi-Modul vor, das einen Haken in einem Thread setzt, um ein Makro aufzuzeichnen:

%Vor%

Das funktioniert auf WinXP gut, aber auf Vista / Windows 7 scheitert mit ERROR_ACCESS_DENIED . Ich habe in Google gefunden ( dies ) Referenzieren ( das ). Das Zitat:

  

Ein niedrigerer Privilegierungsprozess kann nicht: ... Verwenden Sie Journal-Hooks, um a zu überwachen   Prozess mit höherer Berechtigung.

Versuchte ohne Erfolg:

  1. Führen Sie die Anwendung als Administrator aus. Wahrscheinlich wird der Thread gestartet mit niedrigeren Privilegien als der Haupt-Thread (obwohl ich nicht 100% bin sicher)
  2. Identitätsübernahme des Threads mit dem Sicherheitskontext des Administrators hilft auch nicht.

Das Codebeispiel:

%Vor%

LogonUser und ImpersonateLoggedOnUser werden ohne Fehler ausgeführt.

Andere Möglichkeiten zu versuchen:

  1. Schalten Sie UAC permanent aus. Das hilft, aber ich kann das Modul nicht erzwingen Benutzer, um das zu tun.
  2. Ein Modulkunde unterzeichnet eine Anwendung und legt sie in ein vertrauenswürdiges Dokument Lage. Nicht versucht, aber das macht das Modul radikal kompliziert Nutzung für die Benutzer.
  3. Fügen Sie das Modul in eine signierte Anwendung ein und verteilen Sie EXE. Das wird einige Kernfunktionen zerstören.

Könnten Sie bitte den Code zeigen, der den Haken unter Visa / Windows 7 setzt oder die Arbeitslösung vorschlägt?

    
AlexeyDaryin 06.02.2012, 19:02
quelle

1 Antwort

8

Lesen Sie den Artikel im Abschnitt "Einschränkung der Benutzeroberflächenprivilegien" noch einmal sorgfältig. Es bezieht sich auf Integritätslevel , nicht auf Benutzerberechtigungen . Aus diesem Grund löst die Identität eines anderen Benutzers das Problem nicht. Die Integritätsstufe wird beim Start des Prozesses festgelegt und kann im Code nicht dynamisch geändert werden.

  

User Interface Privilege Isolation (UIPI) ist einer der Mechanismen   Dies hilft bei der Isolierung von Prozessen, die als vollständiger Administrator ausgeführt werden   Prozesse, die als ein Konto ausgeführt werden, das niedriger ist als ein Administrator auf dem   gleicher interaktiver Desktop UIPI ist spezifisch für die Fensterung und   Grafik-Subsystem, bekannt als USER, das Windows und Benutzer unterstützt   Schnittstellensteuerungen. UIPI verhindert eine Anwendung mit niedrigerer Berechtigung von   Verwenden von Windows-Nachrichten, um Eingaben von einem Prozess an einen höheren zu senden   Privilegierungsprozess. Das Senden von Eingaben von einem Prozess zu einem anderen ermöglicht a   Prozess, um Eingabe in einen anderen Prozess ohne den Benutzer zu injizieren   Bereitstellung von Tastatur- oder Mausaktionen.

     

Windows Vista implementiert UIPI, indem es eine Benutzerschnittstelle definiert   Privilegien Ebenen in einer hierarchischen Art und Weise. Die Art der Ebenen   ist so, dass höhere Berechtigungsstufen Fenstermeldungen an senden können   Anwendungen, die auf niedrigeren Ebenen ausgeführt werden. Niedrigere Ebenen können jedoch nicht   Fenstermeldungen an Anwendungsfenster senden, die auf höheren Ebenen ausgeführt werden.

     

Die Berechtigungsebene der Benutzerschnittstelle befindet sich auf Prozessebene. Wenn ein   Prozess wird initialisiert, das Benutzersubsystem ruft die Sicherheit auf   Subsystem zur Bestimmung der Desktop - Integritätsebene, die im   Sicherheitszugriffstoken des Prozesses. Die Desktop-Integritätsebene wird durch festgelegt   das Sicherheitssubsystem, wenn der Prozess erstellt wird und nicht   Veränderung. Daher wird die Benutzeroberflächen-Berechtigungsebene auch durch festgelegt   Das Benutzer-Subsystem, wenn der Prozess erstellt wird und sich nicht ändert.

     

Alle Anwendungen, die von einem Standardbenutzer ausgeführt werden, haben dieselbe Benutzeroberfläche   Privilegstufe. UIPI stört nicht oder ändert das Verhalten von   Window-Messaging zwischen Anwendungen auf derselben Berechtigungsstufe.    UIPI tritt für einen Benutzer in Kraft, der Mitglied der   Administratorgruppe und führt möglicherweise Anwendungen als Standard aus   Benutzer (manchmal als Prozess mit einem gefilterten Zugriffstoken bezeichnet)   und Prozesse, die mit einem vollständigen Administratorzugriffstoken ausgeführt werden   derselbe Desktop. UIPI verhindert Prozesse mit niedrigeren Rechten   Zugriff auf Prozesse mit höherer Berechtigung durch Blockieren des aufgelisteten Verhaltens   unten.

     
  • Verwenden Sie Journal-Hooks, um einen Prozess mit höheren Berechtigungen zu überwachen.
  •   

Laut diesem Artikel benötigt Ihre App ein UAC-Manifest, das requestedExecutionLevel=requireAdministrator angibt. und uiAccess=True . Das UIAccess-Recht ist wichtig:

  

Durch Angabe von UIAccess="true" im Attribut requestedPrivileges   Die Anwendung fordert die Umgehung von UIPI-Einschränkungen   ...   Ein Prozess, der mit UIAccess-Rechten gestartet wird:

     
  • Kann Journal-Hooks setzen.
  •   
    
Remy Lebeau 07.02.2012, 02:21
quelle