Ecrire en binaire à un offset précis dans un .exe ou .dll [Résolu]

Signaler
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007
-
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007
-
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

Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
62
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)
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
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.
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

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
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
62
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)
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

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()
}
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
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-
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

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?
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
62
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)
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

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
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

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!