2010-12-14 7 views
2

Ich habe ein Problem in Delphi-Anwendung mit der aktuellen Anwendung (aktuellen Thread) Griff. Ich weiß, dass ich aktuelle Thread-ID mit Windows-API-Funktion GetCurrentThreadID abrufen kann, aber ich brauche aktuelle Thread-Kennung als Parameter für eine andere Windows-API-Funktion, die SuspendThread ist.Get Current Thread Handle

Eigentlich, was ich versuche zu tun, einen meiner alten DLL zum Einhaken API-Funktionen befindet sich in kernel32.dll wie OpenProcess oder TerminateProcess auch gemacht machen, um für SuspendProcess tun Haken. Hook befindet sich in der DLL-Datei und wird mit SetWindowsHookEx in laufende Prozesse eingefügt, um dann die Basisadresse der Zielfunktionen zu finden. Ich hatte kein Problem mit Hooking-Funktionen wie TerminateProcess, weil es Prozess-ID als Parameter benötigt, die in der Hauptanwendung mit GetCurrentProcessID leicht zu erhalten ist. Um einen ähnlichen Haken für SuspendThread Funktion zu machen, muss ich Threadhandle als param übergeben.

einziger Ort, wo ich gefunden Thread-Handle ist PROCESS_INFORMATION Struktur, die

typedef struct _PROCESS_INFORMATION { // pi 
    HANDLE hProcess; 
    HANDLE hThread; 
    DWORD dwProcessId; 
    DWORD dwThreadId; 
} PROCESS_INFORMATION; 

enthält aber Problem ist, dass diese Struktur nur nach dem Prozess mit CreateProcess API-Funktion zu schaffen zur Verfügung steht. Das Hauptziel besteht darin, zu verhindern, dass Programmbenutzer verschiedene online verfügbare Tools wie ProcessExplorer usw. verwenden, um den Prozess zu beenden. Ich habe erreicht, dass mit Erfolg TerminateProcess API-Aufrufe einhängen und verhindern, dass auf diese Weise meine App zu schließen, aber die Option "Suspend" in diesen Tools zur Prozesssuche kann meinen Prozess anhalten. Es ist eine Internet-Kiosk-Anwendung und es ist wichtig, dass Benutzer diese Anwendung nicht schließen können. Anwendungen werden derzeit in Windows XP ausgeführt und müssen auf einem Administratorkonto ausgeführt werden, da andere Anwendungen, die Benutzer nach dem Anmelden meiner Anwendung verwenden, Administratorkonten benötigen, damit ich meine Anwendung nicht einfach unter eingeschränkten Benutzern ausführen kann.

Gibt es eine Möglichkeit, dass ich meine Hauptanwendung Haupt-Thread-Handle in Delphi bekommen kann?

Vielen Dank im Voraus

+0

wegen Ziel entfernt –

+8

Wenn ein Benutzer Programme (z. B. Process Explorer) auf Ihrem Internet-Kiosk installieren kann, haben Sie das Spiel bereits verloren. Sie sollten sich fragen, wie Sie den gesamten Computer mit Gruppenrichtlinien sichern können. –

+0

Ich würde prüfen, welche Anwendungen genau das tun, die "Administrator" -Rechte benötigt, und wenn das eine ausreichend begrenzte Teilmenge von Privilegien ist, würde ich einen Benutzer mit diesen Privilegien nur erstellen, um sie ohne volle Admin-Privilegien laufen zu lassen. Andernfalls könnte es z. B. die richtigen Registrierungsschlüssel festlegen, um die "Watchdog" -DLL beim Booten zu entfernen und dann den Computer neu starten zu lassen. –

Antwort

5

Wenn Sie die Thread-ID haben, können Sie einen Griff für sie OpenThread mit bekommen:

HANDLE WINAPI OpenThread(
    __in DWORD dwDesiredAccess, 
    __in BOOL bInheritHandle, 
    __in DWORD dwThreadId 
); 
+0

Dank Steve, der API-Aufruf war, den ich brauchte Ich habe versucht, SuspendThread Hook zu meiner DLL hinzuzufügen, aber es verhindert nicht, dass das Programm vom Dienstprogramm wie Process Explorer suspendiert wird. – srlle

+0

Ich kann immer noch verhindern, dass Programm vom Aufgabenmanager Kill Process oder einem ähnlichen Task-Manager wie Tool-Hooking TerminateProcess API-Funktion geschlossen wurde, ich hoffte, dass ich mit SuspendThread ähnlich machen kann, aber so viel wie ich sehen kann, dass Dienstprogramm SuspendThread nicht verwendet API-Aufruf zum Ausführen der Operation für den Prozess anhalten. Hat jemand eine Idee, um zu verhindern, dass die Anwendung aussetzt ??? – srlle

+1

Wenn Ihr Benutzer zum Ausführen von Process Explorer berechtigt ist, können Sie nicht viel tun, um zu verhindern, dass sie den Prozess beenden. –

6

Der einzig sichere Weg, SuspendThread zu nennen, ist mit einem Griff an den Strom Gewinde. Einen anderen Thread zu suspendieren ist eine schlechte Idee. Rufen Sie GetCurrentThread auf, um eine Handle zu dem aktuellen Thread zu erhalten. Sie können es überall dort verwenden, wo ein Thread-Handle benötigt wird. Aber geben Sie dieses Handle nicht an einen anderen Thread weiter - es ist ein spezieller "Pseudo-Handle", der immer bedeutet "aktueller Thread", egal welchen Thread es hat.

Sie können OpenThread oder DuplicateHandle verwenden, um ein "echtes" Thread-Handle zu bekommen, aber das wird Sie wahrscheinlich nicht dorthin bringen, wohin Sie wollen. Sie werden nicht in der Lage sein, Versuche zu erkennen, Ihren Thread oder Prozess zu unterbrechen, da das Programm ein anderes Programm verwendet, um Ihren Thread zu suspendieren nicht unbedingt der gleiche Wert sein wird, die Sie beim Aufruf OpenThread erhalten haben. Handles sind nur innerhalb des Prozesses sinnvoll, der sie geöffnet hat, und es ist möglich, mehrere Handles für dieselbe Sache zu erwerben, die jedes Mal den gleichen Wert ergeben können oder nicht.

Rufen Sie stattdessen GetThreadId an, um die ID des gesperrten Threads abzurufen, und überprüfen Sie dann, ob sie mit den Thread-IDs Ihres Programms übereinstimmt. Thread-IDs identifizieren Threads eindeutig; Griffe nicht. Dies gilt auch für Prozess-IDs und Handles.