reconvertir l'exécutable en code source C

14

Malheureusement, j'ai perdu mon code source et j'ai juste le fichier de sortie créé avec gcc sous linux et je n'ai plus accès à mon pc maintenant.y a-t-il un moyen de convertir le fichier de sortie en fichier source (en c sous linux)?

mahsa
la source
Ce que vous voulez s'appelle un décompilateur. Vous pouvez trouver de l'aide avec cette réponse: stackoverflow.com/questions/193896/whats-a-good-c-decompiler
Eric Renouf
IDA Pro avec le module de décompilation est la seule solution pratique qui fonctionne réellement avec de gros exécutables.
fpmurphy
@ fpmurphy1 Vous avez Hopper, qui est comparable en qualité à IDA Pro et dont la licence est une fraction du prix.
Rui F Ribeiro
@ fpmurphy1 Je n'ai pas encore réussi à voir la qualité du code généré par Avast ... qui utilise plus les plateformes Intel 32 bits? D'ailleurs, je n'ai pas utilisé Wintel depuis des décennies maintenant. voir unix.stackexchange.com/questions/418354/… La différence de prix est assez significative cependant, les rayons Hex / IDA pro commencent à partir de 1500USD pour une licence personnelle à des valeurs exorbitantes pour des licences commerciales comme 5000USD ou plus AFAIK, Hopper est 100USD pour un seul utilisateur et 130 pour un seul ordinateur.
Rui F Ribeiro
@RuiFRibeiro. Beaucoup de logiciels malveillants que j'examine sont toujours 32 bits.
fpmurphy

Réponses:

25

Vous aviez donc une vache, mais vous l'avez par inadvertance convertie en hamburger, et maintenant vous voulez que votre vache revienne.

Désolé, cela ne fonctionne tout simplement pas de cette façon.

Restaurez simplement le fichier source à partir de vos sauvegardes.

Ah, vous n'aviez pas de sauvegardes. Malheureusement, l'univers ne vous donne pas de pause pour cela.

Vous pouvez décompiler le binaire. Cela ne vous donnera pas votre code source, mais il vous donnera un certain code source avec le même comportement. Vous n'obtiendrez pas les noms de variables à moins qu'il ne s'agisse d'un binaire de débogage. Vous n'obtiendrez pas exactement la même logique à moins d'avoir compilé sans optimisations. De toute évidence, vous n'obtiendrez pas de commentaires.

J'ai utilisé Boomerang pour décompiler certains programmes, et le résultat était plus lisible que le code machine. Je ne sais pas si c'est le meilleur outil sur le marché. Quoi qu'il en soit, ne vous attendez pas à des miracles.

Gilles 'SO- arrête d'être méchant'
la source
1
Boomerang a l'air plutôt soigné; dommage que la documentation fasse référence à gcc -O4 car cela ne fait absolument rien (au-delà de -O3) si la mémoire me sert bien. Votre dernière phrase est bien sûr extrêmement valable ainsi que vos cinq premières phrases. Cela ne veut pas dire que le reste n'est pas valable autant que vous faites un point très fort sur l'importance de sauvegarder régulièrement. +1
Pryftan
6

Plusieurs outils sont courants dans la rétro-ingénierie d'un exécutable.

  1. La commande "fichier" qui prend le chemin du fichier comme premier paramètre afin que vous puissiez déterminer (dans la plupart des cas) quel type d'exécutable vous avez.
  2. Les désassembleurs qui montrent EXACTEMENT ce que fait l'exécutable mais sont difficiles à lire pour ceux qui n'écrivent pas de code d'assemblage sur cette architecture spécifique ou qui ont de l'expérience avec le désassemblage.
  3. Les décompilateurs comme Boomerang, Hex-rayons et Snowman peuvent fournir une meilleure lisibilité, mais ils ne récupèrent pas les noms de variables réels ou la syntaxe du programme d'origine et ils ne sont pas fiables à 100%, en particulier dans les cas où les ingénieurs qui ont créé l'exécutable ont testé avec ces paquets et a essayé de brouiller la sécurité davantage.
  4. Diagrammes ou tableaux de flux de données. Je ne connais aucun outil gratuit pour le faire automatiquement, mais un script Python ou Bash au-dessus d'un analyseur de texte de la sortie de l'assembly (qui peut être écrit en sed ou en Perl) peut être utile.
  5. Crayon et papier, croyez-le ou non, pour noter des flux et des idées.

Dans la plupart des cas, j'ai vu que le code devait être réécrit à partir de zéro, maintenu en tant que programme en langage assembleur ou reconstitué en réappliquant les demandes de changement à une version plus ancienne.

Douglas Daseeco
la source
1
# 1: Vrai bien qu'il ait aussi ses défauts. # 3: Je suppose que ce sont des commerciaux? Je suis juste curieux du point de vue académique (j'ai des sauvegardes redondantes donc pas besoin de ce genre de chose). # 4: Cflow (bien que cela utilise la source, il y en a qui travaillent sur le binaire - avec quelques mises en garde bien sûr) me vient à l'esprit. Il y en a d'autres, selon ce que vous recherchez. En ce qui concerne la sortie graphique, je ne peux pas y aider car je n'aime pas ou j'ai besoin d'une sortie graphique pour ce type de chose (je trouverais cela plus distrayant en fait). # 5: très vrai. Vous pouvez également utiliser un fichier texte ici, bien sûr.
Pryftan
3

Ce que vous voulez faire est appelé "décompilation". Il existe de nombreux décompilateurs et il n'est pas pratique de les couvrir tous ici.

Cependant, comme remarque générale: la conversion du code source C en code machine exécutable est avec perte. Par exemple:

  • Les commentaires sont irréversiblement perdus
  • Les noms de variables ont disparu
  • Parfois, les boucles sont déroulées pour les performances
  • Les fonctions peuvent être réorganisées

Il est rare que le code soit compilé tel qu'il est écrit. La plupart des compilateurs de nos jours changeront radicalement votre code pour l'optimiser. Ainsi, lorsque vous décompilez, le compilateur ne peut que deviner à quoi devait ressembler le code source, il n'a aucun moyen de savoir quel était votre code, car il a disparu. Si le décompilateur est bon, le code que vous obtenez sera au moins compilable en un exécutable équivalent, puis vous pourrez commencer à le refactoriser lentement pour qu'il soit lisible. Mais le décompilateur produira très probablement du code de spaghetti absolument illisible, et ce sera un énorme casse-tête de le déchiffrer. Parfois, cela peut finir par être moins de travail de simplement réécrire le programme à partir de zéro.

Bagalaw
la source
Au sujet des commentaires, quelque chose que j'ai récemment remarqué est - et je ne sais pas si cela permettrait aux commentaires d'être lus par un décompilateur et je ne m'attends pas à ce que les décompilateurs recherchent même ce type de chose - ceci: -C Ne pas rejeter les commentaires. Tous les commentaires sont transmis au fichier de sortie, à l'exception des commentaires dans les directives traitées, qui sont supprimés avec la directive. Il met en évidence les effets secondaires ainsi que celui de l'option -CC (c'est pour gcc mais probablement le cpp à la place). Je ne m'attends pas à ce que cela s'applique au PO, mais cela peut intéresser certains.
Pryftan