Problème lors d'une modification octale en VB.NET [Résolu]

Signaler
Messages postés
3
Date d'inscription
mardi 20 juin 2006
Statut
Membre
Dernière intervention
6 septembre 2007
-
Messages postés
3
Date d'inscription
mardi 20 juin 2006
Statut
Membre
Dernière intervention
6 septembre 2007
-
Salut,

Quand j'essaie de rajouter des "Bytes" à un array qui contient les données d'une application et que j'enregistre mes modifications, le programme ne démarre plus.
Si vous pouviez m'aider, ce serait sympatique, voilà la source :

Public fileContents As Byte() = My.Computer.FileSystem.ReadAllBytes("application.exe")
Public strin As String = ""
Public str_temp As String = ""
Public int321 As Integer = 0

...

Function G_Add(ByVal rech As String, ByVal add As String) As Boolean
        Dim ic As Integer = 0
        Dim ic2 As Integer = 0
        Try
            str_temp = rech 'La/les donnée(s) à rechercher
            strin = ""
            Dim add_length As Integer = add.Length 'La longueur de la variable add
            Dim int As Integer = Array.FindIndex(fileContents, 1653728, AddressOf fn_add) 'L'emplacement des données à rajouter
            Dim fC_temp As Byte() = fileContents ' Je créé un nouvel array qui contiendra les modifications

            Dim calc As Integer = fC_temp.Length + add_length '
            ReDim fC_temp(calc) 'J'agrandis l'array que j'ai créé précédemment avec la longueur des données actuelle de l'application et la longueur des données à rajouter

            While ic + ic2 <= calc
                If ic + ic2 >= int And ic + ic2 <= add_length + int Then 'Si c'est l'emplacement où il faut rajouter les données, on les rajoute
                    Dim byte_temp As Byte = Char.ConvertToUtf32(add, ic2)
                    fC_temp.SetValue(byte_temp, ic + ic2)
                    ic2 += 1
                Else 'Sinon, on écrit la donnée qui est au même emplacement dans l'array de l'application actuelle
                    fC_temp.SetValue(fileContents.GetValue(ic), ic + ic2)
                    ic += 1
                End If

            End While

            fileContents = fC_temp ' On remplace l'array de l'application actuelle par celle de l'application modifiée
            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function

    Function fn_add(ByVal b As Byte) 'Cette fonction est celle qui est chargé de dire si la donnée qui a été transmise via la fonction Array.Find est une des données à modifier. Je l'ai tester avec d'autre fonctions et aucun bugs, mais je vous l'ai rajouter au cas où...
        If Chr(b) = str_temp(int321) Then
            i += 1
            int321 += 1
            strin += Chr(b)
        Else
            strin = ""
            int321 = 0
        End If

        If strin = str_temp Then
            Return True
            int321 = 0
        Else
            Return False
        End If

    End Function

...

'Dans une fonction quelconque

        My.Computer.FileSystem.WriteAllBytes("application.exe", fileContents, False)

Merci d'avance

4 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Que tente-tu de nous faire là! On ne rajoute pas des octets comme ça impunément à une executable (ou tout autre fichier binaire d'ailleurs). Il est évident que ça va planter.

Tu peux éventuellement en remplacer certains (très peu) mais pas en rajouter.

Imagine la gueule du facteur si comme ça du jour au lendemain on rajoutait 3 maisons entre la tienne et celle du voisin, comment il retrouverait les adresses ???
Pour Windows c'est pareil, il va chercher certaines informations à certains endroits dans l'executable. Si tu rajoute des octets n'importe ou, Windows n'étant pas au courant, ira chercher des informations érronées et ton appli plantera. Et tu as de la chance d'etre sous XP, j'imagine, car faire la même chose sous W2000 ou pire sous NT4.0, c'était un moyen assez radical pour planter l'os lui-même.

Donc on ne rajoute pas d'octet dans un fichier binaire. Si tu n'as pas le choix, il te faut absolument en connaitre la structure exacte et donc en corrger ensuite les différentes adresses et pointeurs qui s'y trouve à l'interieur. Ca normalement c'est le boulot du compilateur (plus exactement du linker pour etre precis).

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Tout marche sur des roulettes avec ResHack parce qu'il est capable d'analyser le contenue du fichier, d'en retrouver les différents pointeurs à éventuellement modifier. De plus il se contente de toucher à la partie "Ressource" de l'executable, il ne touche pas au code lui-même (une dll étant considérée comme un executable au niveau du format de fichier).

Si tu veux faire la même chose, il va falloir que tu te rencarde sur le format des executables et que avant de toucher quoique ce soit dans ton fichier, tu analyse sa structure pour localiser les différentes régions.

Fait des recherche sur la norme concernant le format "Portable Executable" appelé aussi format PE.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
3
Date d'inscription
mardi 20 juin 2006
Statut
Membre
Dernière intervention
6 septembre 2007

Salut,

En faite, c'est un dll auquel je veux ajouter des octets. Quand je modifie ses ressources via ResHack, tout marche sur des roulettes, et moi, j'aimerais bien faire comme ResHack. Est-ce possible?

Merci de m'avoir répondu

PS : J'ai déjà réussi à modifier les octets de ce dll avec mon appllicaton via une fonction qui ressemble pas mal à celle-ci.
Messages postés
3
Date d'inscription
mardi 20 juin 2006
Statut
Membre
Dernière intervention
6 septembre 2007

Salut,

Merci de ton aide, je vais rechercher