• [^] # Re: complément d'informations

    Posté par . En réponse au message Fonctionnement interpreteur linux. Évalué à 3. Dernière modification le 15 février 2012 à 14:39.

    Avant toute chose : chaque commentaire est muni d'un lien « répondre » après le texte. Il faut l'utiliser quand tu réponds à une personne, pour que les différents commentaires soient bien organisés en arbre.

    Pour le reste :

    Oui je parle d'un fichier compilé (elf), donc en langage machine (opcode). Pour moi l’interpréteur est le "logiciel" qui lance l'exécutable (commande ./). Si je fais une erreur de sémantique, peux-tu me donner les termes correctes ?

    Un « interpréteur » est un système qui lit des instructions, les unes à la suite des autres, et qui les « interprète », c'est-à-dire qui va exécuter, généralement au moment où il les lit, une action correspondante. En ce sens, le CPU interprète du code en langage machine, mais on n'utilise jamais le terme dans ce sens-là, justement pour éviter des confusions.

    Un interpréteur est donc, en pratique, un logiciel qui est déjà en cours d'exécution et donc la fonction est de lire et d'exécuter, pendant sa propre exécution, un programme transmis par une source donnée (généralement un fichier, mais ça peut être aussi l'entrée standard, ou autre). Ça va donc concerner des langages comme le Shell, les vieux BASIC, le Perl, le PHP, etc.

    C'est de la même façon qu'en musique, un interprète est un musicien qui va exécuter un morceau, qu'il lit sur une partition.

    Le système chargé de reconnaître la nature d'un fichier et, s'il est exécutable, soit de l'exécuter directement, soit de démarrer l'interpréteur approprié n'a pas, à ma connaissance, de nom académique, mais tout le monde parle de « lanceur », tout simplement.

    Je modifie directement les opcodes chargé en ram.

    Oui mais comment ? En principe, un segment de code est protégé en écriture. Tu devrais obtenir systématiquement une segfault si tu n'as pas obtenu explicitement les droits d'accès dessus, et ça ne se fait pas de façon simple.

    En résumé :
    1. Je reçois un fichier binaire compilé
    2. Je le patch (chiffrement + modification du point d'entrée, ajout de la méthode de déchiffrement)
    3. Lorsque j'exécute le fichier, il est chargé en mémoire et ma routine de déchiffrement prend le relais pour aller modifier les opcodes chargés en mémoire. (Cela fonctionne aussi)

    Que tu patches le fichier exécutable avant lancement et que tu y ajoutes une routine, OK. Par contre, à l'exécution, la routine ne devrait pas pouvoir modifier directement le code sans avoir obtenu les privilèges nécessaires. Tu es sûr que c'est bien le code que tu modifies alors, et pas un segment de données quelconque ?