Code permettant d'appliquer un patch a une position définie sur un fichier quelconque (Exe, Dll, txt, ETC...)
Le tout en mode console, avec paramètres en ligne de commande.
Source / Exemple :
Imports System.IO
Module Patch
Dim ERREUR As Integer
Dim NombrePositionPatch
Dim ParametrePositionPatch
Dim BitPatch() As Byte
Dim Arguments() As String
Dim Octet As Byte
Sub Main()
ERREUR = 0
GetCommandLineArgs()
If Arguments.Count > 3 Then
If Arguments(3) = "S" Or Arguments(3) = "s" Then
CreationCopieSecurité()
End If
End If
If ERREUR <> 0 Then
Console.ForegroundColor = ConsoleColor.Red
Console.BackgroundColor = ConsoleColor.White
Console.WriteLine("** Une erreur ne permet pas la poursuite du programme ***")
Console.BackgroundColor = ConsoleColor.Black
Else
Patch()
End If
If Arguments.Count > 3 Then
If Arguments(3) = "A" Or Arguments(3) = "a" Then
End
End If
If Arguments.Count > 4 Then
If Arguments(4) = "A" Or Arguments(4) = "a" Then
End
End If
End If
End If
Console.Read()
End Sub
Sub GestErr(ByVal CodeErr As Integer)
Console.ForegroundColor = ConsoleColor.Red
Console.BackgroundColor = ConsoleColor.White
Select Case CodeErr
Case 1
Console.WriteLine("Err sur les parametres")
Console.BackgroundColor = ConsoleColor.Black
Aide()
Case 2
Console.BackgroundColor = ConsoleColor.Black
Console.ForegroundColor = ConsoleColor.Gray
Console.WriteLine()
Console.Write(" │ └─")
Console.ForegroundColor = ConsoleColor.Red
Console.WriteLine("Verifier la presence du fichier a patcher")
Console.ForegroundColor = ConsoleColor.Red
Console.BackgroundColor = ConsoleColor.Yellow
Console.WriteLine(" STOP ")
Console.WriteLine()
Case 3
Console.WriteLine("La position du debut du patch ajouté à la longeur du pach en lui meme")
Console.WriteLine("depassent la taille du fichier")
Console.WriteLine("verifier la position de depart")
Console.WriteLine("et la longeur du patch")
Case 4
Console.BackgroundColor = ConsoleColor.Black
Console.ForegroundColor = ConsoleColor.Gray
Console.Write(" │ └─")
Console.ForegroundColor = ConsoleColor.Red
Console.WriteLine("La longeur du patch doit etre codé sur 2 caracteres (00->FF)")
Console.ForegroundColor = ConsoleColor.Red
Console.BackgroundColor = ConsoleColor.Yellow
Console.WriteLine(" STOP ")
Console.WriteLine()
Case 5
Console.ForegroundColor = ConsoleColor.Red
Console.BackgroundColor = ConsoleColor.Yellow
Console.WriteLine(" STOP ")
Console.WriteLine()
Case 6
Console.BackgroundColor = ConsoleColor.Black
Console.ForegroundColor = ConsoleColor.Red
Console.WriteLine("Le parametre doit etre une valeur DECIMALE")
Console.ForegroundColor = ConsoleColor.Red
Console.BackgroundColor = ConsoleColor.Yellow
Console.WriteLine(" STOP ")
Console.WriteLine()
End Select
Console.BackgroundColor = ConsoleColor.Black
Console.Read()
End
End Sub
Sub Aide()
Console.ForegroundColor = ConsoleColor.Gray
Console.WriteLine("┌─────────────┐")
Console.Write("│")
Console.ForegroundColor = ConsoleColor.Yellow
Console.Write(" AIDE ")
Console.ForegroundColor = ConsoleColor.Gray
Console.WriteLine("│ Patch V1.0 By Tototh09")
Console.WriteLine("└─────────────┘")
Console.WriteLine()
Console.WriteLine(" OBLIGATOIRES OPTIONNELS")
Console.WriteLine(" ┌─────────────┴────────────┐ ┌───┴──┐")
Console.ForegroundColor = ConsoleColor.White
Console.Write(" patch.exe ")
Console.ForegroundColor = ConsoleColor.Green
Console.Write(" toto.bin ")
Console.ForegroundColor = ConsoleColor.Cyan
Console.Write(" 3025 ")
Console.ForegroundColor = ConsoleColor.Magenta
Console.Write(" F5C630F7 ")
Console.ForegroundColor = ConsoleColor.Red
Console.Write(" S ")
Console.ForegroundColor = ConsoleColor.Magenta
Console.WriteLine(" A ")
Console.ForegroundColor = ConsoleColor.Gray
Console.WriteLine(" │ │ │ │ │ │")
Console.WriteLine(" │ │ │ │ │ │")
Console.WriteLine(" │ │ │ │ │ └ Auto (quitte l'appli des que")
Console.WriteLine(" │ │ │ │ │ (le patch est appliqué")
Console.WriteLine(" │ │ │ │ │")
Console.WriteLine(" │ │ │ │ └ Sauvegarde de l'ancien fichier")
Console.WriteLine(" │ │ │ │")
Console.WriteLine(" │ │ │ └ Patch à appliquer")
Console.WriteLine(" │ │ │ Caracteres hexadecimal, sans espaces")
Console.WriteLine(" │ │ │")
Console.WriteLine(" │ │ └ Postion de depart (Decimal)")
Console.WriteLine(" │ │")
Console.WriteLine(" │ └ Fichier à patcher")
Console.WriteLine(" │")
Console.WriteLine(" └ Logiciel")
End Sub
Sub GetCommandLineArgs()
' Declare variables.
Dim PatchEspace As String
Dim separators As String = " "
Dim commands As String = Microsoft.VisualBasic.Interaction.Command()
Dim MonFichierAPatcher As FileInfo
Dim Taille As String
Arguments = commands.Split(separators.ToCharArray)
Dim NbreParams As Integer
NbreParams = Arguments.Count
If NbreParams < 3 Then ' err dans les parametres
GestErr(1)
End If
PatchEspace = ""
For T = 1 To Len(Arguments(2)) + 1 Step 2
PatchEspace = PatchEspace & Mid(Arguments(2), T, 2)
PatchEspace = PatchEspace & " "
Next
Console.ForegroundColor = ConsoleColor.Gray
Console.ForegroundColor = ConsoleColor.Yellow
Console.Write(" Parametres ")
Console.ForegroundColor = ConsoleColor.Gray
Console.WriteLine(" Patch V1.0 By Tototh09")
Console.WriteLine(" │")
Console.ForegroundColor = ConsoleColor.Gray
Console.Write(" ├─Fichier : ")
Console.ForegroundColor = ConsoleColor.Cyan
Console.Write(Arguments(0))
Console.ForegroundColor = ConsoleColor.Gray
Try
MonFichierAPatcher = New FileInfo(Arguments(0))
Taille = MonFichierAPatcher.Length.ToString
Catch
GestErr(2)
Exit Sub
End Try
Console.WriteLine()
Console.Write(" │ ├─Taille ")
Console.ForegroundColor = ConsoleColor.Cyan
Console.Write(Taille)
Console.ForegroundColor = ConsoleColor.Gray
Console.WriteLine(" Octets)")
Console.Write(" │ └─Check ")
If System.IO.File.Exists(Arguments(0)) Then
Console.ForegroundColor = ConsoleColor.Black
Console.BackgroundColor = ConsoleColor.Green
Console.WriteLine(" Fichier OK ")
Else
Console.ForegroundColor = ConsoleColor.Red
Console.BackgroundColor = ConsoleColor.White
Console.WriteLine(" Fichier Inexistant ")
GestErr(2)
End If
Console.BackgroundColor = ConsoleColor.Black
Console.ForegroundColor = ConsoleColor.Gray
Console.Write(" ├─Position : ")
Console.ForegroundColor = ConsoleColor.Cyan
Console.WriteLine(Arguments(1))
Console.ForegroundColor = ConsoleColor.Gray
Console.Write(" │ └─Check ")
Try
If (Arguments(1) / 2) + Len(Arguments(2)) > Taille Then
Console.ForegroundColor = ConsoleColor.Red
Console.BackgroundColor = ConsoleColor.White
Console.WriteLine(" Err (la longeur du patch dépasse celle du fichier)")
GestErr(3)
Else
Console.ForegroundColor = ConsoleColor.Black
Console.BackgroundColor = ConsoleColor.Green
Console.WriteLine(" OK ")
End If
Catch
GestErr(6)
Exit Sub
End Try
Console.BackgroundColor = ConsoleColor.Black
Console.ForegroundColor = ConsoleColor.Gray
Console.Write(" ├─Patch : ")
Console.ForegroundColor = ConsoleColor.Cyan
Console.WriteLine(PatchEspace)
Console.ForegroundColor = ConsoleColor.Gray
Console.Write(" │ ├─Taille ")
If Len(Arguments(2)) Mod 2 <> 0 Then
Console.ForegroundColor = ConsoleColor.Red
Console.BackgroundColor = ConsoleColor.White
Console.WriteLine(" Taille impaire ")
GestErr(4)
Else
Console.ForegroundColor = ConsoleColor.Black
Console.BackgroundColor = ConsoleColor.Green
Console.WriteLine(" Taille OK ")
Console.BackgroundColor = ConsoleColor.Black
Console.ForegroundColor = ConsoleColor.Gray
'Console.Write(" (" & Len(Arguments(2)) / 2)
'Console.WriteLine(" Octets)")
End If
Console.Write(" │ └─Check ")
For T = 1 To Len(Arguments(2)) / 2 + 1 Step 2
Try
Octet = Convert.ToInt32(Mid(Arguments(2), T, 2), 16)
Catch
Console.WriteLine("Conversion impossible (valeur Hexa erronée).")
Console.Write(" │ [")
Console.BackgroundColor = ConsoleColor.Red
Console.ForegroundColor = ConsoleColor.White
Console.Write(Mid(Arguments(2), T, 2))
Console.BackgroundColor = ConsoleColor.Black
Console.ForegroundColor = ConsoleColor.Gray
Console.WriteLine("] n'est pas une valeur HEXADECIMALE.")
GestErr(5)
Exit Sub
End Try
Next
Console.BackgroundColor = ConsoleColor.Black
Console.ForegroundColor = ConsoleColor.Gray
Console.Write(" └─Longeur : ")
Console.ForegroundColor = ConsoleColor.Cyan
Console.Write(Len(Arguments(2)) / 2)
Console.ForegroundColor = ConsoleColor.Gray
Console.WriteLine(" Octets")
Console.ForegroundColor = ConsoleColor.Yellow
Console.WriteLine()
Console.ForegroundColor = ConsoleColor.Gray
End Sub
Private Sub Patch()
If Arguments(2) <> "" Then
If Arguments(1) <> "" Then
Dim PosDebutPatch As Long = Arguments(1)
Dim LongeurPatch As Integer = Len(Arguments(2))
' ----------- Lecture du fichier ------------------------------
Dim FluxLecture As New BinaryReader(File.OpenRead(Arguments(0))) 'on defini l'objet de lecture de fichier
Dim TableauFichier(FileLen(Arguments(0)) - 1) As Byte 'on defini les deux tableaux de bytes de la taille du fichier selectionné
FluxLecture.BaseStream.Seek(0, SeekOrigin.Begin) 'on defini le pointeur en debut de fichier
FluxLecture.Read(TableauFichier, 0, FileLen(Arguments(0))) 'on lit le fichier entier dans le tableau 1
FluxLecture.BaseStream.Flush() 'on libere le buffer
FluxLecture.Close() 'on ferme l'objet
' ----------- Modification -------------------------------------
' = CBPatch.Text
Dim Ptr As Integer
Dim PosAffiche As Long
Dim CurseurAffiche As Integer
Dim PosDeci As Long
Dim PosHexa As String
Dim ChaineAscii As String
Ptr = 1 '--------------------- Affichage des anciennes valeurs
Console.BackgroundColor = ConsoleColor.Blue
Console.ForegroundColor = ConsoleColor.Red
Console.Write("Avant patch")
Console.ForegroundColor = ConsoleColor.White
Console.Write("│")
Console.ForegroundColor = ConsoleColor.Yellow
Console.Write("00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F")
Console.BackgroundColor = ConsoleColor.Black
Console.Write(" ")
Console.BackgroundColor = ConsoleColor.Blue
Console.WriteLine("0123456789ABCDEF")
Console.BackgroundColor = ConsoleColor.Black
Console.ForegroundColor = ConsoleColor.Gray
PosAffiche = Arguments(1)
Do While (PosAffiche > 16)
PosAffiche = PosAffiche - 16
Loop
PosDeci = Arguments(1) - PosAffiche
PosHexa = Hex(PosDeci)
If Len(PosHexa) Mod 2 <> 0 Then ' longeur impaire
PosHexa = "0" & PosHexa
End If
Console.Write(" Ox" & PosHexa)
For T = Len(PosHexa) + 3 To 10
Console.Write(" ")
Next
Console.ForegroundColor = ConsoleColor.White
Console.Write("│")
Console.ForegroundColor = ConsoleColor.Gray
CurseurAffiche = 0
ChaineAscii = ""
For T = 1 To PosAffiche
Console.Write(" ")
ChaineAscii = ChaineAscii & " "
CurseurAffiche = CurseurAffiche + 1
Next
CurseurAffiche = PosAffiche
For T = 0 To ((Len(Arguments(2)) / 2) - 1)
If Len(Hex(TableauFichier(PosDebutPatch + T))) Mod 2 <> 0 Then ' longeur impaire
Console.Write("0")
End If
Console.Write(Hex(TableauFichier(PosDebutPatch + T)) & " ")
' affichage des car ascii
If TableauFichier(PosDebutPatch + T) < 32 Then
ChaineAscii = ChaineAscii & "."
Else
ChaineAscii = ChaineAscii & Chr(TableauFichier(PosDebutPatch + T))
End If
CurseurAffiche = CurseurAffiche + 1
If CurseurAffiche > 15 Then
CurseurAffiche = 0
Console.Write(ChaineAscii)
ChaineAscii = ""
Console.WriteLine()
PosDeci = PosDeci + 16
PosHexa = Hex(PosDeci)
If Len(PosHexa) Mod 2 <> 0 Then ' longeur impaire
PosHexa = "0" & PosHexa
End If
Console.Write(" Ox" & PosHexa)
For TT = Len(PosHexa) + 3 To 10
Console.Write(" ")
Next
Console.ForegroundColor = ConsoleColor.White
Console.Write("│")
Console.ForegroundColor = ConsoleColor.Gray
End If
Next T
If CurseurAffiche < 15 Then
For T = CurseurAffiche To 15
ChaineAscii = " " & ChaineAscii
Next T
End If
Console.Write(ChaineAscii)
'--------------------- Affichage des NOUVELLES valeurs
Console.WriteLine()
Console.WriteLine()
Console.BackgroundColor = ConsoleColor.Green
Console.ForegroundColor = ConsoleColor.Red
Console.Write("Apres patch")
Console.ForegroundColor = ConsoleColor.White
Console.Write("│")
Console.ForegroundColor = ConsoleColor.Black
Console.Write("00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F")
Console.BackgroundColor = ConsoleColor.Black
Console.Write(" ")
Console.BackgroundColor = ConsoleColor.Green
Console.WriteLine("0123456789ABCDEF")
Console.BackgroundColor = ConsoleColor.Black
Console.ForegroundColor = ConsoleColor.Gray
PosAffiche = Arguments(1)
Do While (PosAffiche > 16)
PosAffiche = PosAffiche - 16
Loop
PosDeci = Arguments(1) - PosAffiche
PosHexa = Hex(PosDeci)
If Len(PosHexa) Mod 2 <> 0 Then ' longeur impaire
PosHexa = "0" & PosHexa
End If
Console.Write(" Ox" & PosHexa)
For T = Len(PosHexa) + 3 To 10
Console.Write(" ")
Next
Console.ForegroundColor = ConsoleColor.White
Console.Write("│")
Console.ForegroundColor = ConsoleColor.Gray
CurseurAffiche = 0
ChaineAscii = ""
For T = 1 To PosAffiche
Console.Write(" ")
ChaineAscii = ChaineAscii & " "
CurseurAffiche = CurseurAffiche + 1
Next
For T = 0 To ((Len(Arguments(2)) / 2) - 1)
Console.Write(Mid(Arguments(2), Ptr, 2) & " ")
Octet = Convert.ToInt32(Mid(Arguments(2), Ptr, 2), 16)
' affichage des car ascii
If Octet < 32 Then
ChaineAscii = ChaineAscii & "."
Else
ChaineAscii = ChaineAscii & Chr(Octet)
End If
TableauFichier(PosDebutPatch + T) = Octet
Ptr = Ptr + 2
CurseurAffiche = CurseurAffiche + 1
If CurseurAffiche > 15 Then
CurseurAffiche = 0
'- affiche texte en ascii
Console.Write(ChaineAscii)
ChaineAscii = ""
Console.WriteLine()
PosDeci = PosDeci + 16
PosHexa = Hex(PosDeci)
If Len(PosHexa) Mod 2 <> 0 Then ' longeur impaire
PosHexa = "0" & PosHexa
End If
Console.Write(" Ox" & PosHexa)
For TT = Len(PosHexa) + 3 To 10
Console.Write(" ")
Next
Console.ForegroundColor = ConsoleColor.White
Console.Write("│")
Console.ForegroundColor = ConsoleColor.Gray
End If
Next T
If CurseurAffiche < 15 Then
For T = CurseurAffiche To 15
ChaineAscii = " " & ChaineAscii
Next T
End If
Console.Write(ChaineAscii)
' ----------- Ecriture du fichier ------------------------------
Dim FluxEcriture As New IO.FileStream(Arguments(0), IO.FileMode.OpenOrCreate)
Try
FluxEcriture.Write(TableauFichier, 0, TableauFichier.Length)
Catch ex As Exception
Finally 'pour vb.net 2008 seulement, sinon débrouillez vous pour fermer le fichier! :p
FluxEcriture.Close()
End Try
Else
MsgBox("Aucun patch n'est défini")
Exit Sub
End If
Else
MsgBox("Il faut indiquer une position de debut pour le patch")
Exit Sub
End If
Console.WriteLine()
Console.WriteLine()
Console.ForegroundColor = ConsoleColor.White
Console.WriteLine("Operation terminée")
End Sub
Sub CreationCopieSecurité()
Dim DateHeure As String
DateHeure = My.Computer.Clock.LocalTime.ToString
Dim ExtentionSecours As String = Replace(DateHeure, "/", "_")
ExtentionSecours = Replace(ExtentionSecours, ":", "_")
ExtentionSecours = Replace(ExtentionSecours, " ", "_")
Dim x As FileInfo = New FileInfo(Arguments(0))
x.CopyTo(Arguments(0) & "." & ExtentionSecours)
Console.WriteLine("Sauvegarde du fichier sous " & Arguments(0) & "." & ExtentionSecours)
Console.WriteLine()
End Sub
End Module
Conclusion :
Oblige d'utiliser un éditeur hexadécimal pour modifier un fichier de façon répétitive,
j'ai développé (vite fait) un bout ce code.
Ce programme en mode console, tout simple peut être appelé à partir d'un fichier bat.
exemple de fichier bat pour lancer 4 patch sur le même fichier
-----------------------------------------------------------------------
echo patch
d:\tools\patch D:\Save.adf 25548 007F S a
d:\tools\patch D:\Save.adf 25550 007F a
d:\tools\patch D:\Save.adf 25578 FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F a
d:\tools\patch D:\Save.adf 25642 0A0A0A0A0A0A0A0A0A0A a
-----------------------------------------------------------------------
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.