erwansims
Messages postés3Date d'inscriptionmardi 20 juin 2006StatutMembreDernière intervention 6 septembre 2007
-
5 sept. 2007 à 17:43
erwansims
Messages postés3Date d'inscriptionmardi 20 juin 2006StatutMembreDernière intervention 6 septembre 2007
-
6 sept. 2007 à 19:53
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
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 5 sept. 2007 à 19:19
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).
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 5 sept. 2007 à 20:59
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.
erwansims
Messages postés3Date d'inscriptionmardi 20 juin 2006StatutMembreDernière intervention 6 septembre 2007 5 sept. 2007 à 19:48
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.