Ecrire en binaire à un offset précis dans un .exe ou .dll

Résolu
clubberzZ
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007
- 5 juin 2007 à 12:55
clubberzZ
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007
- 11 juin 2007 à 11:49
Bonjour à tous,

J'aimerais transfomer ce code vb.net en c# mais je ne trouve aucune alternative (désolé je suis débutant).
Merci d'avance pour vos réponses.

Voici le code en question :

Private
Sub btnModif_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles btnModif.Click

Dim f As Integer f = FreeFile()
 FileOpen(f, path, OpenMode.Binary)
FilePut(f, Chr(182), CInt("&H" & "1897EF") + 1)
FileClose(f)

End Sub

10 réponses

SharpMao
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
67
7 juin 2007 à 07:45
Alors, pour ta première question, la réponse est oui.
Tu peux même écrire directement plusieurs bytes contigus:

byte[] toWrite = new byte[]{0x33,0xC0};
bw.Write(toWrite);

Pour la 2ème question, ce n'est pas difficile d'essayer, comme le compilateur ne réclamme ni 0xC0, ni avec 0xc0, on peut en déduire que la case importe peu.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
3
cs_Willi
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
5 juin 2007 à 19:07
Bonsoir,

FileOpen => System.IO.FileStream
FilePut => System.IO.StreamWriter

Avec les nombreux cas d'utilisations donnés dans les liens tu devrais t'en sortir.
0
clubberzZ
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

5 juin 2007 à 20:23
Bonsoir, merci pour cette réponse (qui j'en suis sur va m'apprendre beaucoup).

Cela reste vraiment très flou pour moi, est-ce que quelqu'un serait prêt à m'aider pour mettre ce code en c# avec des explications?
Merci
0
SharpMao
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
67
6 juin 2007 à 08:01
Hello,

J'avais fait il y a quelques temps un éditeur hexadécimal.

En gros pour écrire, tu as un FileStream et un BinaryWriter

FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Write);
BinaryWriter bw = new BinaryWriter(fs);

fs.Seek(Position, SeekOrigin.Begin);
bw.Write(byteValue);

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
clubberzZ
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

6 juin 2007 à 11:56
Bonjour et merci pour vos réponse!

J'ai essayé ceci mais une erreur apparait à la compilation :

using System.IO

private void btnModif_Click (sender object, EventArgs e)
{
string path = "C:\LeCheminDeMonApplication.exe";


FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Write);
BinaryWriter bw = new BinaryWriter(fs);


fs.Seek(1897F0, SeekOrigin.Begin);
bw.Write(B6);


bw.close();
fs.close()
}
0
cs_Bidou
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
6 juin 2007 à 12:31
Salut,
Voici quelques corrections:

- Le path doit être précédé par un @ pour évité l'interprétation du caractère d'échappement.
- La fonction Seek prend un long comme premier argument.
- Il manque un ';' lors du close sur le FileStream
- Les méthodes close prennent des majuscules.
- ...

<hr />
-Blog-
0
clubberzZ
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

6 juin 2007 à 13:12
using System.IO

private void btnModif_Click (sender object, EventArgs e)
{
string path = "C:\\LeCheminDeMonApplication.exe";
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Write);
BinaryWriter bw = new BinaryWriter(fs);

fs.Seek(1897F0, SeekOrigin.Begin);
bw.Write(B6);

bw.Close();
fs.Close();
}

Merci j'avais effectivement corrigé tout cela sur mon projet, il me reste une erreur qui est celle de la fonction Seek (la fonction seek possèdes des arguments non valides), je pense que ma syntaxe pour la fonction Write n'est pas bonne non plus (byteValue), si quelqu'un connait la solution?
0
SharpMao
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
67
6 juin 2007 à 13:29
Essaie avec ça :

fs.Seek(0x1897F0, SeekOrigin.Begin);
bw.Write(0xB6);

Tu ne peux pas écrire directement des nombre hexadécimaux, tu dois les précéder de 0x pour qu'il comprenne.
Sinon, il n'aurait aucun moyen de différencier 0x10 et 10.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
0
clubberzZ
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

6 juin 2007 à 16:38
Effectivement ca à l'air de fonctionner parfaitement, tous mes remerciements SharpMao!

J'aurais deux dernières petites questions :
 
1 - Est-il possible d'écrire plusieurs valeurs à la suite, je m'éxplique :

Avant mon code était :

FileOpen(f, path, OpenMode.Binary)
FilePut(f, Chr(51), CInt("&H" & "1897EF") + 1)
FilePut(f, Chr(192), CInt("&H" & "1897EF") + 2)
FileClose(f)

Maintenant cela est-il possible en ouvrant et fermant le fichier qu'à la fin?

// ...
fs.Seek(0x1897F0, SeekOrigin.Begin);
bw.Write(0x33);
fs.Seek(0x1897F0, SeekOrigin.Begin);
bw.Write(0xC0);

bw.Close();
fs.Close();

2 - Dans la fonction "bw.Write(0xC0);" la valeur Byte s'écrit-elle en majuscule ou minuscule? Le "C" ici en l'occurence.

Merci
0
clubberzZ
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

11 juin 2007 à 11:49
Bonjour à tous, je me permets de reposter dans ce sujet qui est totalement le même...

J'ai eu un problème concernant cette méthode avec le code sivant :

fs.Seek(0x1897F0, SeekOrigin.Begin);
byte[] toWrite = new byte[]{0x33,0xC0, 0xC0, 0xC0 };
bw.Write(toWrite);
fs.Seek(0x1897F9, SeekOrigin.Begin);
bw.Write(0xC0);

Quand je regarde avec un editeur héxadécimale à l'offset 1897F9 j'obtient bien le C0 à cet emplacement mais il m'affiche trois 00 00 00 après! Reprend il le nombre de byte dans la chaine toWrite? Je trouve cela très bizard. Merci d'avance!
0