J'ai une liste d'exécutables qui peuvent appeler une certaine fonction. J'ai besoin de savoir quels sont tous les execs qui appellent cette fonction. Je sais que je peux faire des «cordes -a» mais y a-t-il une autre meilleure façon de le découvrir? code complet est écrit en C.Rechercher un appel de fonction dans une liste de fichiers binaires
Répondre
Vous pouvez utiliser l'utilitaire nm conjointement avec grep pour trouver executables référence le symbole, comme ceci:
nm name_of_executable | grep symbol
Ainsi, par exemple, si j'avais une liste de executables qui pourrait utiliser « strcat », je pouvais vérifier que l'utilisation:
for file in exectuble1 executable2 ... executableN; do references_to_strcat=`nm "$file" | grep strcat -c` if [ $references_to_strcat -ne 0 ] ; then echo "$file" fi done
la petite boucle au-dessus (en supposant BASH) imprimerait la liste de tous les fichiers faisant référence à « strcat ». Notez que cela ne vous indiquera que l'exécutable réellement lié au symbole ... il n'y a aucun moyen que je connaisse pour déterminer quels exécutables peuvent référencer la fonction en utilisant le chargement dynamique (par exemple dlopen/dlsym/dlcose). Notez que si vous avez le code source, et pas seulement les exécutables, vous pouvez utiliser Doxygen pour générer un graphe d'appel complet (en plus de la documentation) pour votre code source, donc c'est une autre possibilité.
En tant que variante de Michael Aaron Safyan's answer, vous pouvez utiliser objdump -d
pour générer une liste d'assembleurs du fichier. Vous pouvez alors grep -wn
déterminer les numéros de ligne dans votre liste d'assemblage où se produit l'appel de fonction souhaité. Une fois que vous avez les numéros de ligne, vous pouvez voir votre liste et déterminer la fonction/routine dans laquelle ils sont appelés/utilisés, et comment ils sont utilisés (appelés, branchés à, poussés sur la pile, ...).
strace
et ltrace
pourrait être utile également.
- 1. Rechercher une liste d'objets en fonction de la variable d'objet
- 2. Rechercher un élément dans une liste Lua
- 3. Modification de fichiers binaires
- 4. Hadoop: Mappage de fichiers binaires
- 5. Fusion de fichiers binaires
- 6. Recherche de chaînes dans de gros fichiers binaires
- 7. Python rechercher des longueurs de liste dans une sous-liste
- 8. numérisation de fichiers binaires dans antlr3
- 9. Rechercher un lot de fichiers pour une ligne de texte
- 10. analyse de fichiers journaux binaires
- 11. Animations jQuery dans un appel de fonction
- 12. Utilisez PHP pour rechercher une liste de fichiers dans les répertoires qui contiennent une certaine chaîne
- 13. Appel d'une fonction dans une fonction javascript
- 14. Initialiser un tableau de cstring dans une fonction appel
- 15. rechercher dans un fichier audio en fonction de l'heure
- 16. une fonction pour rechercher un tableau
- 17. Comment rechercher un article dans une liste dans Erlang?
- 18. GNU Prolog - rechercher une liste de faits
- 19. Exportation de données binaires (par exemple des fichiers binaires) dans une chaîne avec .NET?
- 20. Rechercher une liste de sélection avec jquery
- 21. Rechercher une signature de fonction sous Linux
- 22. Rechercher dans une liste <DataRow>?
- 23. Rechercher une liste dans une autre liste en C#
- 24. Envoi de fichiers binaires dans Erlang sur TCP
- 25. Problème de téléchargement de fichiers binaires
- 26. fichiers binaires d'écriture/lecture
- 27. Appel d'un appel de fonction dans une chaîne dans un Oracle Procédure
- 28. Construire un appel de fonction en C
- 29. Rechercher un objet dans la liste générique
- 30. stocker/charger un tableau numpy à partir de fichiers binaires
Vous ne pouvez pas fondamentalement déterminer quels seront les arguments de chaque appel 'dlopen()'. Un programme pourrait en théorie lire les arguments à 'dlopen' de l'entrée standard. – MSalters
@ MSalters, je suis d'accord. C'est pourquoi je ne connais aucun moyen de déterminer quels exécutables référencent la fonction en utilisant le chargement dynamique. En théorie, cependant, on pourrait déterminer si les paramètres de dlopen()/dlsym() sont des constantes de compilation (ou inferrable des constantes de compilation) ou si elles sont générées d'une manière qui dépend de l'entrée de l'utilisateur. Je ne connais pas un bon moyen de le faire, cependant. Dans le cas où il est généré à partir de l'entrée de l'utilisateur, on pourrait aussi théoriquement déterminer si le nom de la fonction particulière peut être construit (la validation empêche-t-elle ce nom), etc. –