Bonsoir à tous ,
Je ne sais pas si vous avez déjà écouté le dernier live des dafts punks ,mais dans ce cas là : lancez la mule ;).
Après cette petite publicitée pour les dieux de l'électro ,je laisse place à mon modeste post de la semaine donc.
Cette-fois ci c'est ce qu'on appelle "l'api native" qui a attiré mon attention.
Je vais vous parler un peu de ce beau bordel.
Tout d'abord il faut savoir que l'on appelle api native ,soit les fonctions exportées par ntdll.dll donc.Celles-ci sont dîtes 'undocumented' ( une poignée de fonction d'écrite dans le DDK ).
Nous parlerons un peu plus tard de l'aspect coding ,ce qui va nous intéressé c'est un peu l'histoire de cette librairie un peu spécial ,je dirais.
Une petite anecdote raconterait qu'il y a quelques années ,nos amis windoziens pensaient justement ,que cette dll ,plutôt mystérieuse ,contenait des fonctions cachées.Cependant leurs craintes étaient loin d'être injustifiées ,car en effet windoz nous a caché pas mal de petites choses.
Deplus cette dll étant loadé par tous les processus ,cela attirait l'oeil ,dirais-je.
Après cette petite anecdote passons à l'aspect technique ,coding.
Je vous vois d'ici vous demander : - "Mais comment vas-t-on connaître leurs noms etc ..?".
Tout d'abord pour le nom des fonctions exportées par cette dll ,il suffirait d'allez s'engoufrer dans l'EAT ( Export Address Table cf Portable Executable ).
Nous disposons donc de l'information la plus simple à récupérer pour le moment ,leurs noms.
Ensuite plusieurs personnes ce sont décarcassés afin de produire un prototype de ces apis ( voir liens en bas de page ).
Maintenant à nous de jouer.
Après cette brève introduction au sujet ,je vais vous parler de l'exemple accompagnant l'article.Celui-ci va lister le nom des processus ,les treads identifier ( TID ) des threads associés aux processus.
Un code tout à fait basique donc ,qui pouvait être réalisé avec un CreateToolhelp32Snapshot().
Je vais commenter un petit peu le code ,car celui-ci est peut être un peu velu au première abord.
Tout d'abord la technique pour appeler les fonctions :
- Nous définissons un pointeur de fonction nous permettant d'appeler notre fonction un peu plus tard.
- Vue qu'aucun header à définit ces fonctions nous sommes obligés de trouver son adresse grâce à deux apis : GetModuleHandle() et GetProcAddress().
- Nous assignons donc cette adresse au pointeur de fonction ,notre fonction est prête à étre utilisée.
Une fois cela compris ,vous avez tout compris car le reste n'est que de la manipulation de structures , de pointeurs de structures etc..
On google un peu pour connaitre les structures associées ,les constantes utiles etc.
Je vous donne un petit screenshot du code en action :
Ensuite pour bien vérifier la véracitée des informations renvoyées ,nous codons un petit programme faisant appel à l'api GetCurrentThreadId().
Place aux petits codes à présent :
DumpFuckingProcAndTID.
ThreadID.
Voilà voilà ,vous devez être capable à présent avec un minimum de documentation d'utiliser les apis natives.
Liens :
- ftp://ftp-developpez.com/windows/cours/api-native.pdf -> Petit article sympa traitant des apis natives
- http://ivanlef0u.free.fr/repo/windoz/Ntdll_EAT.txt -> Export Address Table de la librairie.