Dois-je ajuster les privilèges de jeton pour pouvoir appeler avec succès CreateRemoteThread?

Je développe une installation de débogage pour mon application pour m’aider à diagnostiquer les blocages. L’application s’exécute sur les machines de mes clients et j’attends donc un large éventail de systèmes d’exploitation, de stratégies de sécurité, etc.

La technique que j’utilise consiste à implémenter une fonction dans l’application cible qui génère des traces de stack pour tous les threads, ainsi que d’autres informations de diagnostic. Ceci est ensuite écrit dans un fichier mappé en mémoire. Je crée également une application utilitaire utilisée pour déclencher la création du rapport de diagnostic, puis la lire à partir du fichier mappé en mémoire.

Étant donné que l’application cible est supposée être morte, le programme utilitaire ne peut pas lui envoyer un message pour déclencher la collection de diagnostics. Au lieu de cela, j’utilise CreateRemoteThread pour être sûr d’avoir un thread en direct pour faire le travail.

Notez que cela diffère des méthodes d’injection DLL qui utilisent généralement LoadLibrary comme proc pour CreateRemoteThread . Mon processus proc est un point d’entrée dans l’application cible. Donc, je n’ai pas besoin d’appeler WriteProcessMemory .

Je l’ai implémenté et dans mes environnements de test, cela fonctionne bien. Selon la documentation de CreateRemoteThread , j’ai besoin d’un handle de processus avec les droits d’access suivants:

PROCESS_CREATE_THREAD , PROCESS_QUERY_INFORMATION , PROCESS_VM_OPERATION , PROCESS_VM_WRITE et PROCESS_VM_READ

J’ai donc passé ces drapeaux en appelant OpenProcess .

Maintenant, enfin, à ma question: de quels privilèges ai-je besoin pour que l’appel à OpenProcess réussisse?

Dans mon environnement de test (Windows 7, UAC activé, administrateur), je n’ai rencontré aucun problème avec un jeton par défaut. J’ai vu divers exemples de code qui acquièrent le privilège SE_DEBUG_NAME avant d’appeler OpenProcess . Je suppose que c’est nécessaire pour WriteProcessMemory lors de l’injection de DLL et que je n’ai pas besoin de ce privilège. Y a-t-il des scénarios où je devrais ajuster les privilèges de mon jeton?

Je ne connais précisément rien à la sécurité Windows, alors j’apprécierais vraiment les mots sages de tous ceux qui le font!

Habituellement, si le processus cible s’exécute dans le même contexte (en tant que même utilisateur) que le débogueur, aucun privilège n’est requirejs pour OpenProcess ou CreateRemoteThread.

Si le processus cible s’exécute en tant qu’utilisateur différent ou si les permissions de processus ont été modifiées, vous devrez peut-être activer SE_DEBUG_NAME avant d’appeler OpenProcess. Ce privilège vous permet d’ouvrir n’importe quel processus, en contournant les permissions de sécurité affectées au processus. (Ceci est analogue à la manière dont les privilèges de sauvegarde / restauration vous permettent de contourner les permissions de sécurité sur les fichiers et les répertoires.)

Certaines applications modifient leurs propres permissions de processus afin que, par exemple, l’utilisateur ne puisse pas utiliser le Gestionnaire des tâches pour supprimer le processus. Dans ce cas, c’est votre propre code, donc cela ne posera pas de problème. Il est en principe possible que d’autres logiciels (logiciels anti-virus, par exemple) modifient les permissions sur votre processus, mais je n’en ai jamais entendu parler. Vous n’avez donc probablement pas à vous soucier d’activer SE_DEBUG_NAME.