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

Qt Discussion :

Éditeur hexadécimal


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 19
    Par défaut Éditeur hexadécimal
    Bonjour/soir,
    Dans le cadre d'un outil plus important permettant diverses tâches sur des fichiers (textes/exécutables/binaires/etc...), et ayant terminé la partie sur les fichiers textes, je souhaitais désormais attaquer la partie exécutable/binaire. J'ai donc rédigé un petit programme de test permettant à l'utilisateur de choisir un fichier afin de le voir apparaître comme dans un éditeur hexadécimal (exemple: HxD). Une copie de cette sortie est également enregistré dans un fichier afin de comparer plus facilement avec HxD.

    Je récupère bien un fichier avec 12 éléments précédé de "0x", et en comparant rapidement cela semble correspondre. Cependant, lorsque je souhaite afficher le contenu de mon tableau dans un QTextEdit ou un QPlainTextEdit, je ne vois apparaître uniquement que les valeurs seules (exemple: 4d5a au lieu de "0x4d","0x5a"). De plus, que ce soit dans le fichier ou durant l'affichage, ces valeurs sont précédées de plusieurs zéros.

    Mes questions sont donc les suivantes:
    - comment faire pour ne pas avoir ces zéros avant ?
    - comment se fait-il que l'affichage ne corresponde pas à mes attentes alors que dans le tableau se sont des QString dans lesquelles le "0x" apparait bien ? Dois-je appliquer une conversion ?

    En vous remerciant d'avance, toute aide sera la bienvenue.

    Un extrait de mon fichier:
    Nom : Capture.PNG
Affichages : 472
Taille : 9,5 Ko

    Le code:

    mainwindow.h
    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
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QDir>
    #include <QDebug>
    #include <QLocale>
    #include <QFileInfo>
    #include "shellgen.h"
    #include <QMainWindow>
    #include <QFileDialog>
    #include <QTranslator>
    #include <QApplication>
    #include <QLibraryInfo>
     
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
     
    private slots:
        void on_pushButtonQuit_clicked();
     
        void on_pushButtonChoixFile_clicked();
     
        void on_pushButtonRun_clicked();
     
    private:
        Ui::MainWindow *ui;
        ShellGen shellGen;
        QDir defaultDir= (QDir::homePath() + "/Documents");
    };
    #endif // MAINWINDOW_H
    mainwindow.cpp
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
     
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }
     
     
    void MainWindow::on_pushButtonQuit_clicked()
    {
        QApplication::quit();
    }
     
    void MainWindow::on_pushButtonChoixFile_clicked()
    {
        QFileDialog dialChoixFichier;
        dialChoixFichier.setDirectory(defaultDir);
        QString fichierChoisie = dialChoixFichier.getOpenFileName(this, tr("Open File"), nullptr, tr("Executable (*.exe)"));
        ui->lineEditChoixFile->setText(fichierChoisie);
    }
     
    void MainWindow::on_pushButtonRun_clicked()
    {
        QString filePath = ui->lineEditChoixFile->text();
        QFileInfo infoOriginalPath(filePath);
        QString originalName = infoOriginalPath.baseName();
        QString nameFileOut = ui->lineEditNomOut->text();
        if(filePath == "")
        {
            qDebug() <<"ERREUR: Pas de fichier sélectionner en entrée." << endl;
            return;
        }
        else
        {
            if(nameFileOut == "")
            {
                qDebug()<<"ERREUR: Aucun nom donné au fichier de sortie.";
                qDebug()<<"Ajout automatique d'un nom de sortie par défaut."<<endl;
                ui->lineEditNomOut->setText(originalName+"_shell.bin");
                nameFileOut = originalName+"_shell.bin";
            }
            else if(!nameFileOut.contains(".txt", Qt::CaseSensitive))
            {
                qDebug()<<"ERREUR: Aucune extension n'a été renseignée... Ajout automatique de l'extension.";
                nameFileOut = nameFileOut+".bin";
                ui->lineEditNomOut->setText(nameFileOut);
            }
            QByteArray monShell = shellGen.generer(filePath, nameFileOut);
            ui->plainTextEditShell->appendPlainText(monShell.toHex());
        }
    }
    ShellGen.h
    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
    #ifndef SHELLGEN_H
    #define SHELLGEN_H
     
    #include <QDir>
    #include <QFile>
    #include <QDebug>
    #include <QVector>
    #include <QObject>
    #include <QByteArray>
    #include <QTextStream>
     
    class ShellGen
    {
    public:
        ShellGen();
        QByteArray generer(QString filePath, QString fileOut);
    };
     
    #endif // SHELLGEN_H
    shellgen.cpp
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    #include "shellgen.h"
     
    ShellGen::ShellGen()
    {
     
    }
     
    QByteArray ShellGen::generer(QString filePath, QString fileOut)
    {
       qDebug() << "On entre dans la fonction generer...";
       int tailleContent = 0;
       QByteArray content;
       QByteArray shellcode;
     
       QFile openFile(filePath);
       if(openFile.open(QIODevice::ReadOnly))
       {
           qDebug()<<"Méthode generate --> Fichier ouvert: "<<filePath;
           content = openFile.readAll().toHex(); //shellcode etant un QByteArray
           tailleContent = content.size();
           qDebug()<<"La taille de data est: "<<tailleContent;
           shellcode.resize(tailleContent);
           for(int elmnt = 0;elmnt < tailleContent; elmnt++)
           {
     
               if(elmnt != 0)
               {
                   qDebug() << "Ajout d'une virgule dans le tableau...";
                   shellcode.append(",");
               }
               if((elmnt % 24) == 0)
               {
                   qDebug() << "Ligne de 12 élément fini, retour à la ligne..." << endl;
                   shellcode.append("\n\t");
               }
     
               QString currElmnt;
               QString nextElmnt;
               currElmnt = content[elmnt];
               qDebug()<< "Affichage de currElmnt:" << currElmnt;
               nextElmnt = content[elmnt+1];
               qDebug()<< "Affichage de nextElmnt:" << nextElmnt;
               QString newElmnt;
               newElmnt = "0x"+currElmnt+nextElmnt;
               shellcode.append(newElmnt);
               qDebug() << "Element ajouté dans le tableau: " <<newElmnt<< endl;
               elmnt+=1;
     
           }
           qDebug() << "Traitement terminé...";
     
       }
       else
       {
           qDebug() << "ERREUR: Le fichier d'entrée n'a pas put être ouvert !" << endl;
       }
     
       openFile.close();
     
       int tailleShellcode = shellcode.size();
       qDebug()<<"Taille final de shellcode: "<< tailleShellcode;
     
       QDir currDir;
       currDir.setCurrent(QDir::homePath()+"/Documents/");
       QFile finalFile(fileOut);
       if(finalFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
       {
           QTextStream fluxOut(&finalFile);
           for(int car=0; car <= tailleShellcode; car++)
           {
               QString byte;
               byte = shellcode[car];
               qDebug()<<"Affichage du contenu de byte: " << byte;
     
               if(byte != NULL) //Un essaie que j'ai fait pour enlever les valeurs NULL
               {
                fluxOut << byte.toUtf8();
               }
           }
       }
       finalFile.close();
       return shellcode;
    }

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Il faut formatté votre texte avant de l'afficher. Les 0x n'existent qu'à l'affichage, par convention pour les humains, pour dire que c'est de l'hexadécimal.
    Par conséquent, vous devez lire votre texte binaire octet par octet. Ensuite, vous pouvez ajouter des '0x' pour respecter la convention et des espaces pour la propreté.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 19
    Par défaut
    Bonjour et merci pour votre réponse,
    Il me semblait avoir déjà fait ce que vous me conseillé ?

    En effet, j'ai ouvert mon fichier exécutable dans un QByteArray et récupérer le contenu. Ensuite, j'ai lu chaque éléments de ce QByteArray afin d'y récupérer les éléments deux par deux (pour former un mot hexa) et y ajouter devant un QString "0x". Entre chaque "mots" je rajoute une virgule et tout les 12 "mots" un retour à la ligne et tabulation. Le tout est stocké dans un autre QByteArray.

    Donc, si je reprend votre message, après cela lorsque je récupère mon tableau final et avant de le retourner, il faudrait que j'y applique une fonction qui convertisse tout les "mots" pour un affichage dans le QTextEdit ou QPlainTextEdit ? Faut-il que l'ajout des "0x" se fasse à se moment plutôt qu'avant ?

    En vous remerciant d'avance pour votre aide.

    Edit: J'ai pus régler mon problème de zéro/null en début de fichier/d'affichage en redimensionnant le tableau final à sa taille finale.

    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
    int tailleShellcode = shellcode.size();
       qDebug()<<"Taille final de shellcode: "<< tailleShellcode;
       shellcode.resize(tailleShellcode);
       shellcode.remove(0, 1); //Permet de retirer le premier retour à la ligne du tableau
     
       QDir currDir;
       currDir.setCurrent(QDir::homePath()+"/Documents/");
       QFile finalFile(fileOut);
     
       if(finalFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
       {
           QTextStream fluxOut(&finalFile);
           fluxOut << shellcode;
       }
       finalFile.close();
       return shellcode;
    J'ai également réussi à afficher correctement les caractères "0x".
    Si cela peut aider quelqu'un je poste mon code dans un second post.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 19
    Par défaut
    Le fichier en sortie, affichable au format txt:
    Nom : Capture.PNG
Affichages : 453
Taille : 15,3 Ko

    Le code modifié:


    mainwindows.cpp:
    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
    void MainWindow::on_pushButtonRun_clicked()
    {
        QString filePath = ui->lineEditChoixFile->text();
        QFileInfo infoOriginalPath(filePath);
        QString originalName = infoOriginalPath.baseName();
        QString nameFileOut = ui->lineEditNomOut->text();
        if(filePath == "")
        {
            qDebug() <<"ERREUR: Pas de fichier sélectionner en entrée." << endl;
            return;
        }
        else
        {
            if(nameFileOut == "")
            {
                qDebug()<<"ERREUR: Aucun nom donné au fichier de sortie.";
                qDebug()<<"Ajout automatique d'un nom de sortie par défaut."<<endl;
                ui->lineEditNomOut->setText(originalName+"_shell.txt");
                nameFileOut = originalName+"_shell.txt";
            }
            else if(!nameFileOut.contains(".txt", Qt::CaseSensitive))
            {
                qDebug()<<"ERREUR: Aucune extension n'a été renseignée... Ajout automatique de l'extension.";
                nameFileOut = nameFileOut+".txt";
                ui->lineEditNomOut->setText(nameFileOut);
            }
            QByteArray monShell = shellGen.generer(filePath, nameFileOut);
            ui->plainTextEditShell->appendPlainText(monShell);
        }
    }

    shellgen.cpp:
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    QByteArray ShellGen::generer(QString filePath, QString fileOut)
    {
       qDebug() << "On entre dans la fonction generer...";
       int tailleContent = 0;
       QByteArray content;
       QByteArray shellcode;
     
       QFile openFile(filePath);
       if(openFile.open(QIODevice::ReadOnly))
       {
           qDebug()<<"Méthode generate --> Fichier ouvert: "<<filePath;
           content = openFile.readAll().toHex(); //shellcode etant un QByteArray
           tailleContent = content.size();
           qDebug()<<"La taille de data est: "<<tailleContent;
           for(int elmnt = 0;elmnt < tailleContent; elmnt++)
           {
     
               if(elmnt != 0)
               {
                   qDebug() << "Ajout d'une virgule dans le tableau...";
                   shellcode.append(",");
               }
     
               if((elmnt % 24) == 0)
               {
                   qDebug() << "Ligne de 12 élément fini, retour à la ligne..." << endl;
                   shellcode.append("\n");
               }
               QString indHex = "0x"; //Création d'un QString pour contenir le préfixe "0x"
               QString currElmnt;
               QString nextElmnt;
               currElmnt = content[elmnt];
               qDebug()<< "Affichage de currElmnt:" << currElmnt;
               nextElmnt = content[elmnt+1];
               qDebug()<< "Affichage de nextElmnt:" << nextElmnt;
               QString newElmnt;
               newElmnt = indHex+currElmnt+nextElmnt; //On concatène les trois QString dans celui à ajouter au tableau. L'ancienne méthode "0x" + currElmnt + nextElmnt portant à confusion.
               shellcode.append(newElmnt);
               qDebug() << "Element ajouté dans le tableau: " << newElmnt<< endl;
               elmnt+=1;
     
           }
           qDebug() << "Traitement terminé...";
     
       }
       else
       {
           qDebug() << "ERREUR: Le fichier d'entrée n'a pas put être ouvert !" << endl;
       }
     
       openFile.close();
     
       int tailleShellcode = shellcode.size();
       qDebug()<<"Taille final de shellcode: "<< tailleShellcode;
       shellcode.resize(tailleShellcode); //On redimensionne le tableau final à sa taille final. Cela supprime les caractères NULL
       shellcode.remove(0, 1); //On supprimer le premier retour à la ligne
     
       QDir currDir;
       currDir.setCurrent(QDir::homePath()+"/Documents/");
       QFile finalFile(fileOut);
     
       if(finalFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
       {
           QTextStream fluxOut(&finalFile); //On passe tout le tableau dans le fluxOut en une fois, plutôt que via une boucle élément par élément
           fluxOut << shellcode;
       }
       finalFile.close();
       return shellcode;
    }

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Félicitations !
    Vous avez réglé avant que j'ai eu le temps de regarder en détail . Bien joué !
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [EDI] Quel est l'éditeur que vous recommandez pour PHP ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 400
    Dernier message: 10/04/2018, 20h08
  2. Bon éditeur hexadécimal
    Par tiloup367 dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 14/01/2011, 22h35
  3. Avec quel éditeur concevez-vous vos site web ?
    Par Marc-xhtml dans le forum Outils
    Réponses: 263
    Dernier message: 06/05/2009, 14h43
  4. question sur l'hexadécimal
    Par Adrael dans le forum C
    Réponses: 9
    Dernier message: 12/06/2003, 19h00
  5. Quel éditeur de code "multilanguage" ?
    Par biboun dans le forum Langages de programmation
    Réponses: 12
    Dernier message: 14/11/2002, 11h43

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