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

C++ Discussion :

Binaire auto modifiable


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Points : 27
    Points
    27
    Par défaut Binaire auto modifiable
    Bonjour,

    Comment faut il s'y prendre pour qu'un exécutable puisse s'auto-éditer?

    Je voudrais tagger un exe lors de sa première exécution pour qu'il ne puisse plus être exécuté sur une autre machine par la suite.

    Je pensais déclarer une constante bien identifiable qqpart dans le code:
    const long int id = 0xf81f81f81f81.
    Lors de l'execution :
    soit le code est égale à 0xf81f81f81f81 -> on le remplace par un id généré par rapport au hardware de la machine.

    Le code correspond à l'id hardware, on continue l'exécution du programme sinon exit.

    Évidement tout est piratable, etc...

    Connaissez vous des sites qui expliquent des techniques s'y rapportant?

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    le plus simple est d'utiliser un tableau de char d'une certaine taille et d'y aller à la bourrin.
    dans un .cpp que tu link
    static const char myTab[256] ="hello";
    Ainsi en cherchant hello directement dans le binaire, tu trouvera la mémoire de myTab (ici c'est 256 octets) et tu peut la modifier.

    C'est comme cela que fait Qt pour pouvoir patcher les binaires lors de l'installation.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par yan Voir le message
    le plus simple est d'utiliser un tableau de char d'une certaine taille et d'y aller à la bourrin.
    J'avais pensé à quelque chose comme ça aussi (modification d'une zone identifiée dans le ficher .exe), mais je me demande dans quelle mesure tu ne risques pas d'avoir des problèmes sur des OS récents ou avec des anti-virus pointilleux.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Points : 361
    Points
    361
    Par défaut

    Là tu vas modifier une zone mémoire... si une autre machine load le programme c'est à partir de ce qui est sur disque, donc tu reload le binaire d'origine.

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    "HS": La solution la plus simple consiste à utiliser l'outil le plus adapté pour faire cela, donc oublier le C++ et embrasser le lisp

    PS: y'avait eu y'a quelques semaines une série de post dans un topic où le sujet était abordé (Mac LAK participait de mémoire). A fouiller
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    static const char myTab[256] ="hello";
    et aussi faire ce qu'il faut pour éviter que le compilateur te l'optimise allègrement

    bon si c'est un truc sécurisé qu'il te faut, bon ben voilà quoi.

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    et aussi faire ce qu'il faut pour éviter que le compilateur te l'optimise allègrement

    bon si c'est un truc sécurisé qu'il te faut, bon ben voilà quoi.
    ben faut juste qu'il soit utilisé quelque part. Je ne pense pas que le compilateur à le droit de modifier la taille.
    En tous cas je ne connais pas d'autre solution, je trouve cela moche mais ca marche... .
    Du moment que tu ne touche qu'à cette mémoire ton prog ne risque rien.
    Bien penser au \0 quand c'est une string


    Citation Envoyé par reptils Voir le message

    Là tu vas modifier une zone mémoire... si une autre machine load le programme c'est à partir de ce qui est sur disque, donc tu reload le binaire d'origine.
    quand je parle mémoire ici, je parle de modifier la zone de ce tableau dans le binaire. Ouvre n'importe quel exe, tu verra que toute les chaînes du code écrit avec des "" sont visible dans le binaire.

    Citation Envoyé par 3DArchi Voir le message
    J'avais pensé à quelque chose comme ça aussi (modification d'une zone identifiée dans le ficher .exe), mais je me demande dans quelle mesure tu ne risques pas d'avoir des problèmes sur des OS récents ou avec des anti-virus pointilleux.
    De ce que je connait aucun. Tant que ton exe ne fait rien de dangereux, y as pas de problème.
    J'ai déjà fait bien pire, mettre des NOP au lieu du teste de la version de windows pour faire marcher une dll sous vista.. pas eu un seule problème.

    Comme je l'ai dit, c'est la méthode qu'utilise Qt pour redistribuer des binaire car il y as des path absolue en dure dans certaine dll et dans qmake.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Points : 27
    Points
    27
    Par défaut
    Je développe justement avec Qt

    Je n'ai pas testé la solution que vous proposez car je me suis dit qu'un exécutable n'est pas modifiable en cours d'utilisation (ni le supprimer/déplacer). En tout cas, pas de manière si directe.

    Et effectivement ça à l'air de coincer. Je peux retrouver une chaine de caractère dans le bin mais je ne peux pas y accéder en écriture.

    Est ce que vous avez une idée pour y parvenir?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #include <QApplication>
    #include <QPushButton>
    #include <QDebug>
    #include <QFile>
     
    static const char myTab[256] ="premiere execution";
    const size_t msgSize = 18;
     
    int main(int argc, char* argv[])
    {
        QApplication app(argc, argv);
     
        qDebug() << myTab;
     
        QFile file(argv[0]);
        qDebug() << "ouverture du binaire :" << file.open(QIODevice::ReadWrite);
     
        char data;
        quint64 fileIndex; 
        size_t stringIndex = 0; 
     
        do {
            file.getChar(&data);
     
            //On repère la chaine de caractères à remplacer
            //ainsi que sa position dans le binaire
            if (data == myTab[stringIndex]) ++stringIndex;
            else {
                fileIndex = file.pos();
                stringIndex = 0;
            }
     
            //Si elle est identifiée, on la remplace
            if (stringIndex == msgSize) {
                file.seek(fileIndex);
                const char *newData = QString("nouvelle execution").toLatin1().constData();
                file.write(newData,msgSize);
            }
     
        } while(!file.atEnd());
     
        file.close();
     
        QPushButton quit("Exit");
        QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));
        quit.show();
     
        return app.exec();
    }

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    En cour déxécution je ne pense pas que ce soit possible.
    Mais rien n'empêche de le faire à l'installation.

    Je ne sais pas s'il est possible d'écrire dans le binaire pendant son exécution(il me semble que oui car l'exe ou dll est chargé dans la ram pour son execution). Si c'est cas, il te faudra surement relancer ton exe après la modif.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par winzzz Voir le message
    Est ce que vous avez une idée pour y parvenir?
    Le plus simple serait d'avoir un 'lanceur' externe, qui modifie l'exe puis le lance. En gros, tu exécutes le lanceur, qui vérifie que la version est bien 'd'origine', fait le calcul d'authentification de la machine, recopie l'exe, et le lance avant de se terminer...

    Ca permet aussi de faire des mises à jour de l'exe, sans avoir besoin d'une routine d'installation.

    Mais je ne comprends pas très bien comment cela va te protéger contre la copie (il suffit de faire des copies du lanceur et de la version d'origine, non?)

    Francois

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Points : 27
    Points
    27
    Par défaut
    Un lanceur/updater , c'est ce que je vais faire (d'ailleurs j'attends toujours avec impatience la suite de : http://tcuvelier.developpez.com/qt/u...-introduction/)

    Le binaire vierge ne serait téléchargeable que via le lanceur/updater (avec un accès restreint id/password).
    Le lanceur/updater modifierait immédiatement l'exe vierge sur la base de 2/3 id harware. Ainsi nulle copie de l'exe vierge.

    Je pense à une autre technique avec des dll mais je ne suis pas sur que ce soit possible.

    - Depuis l'exe, chargement d'une dll qui contient la chaine de caractère à comparer.

    - Analyse de son contenu : exécution de l'exe autorisée / interdite ou si dll vierge, édition de la dll.

    - Déchargement de la dll pour une éventuelle édition

  12. #12
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par winzzz Voir le message
    - Déchargement de la dll pour une éventuelle édition
    Je dis peut être une connerie, mais il me semble que ça ce n'est pas possible côté processus.
    Find me on github

Discussions similaires

  1. Exemple de code auto-modifiant
    Par n5Rzn1D9dC dans le forum Contribuez
    Réponses: 8
    Dernier message: 20/01/2014, 21h14
  2. Code auto modifiable x64
    Par fig77 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 04/02/2011, 17h59
  3. Code auto-modifié => sérialiser
    Par - Robby - dans le forum Assembleur
    Réponses: 2
    Dernier message: 11/05/2008, 13h23
  4. Réponses: 12
    Dernier message: 07/06/2006, 16h13
  5. Modifier la valeur courante de l'auto-increment
    Par Matth_S dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 09/03/2006, 14h02

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