IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langages de programmation Discussion :

Question juste pour comprendre même si aucun intérêt pratique.


Sujet :

Langages de programmation

  1. #1
    Membre actif
    Homme Profil pro
    aux études mais 40 ans
    Inscrit en
    juin 2004
    Messages
    1 819
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : aux études mais 40 ans

    Informations forums :
    Inscription : juin 2004
    Messages : 1 819
    Points : 274
    Points
    274
    Par défaut Question juste pour comprendre même si aucun intérêt pratique.
    Je suis tombé par hasard sur un sujet dans lequel un gars voulait pouvoir déterminer quel langage de prog a été utilisé pour créer un soft dont il n'a que l'exe.
    On lui réponds que c'est impossible car lors de la compile; le code est changé en binaire et qu'il ne subsiste rien de langage de prod de départ.

    La question que je me pose est la suivante :
    Si on a un "code" binaire qui "explique" à l'ordi comment se comporter.
    Qu'à la source on avait un code "moins primaire" qui a servit à générer ce code "primaire".

    Comment se fait-il qu'il soit impossible pour un ordinateur de recréer le code "moins primaire" sur base du "plus primaire".

    Je veux dire...
    Si je prends une soupe aux tomates, avec un peu de chimie je pourrai reconstituer les différents ingrédients et avec un peu de logique je pourrai recréer une recette qui même si elle n'est pas la même, aura tout de même comme résultat une soupe aux tomates.

    --> Si on prends un PRG en assembleur ou en binaire, pourquoi ne sait on pas le "recomposer" en langage comme du C ?

    Merci d'avance pour vos explications.

    A fort bientôt.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    27 178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 27 178
    Points : 40 701
    Points
    40 701
    Par défaut
    Le problème c'est que deux langages utilisant le même paradigme peuvent (et dans le cas idéal, devraient) donner exactement le même code.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Homme Profil pro
    Java
    Inscrit en
    mai 2011
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2011
    Messages : 163
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par Yepazix Voir le message

    Je veux dire...
    Si je prends une soupe aux tomates, avec un peu de chimie je pourrai reconstituer les différents ingrédients et avec un peu de logique je pourrai recréer une recette qui même si elle n'est pas la même, aura tout de même comme résultat une soupe aux tomates.
    En reprenant ton exemple, ici ce que tu demandes ce n'est pas de recomposer la recette de savoir quel langage a été utilisé mais plutôt : "sur quel support la recette a été écrite ?"

    Que ta recette soit sur papier / numérique / dans ta mémoire / écrite sur ton mur. Au final ça donnera la même soupe.

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    4 558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : septembre 2005
    Messages : 4 558
    Points : 11 358
    Points
    11 358
    Par défaut
    Bonjour

    Citation Envoyé par Yepazix Voir le message
    Si je prends une soupe aux tomates, avec un peu de chimie je pourrai reconstituer les différents ingrédients et avec un peu de logique je pourrai recréer une recette qui même si elle n'est pas la même, aura tout de même comme résultat une soupe aux tomates.
    Ok. Je te sers un verre d'eau. Comment détermineras-tu si c'est de l'eau extraite d'une feuille de salade, ou bien l'eau de la fonte d'une neige éternelle, ou bien de mon urine filtrée ?

    Si l'exécutable mets 120 dans l'accumulateur du processeur, comment sais-tu si cette action vient de A=120; ou de A=factorielle(5); ? Et je ne pose pas cette question au hasard. Le compilateur peut faire sauter des pans entiers de ton code, car inutiles.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    mai 2004
    Messages
    9 848
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : mai 2004
    Messages : 9 848
    Points : 26 821
    Points
    26 821
    Par défaut
    Bonjour,

    Je ne suis pas forcément d'accord, ça va beaucoup dépendre du contenu de l'exe en fait.

    Souvent, les exe sont dépendants de librairies présentes sur la machine, dont parfois une ou plusieurs librairies liées à un langage. Bien sûr, il est possible de charger des librairies Java en C, mais l'exe reste lié à la lib C.
    Ensuite, tous les exe ne sont pas strippés, et certains outils permettent dans ce cas de lister les symboles et la librairie.

    En se basant sur plusieurs choses bas niveau, il est tout de même possible d'obtenir une forte probabilité du langage de départ. Ou d'un langage de départ. Car il ne faut pas oublier qu'il y a aussi des langages qui sont compilés vers un 1er langage cible, qui lui-même est compilé vers du langage machine.
    Le langage cible est souvent un langage bas-niveau permettant des optimisations fortes et disposant de nombreux compilateurs pour toutes les plateformes, comme le C.

    Mais même dans ce cas, il est possible avec des connaissances de ces langages de remonter : le code généré (le C donc) va souvent comporter des manières de faire qui sont spécifiques et qui peuvent être reconnues (parfois, avec de l'habitude et tout et tout).

    Pour ceux qui veulent jouer avec un exe et approfondir le sujet, je ne peux que conseiller l'utilisation de ghidra, un outil de reverse engineering de la NSA : https://en.wikipedia.org/wiki/Ghidra.
    Pensez à faire une copie de l'exe que vous ciblez, et tout ceci doit être fait dans le respect des lois.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    février 2010
    Messages
    4 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2010
    Messages : 4 015
    Points : 7 185
    Points
    7 185
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Yepazix Voir le message
    Si je prends une soupe aux tomates, avec un peu de chimie je pourrai reconstituer les différents ingrédients et avec un peu de logique je pourrai recréer une recette qui même si elle n'est pas la même, aura tout de même comme résultat une soupe aux tomates.
    C'est bien simple : on parle de LANGUAGE (C, ADA, Pascal, etc.), pas des ingrédients (instructions du CPU).

    Ainsi, si tu prends un livre de recette en français et que tu prépares une sauce tomate, un chimiste polonais saura retrouver quels ingrédients tu as utilisé, peut-être même dans quel ordre tu les a mis, mais ne saura pas réécrire ta recette en français : au mieux il écrira une recette en polonais !

    Par contre, un bémol sur ce qui a été répondu à ton collègue.

    La plupart des langages ont leurs propres spécificités et frameworks.

    Ainsi, un programme *.exe créé avec .NET ou Java ne pourront probablement pas être décompilés avec un décompilateur C.
    Et l'inverse est encore plus vrai !

    Donc à partir de l'EXE, on peut retrouver des pistes (ou en écarter) pour déduire le langage utilisé. Si ton EXE référence des librairies .NET c'est probablement du C# ou VB.NET, s'il référence un JDK, c'est du Java, s'il référence les redistribuables C++ bah... c'est probablement du C++ (ou pas)

    Dans tous les cas, à l'image du VB.NET et C#, il est possible de décompiler un même programme dans l'un ou l'autre des deux langages sans aucun problème, tout comme une recette en français peut être transcrite en polonais simplement en étudiant le résultat.
    On ne jouit bien que de ce qu’on partage.

  7. #7
    Membre actif
    Homme Profil pro
    aux études mais 40 ans
    Inscrit en
    juin 2004
    Messages
    1 819
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : aux études mais 40 ans

    Informations forums :
    Inscription : juin 2004
    Messages : 1 819
    Points : 274
    Points
    274
    Par défaut
    Avant tout , merci a tous pour vos commentaires tres enrichissants.

    Je comprends certains éléments de ce que vous dites mais pas la finalité "logique".

    Ainsi, si tu prends un livre de recette en français et que tu prépares une sauce tomate, un chimiste polonais saura retrouver quels ingrédients tu as utilisé, peut-être même dans quel ordre tu les a mis, mais ne saura pas réécrire ta recette en français : au mieux il écrira une recette en polonais !
    C'est justement ce qui me perturbe.
    Si je prends ma recette en Français, je fais ma soupe.
    Ensuite un "expert" analyse ma soupe, trouve les ingrédient, leur ordre, leur proportion et refait une recette en polonais qui donne une soupe identique.

    On peut donc penser qu'en prenant un exe ecrit en C et compilé, on pourrait le décompiler en Pascal.

    Bon OK, je comprends pourquoi dans l'absolu c'est difficile, voir impossible à cause des librairies.
    Mais si on le décompilait dans le même langage ?

    Bon après ça n'a en fait pas grand intérêt de décompiler pour décompiler.

    Là ou je veux en venir c'est que je vois parfois des discussion sur tel langage qui a un "bon" compilateur ou pas.
    Je me suis donc dit que l'ordinateur était un étrange machine capable de comprendre plein de langages qui peuvent lui dire de faire la même chose mais qu'en fonction de la manière dont on lui parle il va faire ces choses + ou - bien.
    Dans la mesure ou finalement avant de "faire" il va de toute façon traduire ça en assembleur, je me suis dit OK, le PC traduit un langage plus ou moins bien dans sa langue.
    Mais comme généralement quand on traduit ca marche dans les deux sens, pourquoi ne pas pouvoir revenir dans l'autre sens.
    Interet de la finalité de ce raisonnement:
    Imaginons un vieux exe développé sur Delphi 3 (donc Pascal Object si je ne me trompe).
    On l'a compilé, on l'a utilisé les années ont passées.
    Ajd on se dit, tiens je reprendrait bien ce vieux brol pour le mettre au gout du jour...
    ce serait tout de même cool de pouvoir le "retranscrire" dans un langage récent (du moins la base) pour ensuite le retravailler ?

    Bon ok oui je me drogue de temps en temps.... mais avouez que ce serait cool non ?

  8. #8
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    mai 2004
    Messages
    9 848
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : mai 2004
    Messages : 9 848
    Points : 26 821
    Points
    26 821
    Par défaut
    Hello,

    C'est tout à fait possible, mais ça reste compliqué.

    Si tu écris un code (propre), tu obtiens quelque chose de lisible et de (normalement) à peu près compréhensible par beaucoup de développeurs.
    Ensuite, tu prends ce code, puis tu le compiles, et là ça complique les choses, parce que le compilateur peut soit produire du code machine qui est "au plus proche" de ton code, soit appliquer tout un tas d'optimisations.

    Tu peux essayer (par exemple) de prendre un programme simple en C (ou autre), puis de produire l'assembleur avec ou sans optimisation, et comparer. [avec gcc, tu peux lancer "gcc -S test.c" et "gcc -O2 -S test.c" par exemple pour produire les 2 sorties].

    Après, dans le cas que tu cites, pourquoi ne pas repartir des sources, et appliquer un programme comme p2c (pascal to C) ?
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  9. #9
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    4 558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : septembre 2005
    Messages : 4 558
    Points : 11 358
    Points
    11 358
    Par défaut
    • Tout d'abord, c'est trop compliqué. Même si dans l'absolu c'est imaginable. (le temps c'est de l'argent, on vit dans une société consumériste qui ne répare pas, etc)
    • Ensuite, un logiciel peut faire appel à des fonctions stockées dans des bibliothèques extérieures... qui n'existent plus !
    • Enfin, on ne peut pas forcément faire du "poste pour poste". Imaginons une instruction qui décale à gauche dans la mémoire. Sur un système 32 bits, les données les plus à gauche sont perdues. Dans un système 64 bits, les données qui auraient dû disparaître, selon le programmeur, ne disparaissent plus. Et il faut comprendre, au-delà du code, ce qu'a voulu faire l'auteur, pour le reproduire. Ce n'est pas facile. En tout cas, pas systématique.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  10. #10
    Membre actif
    Homme Profil pro
    aux études mais 40 ans
    Inscrit en
    juin 2004
    Messages
    1 819
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : aux études mais 40 ans

    Informations forums :
    Inscription : juin 2004
    Messages : 1 819
    Points : 274
    Points
    274
    Par défaut
    Je vois que j'ai encore une fois réussi à poser une questions surréaliste ou même les experts comme vous ne tombent pas d'accord

    Bon j'ai un peu regardé Ghidra.
    Si je ne me trompe c'est un peu un ancêtre non ?
    Je vois des "brocantes" comme les regrettés processeurs 68000 (Ah un bon vieil Amiga, Amos Pro et un disque dur de 20Mo)
    Par contre je ne vois pas de 64 bits...

    ET il faut aussi installer java pour que ça tourne non ?

    Du coup j'ai essayé X64dbg que j'ai trouvé sur le net.
    J'ai pris un tout petit et vieux programme de dessin que j'utilisais avec mon XP (et dont j'ai la licence).
    Et j'ai essayé de voir à quoi ça ressemble.
    Bon je crois que j'ai piger ce que sont des points d'arrêt et j'ai modifié quelques chaines de caractère pour que les menus soient en Français.
    Ca marche et c'est marrant :-).

    Mais bon ça reste complexe à lire...
    Est ce que c'est ça qu'on appel débugger en live ? Ou est ce que c'est debugger Off line ?

    Est ce qu'il y a des autres trucs que X64dbg qui permettent de voir plus clair ?

    Ou est ce que je pourrais prendre des cours ou des tutos la dessus car même si je comprends certaines choses il y a encore des choses assez mystérieuse comme par exemple cette pile.
    Et d'ailleurs une pile comment AA ? AAA? 1.5v, 9v ?

    Je vois aussi qu'il y a des commandes spécifiques .
    Si on prend les instructions J par exemple c'est assez "ergonomique" ça saute, c'est une sorte de GOTO quoi...
    Par contre il y a plein de brols comme les AES, AND, CVT, VFN,... qui sont dans l'abstraction totale.

    Je pensais trouver quelque chose d'un minimum compréhensible mais en fait ce sont des opérations qui sont hors de la (ma) portée humaine aussi bien en lecture en qu'en écriture.

    Par exemple si je voulais simplement écrire un tout petit exe qui lit la première ligne d'un fichier texte et l'affiche... ou si je devais trouver cette petite routine dans un exe... Ca me semble impossible car, arretez moi si je me trompe mais je n'aurai à aucun endroit une commande du genre
    ouvrirfichier "machin".
    affichercontenufichier "machin".

    Ca ressemblerait plus à un brol du genre.
    Ajoute un octet par ci.
    Permute un octet par la.
    Multiplie 4 paquets par la valeur réel de brol.
    etc...

    Je suis dans le bon ?

  11. #11
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    4 558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : septembre 2005
    Messages : 4 558
    Points : 11 358
    Points
    11 358
    Par défaut
    Voilà. Tu as tout compris.

    C'est la différence entre les logiciels propriétaires et les logiciels libres. Dans les logiciels libres, on te donne le code compréhensible par un être humain. Dans le logiciel propriétaire, on te donne uniquement le code exécutable par la machine; et tu ne peux rien en faire. Si tu as des envies, mets-toi au logiciel libre.

    À noter : j'ai déjà vu un dé-constructeur java qui produit du code java à partir d'un fichier compilé.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  12. #12
    Membre actif
    Homme Profil pro
    aux études mais 40 ans
    Inscrit en
    juin 2004
    Messages
    1 819
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : aux études mais 40 ans

    Informations forums :
    Inscription : juin 2004
    Messages : 1 819
    Points : 274
    Points
    274
    Par défaut
    @Flodelarab Oui JE ne sais rien en faire car je suis un navet mais quelqu'un qui connait super bien l'assembleur ne pourrait il pas s'y retrouver ?

Discussions similaires

  1. [Modèle de Contexte] des questions pour comprendre le MCC et MCT
    Par bambi98 dans le forum Merise
    Réponses: 1
    Dernier message: 19/01/2009, 15h04
  2. je ne pose pas de question c juste pour recuperer le format code merci
    Par booskap dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/09/2007, 19h13
  3. [Maven 2][Eclipse] Deux questions pour comprendre!!
    Par Sniper37 dans le forum Maven
    Réponses: 5
    Dernier message: 08/03/2006, 13h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo