Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1065 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Modifier un fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Modifier un fichier

n°1496143
Wolfi-
Posté le 26-12-2006 à 22:37:04  profilanswer
 

Bon voila j'ai un probleme, je voudrais faire un programme qui modifie un fichier exe a un certain offset hexadécimal mais lorsque je fais cela :
 
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int n;
    FILE *fichier = NULL;
     
     
    fichier = fopen("blahblah.exe","r" );
     
    if (fichier != NULL)
    {
         
    fseek(fichier,9256L,SEEK_SET); //on se met a l'offset a modifier
     fputc(0xCD,fichier); //on ecrit "CD"
     
    }
     
    else
    {
        // On affiche un message d'erreur si on veut
        printf("Impossible d'ouvrir le fichier blahblah.exe\n" );
    }
     
    return 0;
}
 
ca efface tout et ça met "CD" seulement (mais au bon offset ...), tout le fichier est vidé. Quelle serait la solution? J'ai beau chercher je ne trouve pas.

Message cité 1 fois
Message édité par Wolfi- le 26-12-2006 à 22:58:19
mood
Publicité
Posté le 26-12-2006 à 22:37:04  profilanswer
 

n°1496145
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-12-2006 à 22:52:59  profilanswer
 

Wolfi- a écrit :

Bon voila j'ai un probleme, je voudrais faire un programme qui modifie un fichier exe a un certain offset :

Code :
  1. fichier = fopen("popstation.exe","r" );




C'est pas "r", c'est "r+b", et c'est pas sûr que ça fonctionne avec tous les systèmes (sous Windows, je ne crois pas que ça fonctionne). Ca sent la tentative de cracking, non ?

Message cité 1 fois
Message édité par Emmanuel Delahaye le 26-12-2006 à 22:57:30

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1496146
Wolfi-
Posté le 26-12-2006 à 22:57:34  profilanswer
 

merci t'es vraiment le meilleur!

n°1496162
Sve@r
Posté le 26-12-2006 à 23:42:09  profilanswer
 

Emmanuel Delahaye a écrit :

sous Windows, je ne crois pas que ça fonctionne


Sisi, fopen() est normalisé donc Windows accepte "r+" et aussi "b" (que je ne connaissais d'ailleurs pas avant de me mettre à programmer sous zindoz)

Emmanuel Delahaye a écrit :

Ca sent la tentative de cracking, non ?


Délit d'intention...  ;)


Message édité par Sve@r le 26-12-2006 à 23:51:31

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1496174
Wolfi-
Posté le 27-12-2006 à 01:22:59  profilanswer
 

Pas du tout popstation est un programme qui cree des eboot psp contenant un iso de PSX pour l'emulateur de SONY. Or ce logiciel est mal foutu, car il nomme tous les jeux de la meme facon, et ne permet qu'une sauvegarde pour tout les jeux. En le modifiant, on peut remedier a ce probleme. Je pense qu'un solution sera rlz par le programmeur, mais pour l'instant, cette solution aide enormément! PS: j'ai d'ailleurs réussi a faire un programme parfait merci encore :)


Message édité par Wolfi- le 27-12-2006 à 01:25:18
n°1499664
turntablx
Posté le 06-01-2007 à 02:55:21  profilanswer
 

ah ouai on peu modifier un exe comme ca?  
ya pas besoin d'utiliser un librerie spéciale ou utiliser des api windows? c'est plutot sympa si c aussi rapide

n°1499665
IrmatDen
Posté le 06-01-2007 à 02:58:36  profilanswer
 

Non, y'a besoin de rien de spécial, mais c'est pas si facile que ça a en a l'air: faut déjà commencer par trouver quoi modifier où comment pour faire ce que tu veux.

n°1499669
anordem
Posté le 06-01-2007 à 04:06:07  profilanswer
 

turntablx a écrit :

ah ouai on peu modifier un exe comme ca?  
ya pas besoin d'utiliser un librerie spéciale ou utiliser des api windows? c'est plutot sympa si c aussi rapide


 
Un exécutable est, comme tout fichier, une suite structurée de bits. A partir du moment où on sait comment est construite la structure, il est très facile de la modifier, que ce soit un .exe ou un .bmp.
 
Dans le cas d'un exécutable, la structure contient le code (C, basic, pascal, etc.) traduit en assembleur (c'est à dire compilé). Ces instructions assembleur possèdent une valeur codée sur 1 ou plusieurs octets et en modifiant ces octets, on peut facilement modifier le fonctionnement d'un programme.
 
Exemple (toutes les valeurs sont en hexadécimal) :  
 

Code :
  1. strncpy(Path, lpszArgument, MAX_PATH);


pourra être compilé de cette façon :  


PUSH    104                          ; /maxlen = 104 (260.)
PUSH    DWORD PTR [EBP+10]           ; |src
PUSH    EBX                          ; |dest
CALL    00401CF0                     ; \strncpy


et codé dans le fichier sous cette forme :


68 04 01 00 00  
FF 75 10  
53  
E8 8E 08 00 00


 
En modifiant ces opcodes, on peut donc modifier le programme. Et pour savoir où modifier, il faut parcourir la structure du fichier, comme pour n'importe quel autre type de fichier. :)

n°1499677
Emmanuel D​elahaye
C is a sharp tool
Posté le 06-01-2007 à 09:39:58  profilanswer
 

anordem a écrit :

Un exécutable est, comme tout fichier, une suite structurée de bits.


d'octets... Certes, chaque octet est composé de 8 bits, mais indivisibles. L'unité atomique est l'octet.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1499733
turntablx
Posté le 06-01-2007 à 13:37:15  profilanswer
 

Code :
  1. PUSH    104                          ; /maxlen = 104 (260.)
  2. PUSH    DWORD PTR [EBP+10]           ; |src
  3. PUSH    EBX                          ; |dest
  4. CALL    00401CF0                     ; \strncpy


donc les parametres sont situés avant l'appel de la fonction si je comprend bien et du dernier au premier. ca à l'air tordu l'assembleur, heureusement qu'il y a des compilateurs dans ce cas :)

mood
Publicité
Posté le 06-01-2007 à 13:37:15  profilanswer
 

n°1499737
Sve@r
Posté le 06-01-2007 à 13:57:11  profilanswer
 

turntablx a écrit :

Code :
  1. PUSH    104                          ; /maxlen = 104 (260.)
  2. PUSH    DWORD PTR [EBP+10]           ; |src
  3. PUSH    EBX                          ; |dest
  4. CALL    00401CF0                     ; \strncpy


donc les parametres sont situés avant l'appel de la fonction si je comprend bien


Normal, il faut commencer par identifier les paramètres et les placer qq part avant d'appeler la fonction qui va les utiliser...
 

turntablx a écrit :

et du dernier au premier.


une décision comme une autre...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1499742
Emmanuel D​elahaye
C is a sharp tool
Posté le 06-01-2007 à 14:15:17  profilanswer
 

turntablx a écrit :

Code :
  1. PUSH    104                          ; /maxlen = 104 (260.)
  2. PUSH    DWORD PTR [EBP+10]           ; |src
  3. PUSH    EBX                          ; |dest
  4. CALL    00401CF0                     ; \strncpy


donc les parametres sont situés avant l'appel de la fonction si je comprend bien et du dernier au premier. ca à l'air tordu l'assembleur, heureusement qu'il y a des compilateurs dans ce cas :)


C'est pas tordu. C'est une convention d'appel, c'est tout. Il y en a d'autres... L'assembleur de base comme ça, c'est simple...


   push param
   push param
   call fonction


rien de compliqué...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1499749
anordem
Posté le 06-01-2007 à 14:44:36  profilanswer
 

Emmanuel Delahaye a écrit :

d'octets... Certes, chaque octet est composé de 8 bits, mais indivisibles. L'unité atomique est l'octet.


Effectivement. :jap:  
 

turntablx a écrit :


donc les parametres sont situés avant l'appel de la fonction si je comprend bien et du dernier au premier. ca à l'air tordu l'assembleur, heureusement qu'il y a des compilateurs dans ce cas :)


Oui dans cette exemple, mais la compilation aurait pu donner d'autres instructions. Cela dépend, effectivement de la convention d'appel, mais aussi du compilateur et des options de compilation.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Modifier un fichier

 

Sujets relatifs
VBS - Ouvrir et modifier un fichier TXTAfficher et modifier un fichier XML en VBScript
modifier chemin du fichier racine (index.php)Récupérer puis modifier des infos depuis un fichier texte
[JExcelAPI] Modifier un fichier excel[Delphi] Modifier dans un fichier txt
batch: pb pour modifier fichier et ecrire dans un fichierModifier les données d'un fichier.
Modifier fichier texteBatch windows - Supprimer/modifier une ligne d'un fichier
Plus de sujets relatifs à : Modifier un fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR