Modifier un fichier - C - Programmation
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 :
|
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 ?
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...
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
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
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.
Marsh Posté le 06-01-2007 à 04:06:07
turntablx a écrit : ah ouai on peu modifier un exe comme ca? |
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 :
|
pourra être compilé de cette façon :
|
et codé dans le fichier sous cette forme :
|
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.
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.
Marsh Posté le 06-01-2007 à 13:37:15
Code :
|
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
Marsh Posté le 06-01-2007 à 13:57:11
turntablx a écrit :
|
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...
Marsh Posté le 06-01-2007 à 14:15:17
turntablx a écrit :
|
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...
|
rien de compliqué...
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.
turntablx a écrit : |
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.
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 édité par Wolfi- le 26-12-2006 à 22:58:19