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

Langage C++ Discussion :

Lire un éxécutable en mode binaire.


Sujet :

Langage C++

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut Lire un éxécutable en mode binaire.
    Bonjour les amis,

    Je souhaiterai faire une extraction d'une partie de code, depuis un exécutable , et ce, en c++.

    En fait, je possède un exe , qui contient, deux exe en un.
    Je connais les adresses de début et de fin.

    Je souhaiterai en c++ pouvoir extraire ce "bout de code" de cet exe avec mon adresse de début, et mon adresse de fin, puis en faire un nouvel exécutable.

    On m'a dit de chercher du coté des IfStream....

    J'ai éssayé d'adapter un exemple, mais c'est peu concluant, cela me donne un fichier de 3 octets...

    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
     
     
                 int length;
    	char * buffer;
    	char szExeName[256]; //Buffer qui va contenir le nom du fichier
    	GetModuleFileName (NULL, szExeName, 256);
     
    	ifstream is;
    	is.open (szExeName, ios::binary );
     
    	// get length of file:
    	is.seekg (0, ios::end);
    	length = is.tellg();
    	is.seekg (0, ios::beg);
     
    	// allocate memory:
    	buffer = new char [length];
     
    	// Je me positionne, et je lit
    	is.seekg (0X00000010);
    	is.read(buffer,85010);
    	is.close();
     
    	ofstream objetfichier; 
    	objetfichier.open("monfichier.exe", ios::out); //On ouvrre le fichier en ecriture 
    	if (objetfichier.bad()) //Permet de tester si le fichier s'est ouvert sans probleme 
    	MessageBox("erreur","ok"); 
    	objetfichier <<buffer<<;
    	objetfichier.close(); //On ferme le fichier pour liberer la mémoire 
    	delete[] buffer;

    Mon fichier final Mon Fichier.exe ne fais que 3octets.
    Cela vient aparemment de la lecture, j'ai également changé les fofset de lecture, cela ne change rien, le fichier est mal lu.

    N'y a t-il pas une autre solution de lecture ?
    Sachant que, comme il s'agit d'un exe je dois lire en binaire, et si possible utiliser des adresse sous forme Héxadécimales.

    Merci bcp


    Nixeus'

  2. #2
    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
    Salut,
    Tu as lu en binaire ( ios::binary + read) -> OK
    Tu dois écrire en binaire : ios::binary + write.
    Tu ne peux pas utiliser >> pour dumper un buffer.

    Au passage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char * buffer; -> std::vector<unsigned char> buffer;
    buffer = new char [length]; -> buffer.resize(length);
    is.read(buffer,85010); ->is.read(&buffer[0],85010);
    Et puis pourquoi réserver length octets et n'utiliser que 85010 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    buffer.resize(length);-> buffer.resize(85010);
    ASSERT(length>=85010);

  3. #3
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char* buffer;
    //...
    objetfichier << buffer;
    1) Si tu lui demandes d'écrire un char* dans un fichier, alors il écrit un char* dans un fichier. (et une adresse fait bien trois octets, il me semble)

    2) l'opérateur << n'est utilisable que pour du texte formaté, pour écrire en binaire, il faut utiliser la méthode write(), pendant de la méthode read().

  4. #4
    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 Arzar Voir le message
    1) Si tu lui demandes d'écrire un char* dans un fichier, alors il écrit un char* dans un fichier (une adresse fait bien trois octets, il me semble)
    Tiens. J'aurais juré pour au moins 4

  5. #5
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Euuu, oui c'est bien 4, désolé.
    Mince alors, Nixeus, tu utilises quoi comme système d'exploitation pour avoir des adresses sur 3 octets ?

  6. #6
    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 Arzar Voir le message
    Mince alors, Nixeus, tu utilises quoi comme système d'exploitation pour avoir des adresses sur 3 octets ?
    Le code fourni ne doit pas être le code exact car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objetfichier <<buffer<<;
    ne compile pas

  7. #7
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut
    Bonjour,

    Merci pour vos réponses rapides !
    J'ai utilisé write pour écrire ! haha, et ca fonctionne !

    Comme quoi, à faire du c#, on en perd les notions de bases des char *

    Encore merci !!

Discussions similaires

  1. Réponses: 23
    Dernier message: 12/06/2015, 16h54
  2. Lire une image en mode binaire et l'afficher
    Par regisyves dans le forum ASP.NET
    Réponses: 1
    Dernier message: 05/03/2013, 13h42
  3. ouvrire un file mode binaire pour lire magique number
    Par Alghero dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 27/10/2006, 09h53
  4. Accéder au contenu d'un fichier via une URL en mode binaire
    Par sbelli dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 11/10/2005, 10h25
  5. Réponses: 5
    Dernier message: 11/12/2002, 12h31

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