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 69
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 1
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 69
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 1
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 61
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 1
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 69
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 1
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 1
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
Rejoignez-nous