Bonjour à tous,
Je souhaite faire un petit programme permettant de patcher un fichier EXE en mode binaire. Le programme consiste à remplacer une section de code en plein milieu d'un exécutable.
Le fonctionnement est assez simple.
1) Je crée un nouveau fichier vide, je lis les x premiers bytes de mon fichier EXE, je les écris dans mon nouveau fichiers.
2) Je lis ensuite la totalité d'un fichier binaire que j'écris à la suite de mon nouveau fichier. ( il s'agit du nouveau code à patcher).
3) Enfin, dernière étape, je lis la "fin" du fichier, et je la réécris à la fin de mon nouveau fichier.
Ai-je déjà bien expliqué la chose ?
Mon problème se situe à la troisième étape :
Mon fichier EXE fait une taille de : 11 248 640 bytes
La première section que j'écris dans le nouveau fichier est de : 2 523 936 bytes
La seconde section correspond au patch que j'écris est de : 3 991 822 bytes
la troisième partie ( fin du fichier à écrire ) est de :
Taille totale du fichier - (Code de début + Code à patcher)
11 248 640 - (2 523 936 + 3 991 822) = 4 732 882
Je vais donc devoir écrire 4 732 882 bytes
Pour ré-écrire donc la fin, j'utilise la méthode :
binaryreader.read(tableau de byte d'un taille de 4 732 882 bytes,(2 523 936 + 3 991 822), 4 732 882)
Mon problème est que ce "read" provoque une exception :
J'ai débuggé, tourné dans mon code,etc... je bloque vraiment.Interception de System.ArgumentException
Message=L'offset et la longueur étaient hors limites pour ce tableau ou bien le nombre est supérieur au nombre d'éléments de l'index à la fin de la collection source.
Source=mscorlib
StackTrace:
à System.IO.BinaryReader.Read(Byte[] buffer, Int32 index, Int32 count)
à PatcherFichier.Form1.button1_Click(Object sender, EventArgs e) dans c:\users\XXXXX\documents\visual studio 2010\Projects\PatcherFichier\PatcherFichier\Form1.cs:ligne 51
InnerException:
je me permet d'uploader mon petit projet de Test Visual Studio, si quelqu'un pouvait me débloquer ou me donner des pistes, ce serait fort appréciable
http://dl.free.fr/nOMs8yUny
N'hésitez pas pour toutes questions
Cordialement,
Nixeus
Partager