Nouveaux concepts : Apprendre à appeler les fonctions exportées par vos DLL Nouvelles fonctions API : LoadLibrary |
Dans ce chapitre, nous allons coder une DLL simple avec des fonctions exportées et examiner différentes méthodes pour appeler la fonction à partir de notre application cliente. Dans le premier exemple, nous utiliserons une liaison implicite (au moment du chargement) et dans le deuxième nous utiliserons une liaison explicite (au moment de l'exécution). Dans le deuxième cas, nous importerons l'une des fonctions par ordinal. C'est la méthode que nous devons utiliser pour accéder aux API non documentées car les noms des fonctions ne seront pas visibles dans la DLL ou dans une bibliothèque d'importation disponible. Tout d'abord, nous allons construire une DLL qui exporte 2 fonctions simples - l'une par nom et l'autre uniquement par ordinal. Créez un nouveau projet WinAsm et assurez-vous d'utiliser les paramètres DLL déjà évoqués dans le dernier tutoriel. Maintenant, collez le contenu de MyDLL.asm : Ajoutez un fichier DEF avec les lignes suivantes : EXPORTS _ExpFunc1 @ 01 Rappelez-vous du dernier tutoriel que le mot-clé NONAME empêche le nom de la fonction d'être placé dans la DLL et l'exporte uniquement par ordinal. Cliquez sur Go All pour construire les fichiers MyDLL.DLL et MyDLL.LIB. Si vous le souhaitez, vous pouvez vérifier la DLL résultante avec n'importe quel outil d'exploration PE, par exemple CFF Explorer de Ntoskrnl : Notez que la fonction ayant une valeur ordinale de 2 n'a pas de valeur dans les champs de nom, et que NumberOfFunctions est supérieur de 1 à NumberOfNames. Pour utiliser le fichier LIB pour lier une application avec notre nouvelle DLL au moment du chargement, nous avons également besoin d'un fichier INC. Cela peut être fait avec l'utilitaire lib2inc, mais peut également être écrit à la main en tant que fichier texte et renommé en MyDLL.INC. Il contient simplement une liste de prototypes de toutes les fonctions exportées par la DLL, de la même manière que nous écrivons les prototypes pour nos propres procédures. Pour utiliser lib2inc, ouvrez une invite de commande depuis le dossier contenant le fichier lib et lib2inc, puis tapez "lib2inc MyDLL.lib" (sans les guillemets) : Cela produit un simple fichier inc comme décrit ci-dessus :
|
Maintenant, nous allons coder une application rapide pour lier notre DLL au moment du chargement et importer les fonctions. Lancez WinAsm et créez un nouveau projet - cette fois-ci un exécutable standard. Collez le code Implicit.asm : Cette application d'exemple appelle simplement les 2 fonctions l'une après l'autre, puis se termine. Notez que même si la deuxième fonction est exportée uniquement par ordinal et que son nom n'est pas intégré dans la DLL, nous pouvons toujours l'appeler par son nom car nous avons les fichiers LIB et INC.
|
Maintenant, nous allons modifier l'application ci-dessus pour qu'elle utilise une liaison au moment de l'exécution. La première fonction sera appelée par nom et la deuxième par ordinal. Créez un nouveau projet et collez le code Explicit.asm : Dans ce cas, nous utilisons LoadLibrary pour charger notre DLL dans l'espace d'adressage du processus et renvoyer son handle, puis GetProcAddress pour trouver l'adresse des fonctions que nous souhaitons appeler. GetProc peut utiliser soit un pointeur vers le nom de la fonction, soit la valeur ordinale de la fonction. Notez que nous n'avons pas besoin de fichier lib ou inc, mais si la fonction appelée nécessitait le passage de paramètres spécifiques, nous devrions les connaître pour l'utiliser correctement. Enfin, FreeLibrary est utilisé pour décharger la DLL. Cela se produirait en réalité automatiquement après l'appel à ExitProcess, mais il est bon de le faire quand même par souci de bonne pratique de programmation.
|
Copyright (C)- xtx Team (2021)