Extraire des bibliothèques liées statiquement à partir d’un exécutable

Je ne sais pas si c‘est même possible, mais un fichier exécutable (foo.exe) contenant de nombreuses bibliothèques a été lié statiquement.

Existe-t-il un logiciel qui extrait de ce fichier le fichier .lib (ou .a) contenu dans l’exécutable?

Merci.

Incroyablement improbable car, en règle générale, le contenu complet de la bibliothèque n’est pas injecté dans votre exécutable.

Vous en aurez juste assez pour satisfaire tous les symboles indéfinis. Cela ne représente en réalité qu’une petite partie de la bibliothèque. Une bibliothèque consiste généralement en un ensemble de fichiers objects dont seuls ceux nécessaires sont liés à votre exécutable.

Par exemple, si la seule chose que vous avez appelée dans la bibliothèque d’exécution C était exit() , il serait très peu probable que vous printf() famille de fonctions printf() dans votre exécutable.

Si vous avez lié directement avec les fichiers objects, vous avez peut-être une chance, car ils seraient inclus, qu’ils soient utilisés ou non (à moins que votre éditeur de liens soit intelligent).

Mais même cela serait une tâche herculéenne, car l’exécutable ne contiendrait aucune information sur les sections de code provenant de fichiers objects spécifiques. C’est potentiellement faisable, mais s’il y avait une autre façon, je le regarderais en premier.

Permettez-moi de clarifier le processus typique:

  1. Quatre fichiers objects, ao , bo , co et do contiennent respectivement les fonctions a() , b() , c() et d() . Ils sont tous ajoutés à l’archive abcd.a
  2. Ils sont tous autonomes (pas de dépendances) à l’exception du fait que b() appelle c() .
  3. Vous avez un programme principal qui appelle a() et b() et vous le comstackz puis vous le reliez à la bibliothèque abcd.a
  4. L’éditeur de liens traîne entre la bibliothèque et votre exécutable, satisfaisant ainsi le besoin de a() et b() mais introduisant une nécessité de c() , car b() besoin.
  5. L’éditeur de liens fait alors glisser co de la bibliothèque vers votre exécutable, satisfaisant ainsi le besoin de c() . Maintenant tous les symboles non définis sont satisfaits, l’exécutable est terminé et épousseté, vous pouvez l’exécuter quand il est prêt.

Aucune étape de ce processus n’a été traînée dans votre exécutable, vous n’avez donc aucun espoir de le faire sortir.

Mise à jour: Concernant le commentaire “s’il y a un autre moyen, je regarderais ce premier” que j’ai fait ci-dessus, vous venez d’indiquer dans un commentaire à une autre réponse que vous avez le code source qui a généré les bibliothèques que vous voulez extraire . Je dois demander: pourquoi ne pouvez-vous pas reconstruire les bibliothèques avec cette source? Cela me semble une solution beaucoup plus simple que d’essayer de recréer les bibliothèques à partir d’un fouillis de code exécutable.

Imaginez 10 livres dans une langue que vous ne comprenez pas, sans couvertures, pages de titre, numéros de page et chapitres. Certains livres peuvent être incomplets. Toutes les pages sont mélangées, il est donc impossible de savoir où se trouvent le début et la fin de chaque livre (chaque page est un appel de fonction). Essayez maintenant de trouver la page 123 du livre 5 (disons qu’il est mentionné ci-dessus dans la fonction Exit () ).

Eh bien, c’est possible …

Il semble que vous demandiez un décompilateur. De tels outils sont difficiles à utiliser (probablement impossible pour un C ++ moyennement sophistiqué) et s’il existe un autre moyen de résoudre votre problème, y compris prendre quelques mois pour réécrire les bibliothèques, je le recommanderais.

Comme l’a souligné pax, même si vous utilisiez un décompilateur, vous n’obtiendrez que les fonctions de bibliothèque appelées par l’exécutable.