Fonction DLSym 3 C

Fonction DLSym 3 C
«Linux a trouvé bon nombre de ses fonctions uniques pour effectuer des tâches de routine. La fonction dlsym () est l'une d'entre elles. L'objectif de fonction dlsym () est de trouver l'adresse d'un symbole défini spécifié dans une DLL (bibliothèque de liens dynamiques) qui a été rendue accessible via un appel de fonction dlopen (). Après avoir chargé le fichier dynamique d'objet partagé (liaison commune) indiquée par le nom de fichier de chaîne à terminaison nulle, la fonction dlopen () sort une «connexion» anonyme pour l'objet chargé. Le symbole nommé est recherché dans la bibliothèque de liens dynamiques (DLL) qui a été récupéré par la méthode dlopen (). Dans cet article, nous parlerons de l'utilisation de dlsym ().

Si le symbole souhaité n'est pas présent dans cette DLL, les DLL dépendantes de cette DLL seront recherchées, après toutes les dépendances de celles-ci, et ainsi de suite été recherché à cet effet. Bien que la séquence dans laquelle les DLL dépendantes au même niveau soient recherchées soient indéterminées, cet ordre de recherche détermine comment les symboles de duplication dans les DLL distincts seront identifiés. Sachez que les bibliothèques dynamiques dépendantes non chargées ne seront pas chargées à la suite d'une recherche DLL DLSym () des DLL dépendantes. Seules les DLL qui ont été chargées en tant que composante des DLL dépendantes de l'appel DLOpen () seront analysées."

Rtld_now: Si la collection entière de DLL dépendantes doit être mise à la disposition des appels ultérieurs à la fonction DLSym (), ce drapeau est utilisé pour invoquer des bibliothèques de liens dynamiques.

RTLD_LAZY: Lorsque nous utilisons ce drape.

RTLD Global: Les bibliothèques nouvellement chargées peuvent utiliser les symboles spécifiés par ce package pour la détermination des symboles.

RTLD_LOCAL: Étant donné qu'aucun des deux drapeaux n'est mentionné, c'est l'opposé de RTLD Global et la valeur par défaut.

Voici la syntaxe de la commande dlsym ():

#inclure
# void * dlsym (void * __ restreint __ handler, const char * __ restrict__ symbol_name);

Le fichier d'en-tête où la fonction dlSym () est définie est . "Symbol_name" est la chaîne de caractères qui est une représentation du nom du symbole, et "Handler" est la valeur obtenue par un appel à dlopen () (qui n'a pas encore été renvoyé à la demande à dlclose ()).

La valeur nulle est renvoyée, si la poignée ne pointe pas vers une DLL appropriée qui a été ouverte par dlopen (). La valeur nulle est renvoyée par la fonction dlsym () si aucune DLL liée au gestionnaire correspond au symbole nommé (nom du symbole).

Créer le dlsym.Fichier C à l'aide de l'éditeur VIM ou de tout éditeur de votre choix, qui peut inclure Nano, etc.

Écrivez le code donné dans l'écran ci-dessous au fichier C créé à l'étape précédente. Les fichiers d'en-tête sont inclus dans les quatre premières lignes de code dans l'exemple de code ci-dessous. Suivant cela, la fonction principale est lancée, et dans la fonction principale, un pointeur de gestionnaire du type de vide est créé. La ligne de code précédente déclare un pointeur codé de caractères de type vide.

En utilisant cela, nous avons invoqué la méthode DLOpen et fourni le drapeau paresseux RTLD avec l'emplacement du .donc fichier (qui est un fichier partagé dynamique dans Linux). La variable de gestionnaire conservera les résultats de dlopen. En retournant 1, la ligne suivante détermine si le dlopen a réussi à charger la bibliothèque de liens dynamiques. En cas d'échec, l'erreur a été écrite à l'écran, et la fonction principale a été terminée.

Après l'expression conditionnelle, nous appelons maintenant la méthode dlerror () pour corriger l'erreur existante. Dès que nous ajoutons 1 entier ASCII au symbole codé du type de caractère que nous avons défini, il aura la valeur «met.«La longueur de la chaîne a été calculée dans la ligne suivante et enregistrée dans la variable de longueur codée, qui a ensuite été utilisée dans la boucle pour le décodage. Nous utilisons le symbole de fin «0» pour terminer le code après la boucle pour. Après cela, nous avons exécuté la méthode dlsym (), passant le gestionnaire et les paramètres de code décodés, et la variable de sortie comprenait les résultats.

Lors de l'invoquer la fonction DLSym () pour compiler un fichier C, le processus de compilation dans un compilateur C diffère d'une commande de compilation standard. Vous créeriez le programme à l'aide de la commande suivante si elle se trouvait dans un fichier appelé «dlsym.C ”:

$ gcc -rdynamic -o foo dlsym.C -LDL

Après une compilation réussie, le fichier de sortie est créé et donné le nom DLSym.dehors. Entrez simplement la commande./ dlsym.Out et appuyez sur la touche Entrée pour exécuter le fichier de sortie. La sortie du fichier sera affichée sur l'écran du terminal dans un système d'exploitation similaire à Unix ou Linux.

En utilisant l'éditeur VIM, nous avons fait un petit ajustement aux dernières lignes de codes du fichier C. La déclaration d'impression à la fin de la fonction principale doit être remplacée par la sortie, qui a été transformée en fonction de put. Dans les marques de citation à double de l'écran, le texte a été ajouté.

Compilez à nouveau le code et voyez la sortie sur l'écran du terminal; Sans utiliser l'instruction PRINT, nous obtenons la sortie sur l'écran en utilisant notre valeur de sortie qui est modifiée en fonction de put. Voici la sortie de ce fichier de code particulier indiqué ci-dessus.

Conclusion

Dans le paragraphe d'introduction de cet article, nous avons discuté de l'utilisation de la fonction DLSym () 3 C pour découvrir l'adresse d'un symbole défini spécifié en DLL. Nous avons discuté et élaboré deux exemples clairs de C dans le système d'exploitation Kali Linux pour cela. Les deux exemples sont très simples mais très efficaces simultanément et démontrent très clairement l'utilisation de la fonction dlSym () pour une meilleure compréhension.