2010-12-14 43 views
2

J'ai un problème avec l'application Delphi pour déterminer la poignée de l'application en cours (filetage actuel). Je sais que je peux obtenir l'ID de thread actuel avec la fonction de l'API Windows GetCurrentThreadID, mais j'ai besoin du handle de thread actuel à utiliser comme paramètre pour une autre fonction de l'API Windows qui est SuspendThread.Obtenir la poignée de filetage actuelle

En fait ce que je suis en train de faire est de faire un de mes vieux dll fait pour accrocher les fonctions API situés dans kernel32.dll comme OpenProcess ou TerminateProcess pour ne aussi crochet pour SuspendProcess. Hook se trouve dans le fichier dll et utilise SetWindowsHookEx pour être injecté dans les processus en cours, puis trouve l'adresse de base des fonctions cibles. Je n'avais aucun problème avec les fonctions d'accrochage comme TerminateProcess car il fallait un ID de processus en tant que param facile à obtenir dans l'application principale en utilisant GetCurrentProcessID. Pour faire un hook similaire pour la fonction SuspendThread, j'ai besoin de passer le handle de thread en tant que param.

Le seul endroit où j'ai trouvé poignée de fil est une structure PROCESS_INFORMATION qui contient

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

mais le problème est que cette structure est disponible seulement après la création de processus avec CreateProcess fonction API. L'objectif principal est d'empêcher les utilisateurs du programme d'utiliser différents outils disponibles en ligne comme ProcessExplorer etc pour mettre fin au processus. Je suis parvenu à réussir avec succès les appels d'API TerminateProcess et à empêcher ainsi la fermeture de mon application, mais l'option Suspend dans ces outils d'exploration de processus peut interrompre mon processus. C'est une application de kiosque internet et il est vital que les utilisateurs ne puissent pas fermer cette application. Les applications sont actuellement exécutées sous Windows XP et doivent être exécutées sur un compte administrateur, car les autres applications utilisées par les utilisateurs après la connexion à mon application nécessitent un compte administrateur. Je ne peux donc pas exécuter mon application sous un utilisateur restreint.

Y at-il un moyen que je peux obtenir mon handle de thread principal de l'application principale dans Delphi?

Merci à l'avance

+0

supprimé à cause de l'objectif –

+8

Si un utilisateur peut installer des programmes (tels que Process Explorer) sur votre kiosque Internet, vous avez déjà perdu la partie. Vous devriez demander comment verrouiller tout l'ordinateur avec des trucs comme la politique de groupe. –

+0

Je voudrais inspecter ce que les applications font exactement qui nécessite des droits "administrateur" et si c'est un sous-ensemble assez limité de privilèges, je créer un utilisateur avec ces privilèges uniquement pour leur permettre de fonctionner sans privilèges d'administrateur complet. Sinon, il pourrait, par exemple, définir les clés de registre appropriées pour supprimer la DLL "watchdog" au démarrage, puis redémarrer la machine. –

Répondre

5

Si vous avez l'ID de fil, vous pouvez obtenir une poignée pour l'aide OpenThread:

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

Merci Steve c'était l'appel de l'API que j'avais besoin j'ai essayé d'ajouter SuspendThread Hook à ma DLL mais il n'empêche pas le programme d'être suspendu de l'utilitaire comme Process Explorer. – srlle

+0

Je peux toujours empêcher le programme d'être fermé à partir du Gestionnaire de tâches Kill Process ou n'importe quel gestionnaire de tâches similaire comme la fonction API TerminateProcess accrochage d'outils, j'espérais que je peux faire similaire avec SuspendThread, mais autant que je puisse voir Appel d'API pour effectuer une opération de suspension sur le processus. Est-ce que quelqu'un a une idée de comment empêcher l'application de suspendre ??? – srlle

+1

Si votre utilisateur est autorisé à exécuter Process Explorer, vous ne pouvez pas faire grand-chose pour l'empêcher de tuer le processus. –

6

Le seul moyen sûr d'appeler SuspendThread est avec une poignée à l'courant fil. Suspendre n'importe quel autre thread est une mauvaise idée. Pour obtenir un handle sur le thread actuel, appelez simplement GetCurrentThread. Vous pouvez l'utiliser à peu près partout où une poignée de thread est nécessaire. Mais ne donnez pas ce handle à un autre thread - c'est un pseudo-handle spécial qui toujours signifie "thread en cours", quel que soit le thread.

Vous pouvez utiliser OpenThread ou DuplicateHandle pour obtenir une "vraie" poignée de thread, mais cela ne vous permettra probablement pas d'aller où vous voulez aller. Vous ne serez pas en mesure de reconnaître les tentatives de suspension de votre thread ou processus car le handle qu'un autre programme utilise pour suspendre votre thread ne sera pas nécessairement la même que celle que vous avez obtenue lorsque vous avez appelé OpenThread. Les poignées n'ont de sens que dans le processus qui les a ouvertes, et il est possible d'acquérir plusieurs poignées pour la même chose, et cela peut ou non donner la même valeur à chaque fois.

Appelez plutôt GetThreadId pour obtenir l'ID du thread suspendu, puis vérifiez s'il correspond à l'un des ID de thread de votre programme. Les identifiants de thread identifient de manière unique les threads; les poignées ne le font pas. De même pour les ID de processus et les handles.