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:
Le code:
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 #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
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
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.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 #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
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; }
Partager