Modifier un fichier

Modifier un fichier - C - Programmation

Marsh Posté le 26-12-2006 à 22:37:04    

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
Reply

Marsh Posté le 26-12-2006 à 22:37:04   

Reply

Marsh Posté le 26-12-2006 à 22:52:59    

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/
Reply

Marsh Posté le 26-12-2006 à 22:57:34    

merci t'es vraiment le meilleur!

Reply

Marsh Posté le 26-12-2006 à 23:42:09    

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.
Reply

Marsh Posté le 27-12-2006 à 01:22:59    

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
Reply

Marsh Posté le 06-01-2007 à 02:55:21    

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

Reply

Marsh Posté le 06-01-2007 à 02:58:36    

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.

Reply

Marsh Posté le 06-01-2007 à 04:06:07    

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. :)

Reply

Marsh Posté le 06-01-2007 à 09:39:58    

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/
Reply

Marsh Posté le 06-01-2007 à 13:37:15    

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 :)

Reply

Marsh Posté le 06-01-2007 à 13:37:15   

Reply

Marsh Posté le 06-01-2007 à 13:57:11    

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.
Reply

Marsh Posté le 06-01-2007 à 14:15:17    

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/
Reply

Marsh Posté le 06-01-2007 à 14:44:36    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed