Comment modifier des octets dans un fichier EXE ?

tomy - 31 oct. 2000 à 22:18
surfzoid Messages postés 463 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 21 avril 2010 - 7 janv. 2004 à 13:21
Salut !!
Je cherche le moyen de pouvoir modifier des octets dans un fichier EXE a une adresse precise.
(du genre patcheur créé en VB6)
merci.

4 réponses

Il faut traiter le fichier Exe comme un fichier binaire. Là, il est possible de le lire et de ré-écrire (dans un autre, puis renommer etc...) octets par octets...

Dim MyLocation, MyLine
' Ouvre le fichier qui vient d'être créé.

En lecture :

Open "FICHTEST" For Binary As #1
' Effectue la boucle jusqu'à la fin du fichier.
Do While MyLocation < LOF(1)
' Lit le caractère dans la variable.
MyLine = MyLine & Input(1, #1)
' Lit la position en cours dans le fichier.
MyLocation = Loc(1)
' Affiche dans la fenêtre Exécution.
Debug.Print MyLine; Tab; MyLocation
Loop
Close #1 ' Ferme le fichier.

Amitiés - renaud -
0
Bien,

Chose promise, chose bue....

Voilà un bout de code permettant de changer une chaine de caractères par une autre dans un fichier Exe (ou tout autre fichier d'ailleurs). les deux chaînes, qui doivent être de longueur égale (sinon bonjour les dégats dans l'Exe !!!) peuvent être définies en Hexa ou en caractères alpha. Dans le premier cas (exploité dans l'exemple), il faudra les convertir (début de fonction incluse dans le code).

Le code fonctionne dans une simple Form comportant deux boutons, cmdFin, qui fait rien qu'à quitter l'exemple, et cmdRemplacerChaine, qui définit les paramètres en entrée (fichiers, chaines, etc...) et appelle la fonction de conversion hexa-Char puis la fonction de ré-écriture du fichier après modification...

Si tu ne t'en tires pas avec ça :

1 - Je peux t'envoyer le source complet, avec l'interface (la Form)...
2 - Excuses-moi, mais t'es une buse (Joke...) !!!

REMARQUE IMPORTANTE : Le code a été testé avec un petit exécutable (104 Ko) écrit (par bibi) en C++, et ca marche... A savoir que l'Exe résultant (Test2.exe dans l'exemple) est bien généré, avec les bonnes modifications et tout et tout, et qu'il fonctionne... Cependant, le programme VB ci dessous est un peu (très ?) con et remplace la première chaîne trouvée. Si celle-ci se trouve dans le code actif de l'Exe source (très possible avec des chaînes à remplacer décrites en Hexa), le fonctionnement du fichier cible n'est pas (du tout) garanti. ATTENTION DONC AU FICHIER AUQUEL TU VAS FAIRE SUBIR LES DERNIERS OUTRAGES !!!

************
The code...
************

Option Explicit
Private Function fctChangerExe(ByVal pstrExeSource As String, _
ByVal pstrExeCible As String, ByVal pstrChaineCherchee As String, _
ByVal pstrChaineRemplacante As String) As Boolean

Dim strExeCible As String, intNoFic As Integer, lngLenSourceFile As Long
Dim intLongueurChaine As Integer, lngPosTrouvee As Long
Dim strTamponLecture As String, strTamponEcriture As String
' les tampons étant déclarés en string de longueur variable, ça doit faire des
'tailles maximales d'Exe pouvant être traités de deux Gigas... Attention à la mémoire !

On Error GoTo Erreur

'petits controles
fctChangerExe = False
If Dir(pstrExeSource) = "" Then
Err.Raise vbObjectError + 1000, "fctChangerExe", "Fichier non trouvé"
Exit Function
End If
If Len(pstrChaineCherchee) <> Len(pstrChaineRemplacante) Then
Err.Raise vbObjectError + 1001, "fctChangerExe", "Longueurs des chaines cherchées et à substituer différentes"
Exit Function
End If
If Len(pstrChaineCherchee) = 0 Then
Err.Raise vbObjectError + 1002, "fctChangerExe", "Longueur des chaînes traitées nulle"
Exit Function
End If
If pstrExeCible = "" Then
Err.Raise vbObjectError + 1003, "fctChangerExe", "Fichier cible non renseigné"
Exit Function
End If
If Dir(pstrExeCible) <> "" Then
Err.Raise vbObjectError + 1004, "fctChangerExe", "Fichier cible existant"
Exit Function
End If

'on attaque !!!

' Ah que je lis le fichier en entrée
intNoFic = FreeFile
Open pstrExeSource For Binary Access Read As #intNoFic
lngLenSourceFile = LOF(intNoFic)
strTamponLecture = String(lngLenSourceFile, Chr(0))
Get #intNoFic, , strTamponLecture
Close #intNoFic
' Ah que c'etait bien, la lecture

' seule la première occurence trouvée est remplacée... on peut cependant faire une boucle
' on peut tester (variable lngPosTrouvee) l'adresse pour modifier une occurence précise
' ou s'y déplacer (Voir la syntaxe de l'instruction Get)
' début de boucle éventuelle (suis trop feignant pour le faire) !!!
lngPosTrouvee = InStr(strTamponLecture, pstrChaineCherchee)
If lngPosTrouvee > 0 Then
' Ha que j'ai trouvé kekchôse ?
intNoFic = FreeFile
' fô korijer les phottes...
strTamponEcriture = Left$(strTamponLecture, lngPosTrouvee - 1)
strTamponEcriture = strTamponEcriture & pstrChaineRemplacante
strTamponEcriture = strTamponEcriture & Mid$(strTamponLecture, lngPosTrouvee + Len(pstrChaineCherchee))
' fin de boucle éventuelle !!!

' Ha que où il est le stylo pour écrire ?
Open pstrExeCible For Binary Access Write As #intNoFic
Put #intNoFic, , strTamponEcriture
Close #intNoFic
fctChangerExe = True
' Maintenant, c'est l'heure de la sieste....
Else
Err.Raise vbObjectError + 1005, "fctChangerExe", "Chaîne cherchée non trouvée"
End If
Exit Function
Erreur:
MsgBox "Erreur dans la fonction cmdRemplacerChaine : " & Err.Description & " dans " & Err.Source, vbOKOnly, Me.Caption
End Function

Private Sub cmdFin_Click()
Unload Me
End Sub

Private Sub cmdRemplacerChaine_Click()
Dim strExeSource As String, strExeCible As String, strChaineCherchee As String
Dim strChaineRemplacante As String
On Error GoTo Erreur
' a remplacer par les 'bonnes' valeurs !
strExeSource = App.Path & "" & "test.exe"
strExeCible = App.Path & "" & "test2.exe"

' si je cherche la valeur hexa '54|4F|54|4F' (TOTO) pour la changer en '54|55|54|55' (TUTU)
', il faut les convertir en chaine Ascii soit :
'(il faut controler avant que ca ressemble à de l'hexa, débrouilles-toi !!!

' a remplacer par les 'bonnes' valeurs !
strChaineCherchee = fctConvertirHexaChar("544F544F")
strChaineRemplacante = fctConvertirHexaChar("54555455")

If fctChangerExe(strExeSource, strExeCible, strChaineCherchee, strChaineRemplacante) = True Then
MsgBox "Success", , Me.Caption
End If
Exit Sub
Erreur:
MsgBox "Erreur dans la fonction cmdRemplacerChaine : " & Err.Description & " dans " & Err.Source
End Sub

Private Function fctConvertirHexaChar(pstrChaineHexa As String) As String
Dim intBoucle As Integer, strChar As String
fctConvertirHexaChar = ""

' tout petit controle.... le contenu de strChar n'étant pas forcément hexadécimal
If (Len(pstrChaineHexa) Mod 2) <> 0 Then
Err.Raise vbObjectError + 1006, "fctConvertirHexaChar", "format Hexadécimal erroné"
Exit Function
End If

For intBoucle = 1 To Len(pstrChaineHexa) Step 2
strChar = Mid$(pstrChaineHexa, intBoucle, 2)
fctConvertirHexaChar = fctConvertirHexaChar & Chr(Val("&h" & strChar))
Next intBoucle
End Function

************
End of 'The code...
************

Amitiés - Renaud -
0
mouais...
sauf qu'un patcher ne remplace pas N'IMPORTE QUEL OCTET il faut connaitre son emplacement donc
open 'fich$' for binary as #1
put #1,'position de l'octet','octet'
close #1
salut..
0
surfzoid Messages postés 463 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 21 avril 2010
7 janv. 2004 à 13:21
0
Rejoignez-nous