Bonjour à tous,
me revoilà après un petit peu d'absence ,tout cela par la faute des vacances scolaires et des fêtes bien sure.
Trêve de plaisanterie ,en cette nouvelle année je reprend mon petit régime hebdomadaire.
Aujourd'hui c'est un post de Ivanlef0u qui attire mon attention : Playing with windows handle.
Dans ce post il explique comment récupérer le type d'un handle ainsi que son nom.
Bien sure on utilise encore une fois la belle api windows ainsi que quelques fonctions ,venues tout droit de ntdll.
Ceci dis j'ai voulus moi même tenter l'expérience ,en codant exactement ce qu'il avait déjà réalisé.
Cela permet de mettre des petites choses au point ,être sois même confronté aux problèmes éventuels et j'en passe.
Cependant j'ai décidé d'utilisé ce petit code afin de m'amuser avec les handles de type file.
Notre but ,va donc être de fermer un handle file d'un processus !
Comme vous le savez peut être ,chaque processus possèdent des handles ouvert sur des objets qui peuvent être :
- des files
- des events
- des mutexs
- des pipes et j'en passe
Allez voir par ici ,notre fabuleuse msdn : http://msdn2.microsoft.com/en-us/library/ms724251.aspx.
Je vais donc vous expliquez comment on va opérer :
- Tous d'abord ,on doit récupérer des informations sur tous les handles ouvert sur le système ,on utilisera ntQuerySystemInformation avec l'argument SystemHandleInformation.
- Ensuite on doit trier les structures ,afin de garder seulement celles qui concernent notre processus ,on compare donc le membre de la struct spécifiant le PID avec le PID de notre processus.
- A présent on doit retrouver le type de handle auquel nous avons a faire ,on duplique notre handle afin de query des informations dessus ,duplicateHandle donc.
- Une fois dupliqué nous pouvons utiliser NtQueryObject afin d'obtenir son type.
- A présent ,si vous lisez le post Ivanlef0u il parle d'un bug au niveau des types files : et bien en effet on est obligé d'implanter une petite astuce permettant de savoir si oui ou non notre fonction est bloquante.
On lance donc des threads qui s'occupe de récupérer le nom du handle ,seulement si il dépasse le timeout on les close.
Le thread va donc s'occuper de remplir notre structure ,que nous traiterons dans la fonction qui l'appel.
- On compare le nom avec le fichier que nous voulons fermer ,et on lance notre fonction CloseHandle.
Cette fonction utilise un système que l'on a largement travaillé ,au fil de se blog : l'exécution de code bien sure.
On créer un thread dans notre processus cible sur la fonction CloseHandle ,on lui passe un pointeur sur notre handle et BIM closed.
Voilà en gros le petit code.
Celui-ci est peut être assez 'velus' à lire ,des structures en pagailles et tous cela dans un seul fichier.
Tous cela pour dire que n'hésiter pas à utiliser les headers et compagnie.
Pour tester ce petit programme ,j'ai codé un petit fopen ,qui se charge de garder le fichier ouvert ,on peut alors lancer le close de notre handle.
Place au concret ,voici un petit screenshot :
et un petit dernier :
Maintenant le principale ,les codes :
-CloseAFuckingFileHandle.c.
-HandleOpen.c.
Voici quelques liens intéréssants :
-Je vous conseille de telecharger le SDK ,elle contient de la doc concernant certaines apis natives.
-ZwQueryInformationFile -> http://www.osronline.com/DDKx/kmarch/k111_9pyq.htm.
-Playing with windows Handles -> http://www.ivanlef0u.tuxfamily.org/?p=13.
PS : un petit merci à wizardman pour sa générosité concernant le futur dns :) ainsi que Nam_K .
PS2 : merci à blackclowns pour son zine ,vraiment technique un grand merci.
PS3 : Le blog est actuellement disponible avec l'adresse suivant : www.0vercl0k.fr