Patcheur de fichier

Description

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("  &#9474;            &#9492;&#9472;")
                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("  &#9474;            &#9492;&#9472;")
                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("&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;")
        Console.Write("&#9474;")
        Console.ForegroundColor = ConsoleColor.Yellow
        Console.Write("    AIDE     ")
        Console.ForegroundColor = ConsoleColor.Gray
        Console.WriteLine("&#9474;                                       Patch V1.0 By Tototh09")
        Console.WriteLine("&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;")
        Console.WriteLine()
        Console.WriteLine("                     OBLIGATOIRES        OPTIONNELS")
        Console.WriteLine("            &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488; &#9484;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9488;")
        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("       &#9474;        &#9474;        &#9474;        &#9474;       &#9474;    &#9474;")
        Console.WriteLine("       &#9474;        &#9474;        &#9474;        &#9474;       &#9474;    &#9474;")
        Console.WriteLine("       &#9474;        &#9474;        &#9474;        &#9474;       &#9474;    &#9492; Auto (quitte l'appli des que")
        Console.WriteLine("       &#9474;        &#9474;        &#9474;        &#9474;       &#9474;           (le patch est appliqué")
        Console.WriteLine("       &#9474;        &#9474;        &#9474;        &#9474;       &#9474;")
        Console.WriteLine("       &#9474;        &#9474;        &#9474;        &#9474;       &#9492; Sauvegarde de l'ancien fichier")
        Console.WriteLine("       &#9474;        &#9474;        &#9474;        &#9474;")
        Console.WriteLine("       &#9474;        &#9474;        &#9474;        &#9492; Patch à appliquer")
        Console.WriteLine("       &#9474;        &#9474;        &#9474;          Caracteres hexadecimal, sans espaces")
        Console.WriteLine("       &#9474;        &#9474;        &#9474;")
        Console.WriteLine("       &#9474;        &#9474;        &#9492; Postion de depart (Decimal)")
        Console.WriteLine("       &#9474;        &#9474;")
        Console.WriteLine("       &#9474;        &#9492; Fichier à patcher")
        Console.WriteLine("       &#9474;")
        Console.WriteLine("       &#9492; 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("  &#9474;")
        Console.ForegroundColor = ConsoleColor.Gray
        Console.Write("  &#9500;&#9472;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("  &#9474;            &#9500;&#9472;Taille ")
        Console.ForegroundColor = ConsoleColor.Cyan
        Console.Write(Taille)
        Console.ForegroundColor = ConsoleColor.Gray
        Console.WriteLine(" Octets)")
        Console.Write("  &#9474;            &#9492;&#9472;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("  &#9500;&#9472;Position : ")
        Console.ForegroundColor = ConsoleColor.Cyan
        Console.WriteLine(Arguments(1))
        Console.ForegroundColor = ConsoleColor.Gray
        Console.Write("  &#9474;            &#9492;&#9472;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("  &#9500;&#9472;Patch    : ")
        Console.ForegroundColor = ConsoleColor.Cyan
        Console.WriteLine(PatchEspace)
        Console.ForegroundColor = ConsoleColor.Gray
        Console.Write("  &#9474;            &#9500;&#9472;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("  &#9474;            &#9492;&#9472;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("  &#9474;                    [")
                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("  &#9492;&#9472;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("&#9474;")
                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("&#9474;")
                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("&#9474;")
                        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("&#9474;")
                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("&#9474;")
                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("&#9474;")
                        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
-----------------------------------------------------------------------

Codes Sources

A voir également

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.