2010-11-07 51 views
0

Si vous voulez arrêter un processus, vous pouvez vous connecter à TerminateProcess (ou NtTerminateProcess). Si le processus se termine lui-même (parce que vous avez fermé sa fenêtre, par exemple), le handle fourni à ces fonctions est NULL, ainsi vous pouvez savoir quel exécutable est terminé en utilisant GetCurrentProcess() & GetModuleFileNameEx(). Comme GetCurrentProcess() renvoie un pseudo-handle, vous pouvez y accéder sans problème.Accrochage de TerminateProcess et obtention d'informations à partir de la poignée

Si un processus en termine un autre, le handle fourni n'est pas NULL. Il représente le processus qui se termine. Le problème est que vous ne pouvez pas obtenir d'informations sur ce processus. Vous pouvez simplement renvoyer un code disant "accès refusé" au lieu d'appeler l'original [Nt] TerminateProcess(), mais cette couverture empêche tous les processus d'en terminer d'autres - ce qui est une mauvaise idée. Le handle doit représenter quelque chose de valide sinon TerminateProcess ne serait pas capable de faire quelque chose d'utile avec lui - mais je ne peux même pas appeler GetProcessId() dessus, j'obtiens ERROR_INVALID_HANDLE (ou ERROR_ACCESS_DENIED). J'ai essayé diverses méthodes que j'ai rassemblées de l'aide et de l'en ligne, en gagnant le privilège debug (succès) et DuplicateHandle() (même erreur) et ZwQueryInformationProcess() pour obtenir l'identification (STATUS_ACCESS_DENIED). Je ne peux même pas énumérer les processus parce qu'ils renvoient des ID, et je ne peux pas obtenir l'ID, et OpenProcess() retourne toujours un nouveau handle, donc je ne peux pas comparer les handles.

Je peux seulement supposer que le handle a PROCESS_TERMINATE droit et rien d'autre. Je sais que Vista et plus ont des processus protégés en raison de la gestion des droits numériques, mais j'utilise ProcessExplorer comme cobaye donc ce n'est certainement pas une application multimédia!

Est-ce que quelqu'un sait comment je pourrais obtenir d'autres informations sur le processus qui se termine avec ce handle?

Répondre

1

C'est juste une poignée de processus ordinaire. La question est, dans quel processus votre fonction hook est-elle exécutée? S'il s'agit du processus appelant, le handle peut être utilisé tel quel pour GetProcessId ou NtQueryInformationProcess. Sinon, vous devez appeler DuplicateHandle pour dupliquer le handle dans votre processus.

Si vous obtenez des erreurs de refus d'accès, cela peut être dû au fait que l'identificateur de processus dispose uniquement de l'accès PROCESS_TERMINATE. Dans ce cas, utilisez DuplicateHandle pour "rouvrir" le processus avec PROCESS_QUERY_ (LIMITED_) INFORMATION access.

+0

J'ai mentionné dans la question que j'avais déjà essayé DuplicateHandle() (pour essayer d'obtenir un accès suffisant), en vain. Puisque le crochet est injecté dans chaque processus et ne peut piéger que les appels que le même processus fait à NTDLL, il devrait seulement être appelé dans le contexte de l'application faisant l'arrêt. Par exemple, si ProcessExplorer met fin à une application, c'est le code du crochet mappé dans ProcessExplorer qui se déclenche, et ne seriez-vous pas d'accord pour que ce soit le propre contexte de ProcessExplorer? Il ne peut pas être l'application cible, car cela n'a pas fait l'appel TerminateProcess ... – JTeagle

+0

Je devrais préciser que j'utilise la méthode AppInit_DLLs de hook, pas un crochet à l'échelle du système. J'ai oublié de préciser que mon code de crochet s'exécute seulement dans l'application faisant l'appel pour terminer un autre. – JTeagle

+0

La raison pour laquelle j'ai mentionné les choses à propos des poignées était parce que vous n'avez pas spécifié comment l'accrochage a été fait, et vous avez mentionné avoir des erreurs de manipulation invalides. Quel est le problème avec l'utilisation de DuplicateHandle? Peut-être pourriez-vous poster du code ... – wj32