[R] Remplacer plusieurs occurrences sous AutoIt avec "_BinaryReplace"

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Boulanza
Niveau 9
Niveau 9
Messages : 697
Enregistré le : mer. 31 juil. 2013 15:49
Status : Hors ligne

[R] Remplacer plusieurs occurrences sous AutoIt avec "_BinaryReplace"

#1

Message par Boulanza »

Bonjour,
Ma question est celle posé dans le lien :
https://www.autoitscript.com/forum/topi ... -a-binary/
L’exemple du lien ci-dessus : « _BinaryReplace » ne semble pas pouvoir gérer le gros blob binaire (fichier), pouvez-vous m’aider à le rectifier pour qu’il remplace tous les occurrences du fichier à modifier sous AutoIt avec « _BinaryReplace »?
Je compte sur votre collaboration. Merci.

Code : Tout sélectionner

$sInFile = @SystemDir & "\dhcpcsvc.dll" ; Original in file
$sFind = "4D53465420352E30" ; MSFT 5.0 Original hex to find
$sReplace = "534D4153484C5921" ; SMASHLY! New hex to replace
$sOutFile = @ScriptDir & "\New_dhcpcsvc.dll" ; New edited out file

_BinaryReplace($sInFile, $sFind, $sReplace, $sOutFile)

Func _BinaryReplace($sInFile, $sFind, $sReplace, $sOutFile)
    Local $FO, $FR
    $FO = FileOpen($sInFile, 16) ; Open the file in binary read mode
    $FR = FileRead($FO) ; Read the opened file into a variable
    FileClose($FO) ; Close the opened file now we've read it
    $FR = StringReplace($FR, $sFind, $sReplace, 1); find and replace the hex string
    $FO = FileOpen($sOutFile, 18) ; Open a new empty file in binary write mode
    FileWrite($FO, $FR) ; Write the data to the new opened file 
    FileClose($FO) ; Close the newly created file.
EndFunc
Modifié en dernier par Boulanza le lun. 17 août 2020 21:21, modifié 2 fois.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Remplacer plusieurs occurrences sous AutoIt avec "_ReplaceStringInFile"

#2

Message par mikell »

StringReplace($FR, $sFind, $sReplace, 1) => remplace 1 occurence
StringReplace($FR, $sFind, $sReplace) => remplace toutes les occurences

La fonction _ReplaceStringInFile() n'est pas adaptée car n'ouvre pas le fichier en mode lecture binaire
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Boulanza
Niveau 9
Niveau 9
Messages : 697
Enregistré le : mer. 31 juil. 2013 15:49
Status : Hors ligne

Re: [..] Remplacer plusieurs occurrences sous AutoIt avec "_ReplaceStringInFile"

#3

Message par Boulanza »

Bonjour Mikell,
StringReplace($FR, $sFind, $sReplace) => ne remplace pas les occurrences si vous supprimez (1). Si vous gardez StringReplace($FR, $sFind, $sReplace, 1) => remplace 16 occurrences et non 1 occurrence.
Boulanza
Niveau 9
Niveau 9
Messages : 697
Enregistré le : mer. 31 juil. 2013 15:49
Status : Hors ligne

Re: [..] Remplacer plusieurs occurrences sous AutoIt avec "_BinaryReplace"

#4

Message par Boulanza »

Bonjour,
Pour mikell;
D'après l’exemple, c'est la fonction "_BinaryReplace($sInFile, $sFind, $sReplace, $sOutFile)" qui ouvre le fichier en mode lecture binaire ! ?
Boulanza
Niveau 9
Niveau 9
Messages : 697
Enregistré le : mer. 31 juil. 2013 15:49
Status : Hors ligne

Re: [..] Remplacer plusieurs occurrences sous AutoIt avec "_BinaryReplace"

#5

Message par Boulanza »

Le code de l’exemple du lien ci-dessus objet de ma demande,il est sans intérêt !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Remplacer plusieurs occurrences sous AutoIt avec "_ReplaceStringInFile"

#6

Message par mikell »

Boulanza a écrit : lun. 17 août 2020 15:44StringReplace($FR, $sFind, $sReplace) => ne remplace pas les occurrences si vous supprimez (1). Si vous gardez StringReplace($FR, $sFind, $sReplace, 1) => remplace 16 occurrences et non 1 occurrence.
Alors le fichier d'aide se trompe.
C'est grave, car StringReplace est une fonction très utilisée. Je vous suggère d'ouvrir promptement un ticket sur le BugTracker du site US
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Boulanza
Niveau 9
Niveau 9
Messages : 697
Enregistré le : mer. 31 juil. 2013 15:49
Status : Hors ligne

Re: [R] Remplacer plusieurs occurrences sous AutoIt avec "_BinaryReplace"

#7

Message par Boulanza »

Non mikell, le fichier d'aide est parfait, les options de StringReplace rependent correctement, mais combinées avec le code de l’exemple (code ci-dessus) objet de ma demande, deviennent sans intérêt, pas de réaction !
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Remplacer plusieurs occurrences sous AutoIt avec "_BinaryReplace"

#8

Message par jchd »

StringReplace() n'est pas adaptée au traitement de binaire(s).
Plus précisément, la fonction attend trois arguments de type chaîne. Quand on passe du binaire à l'un ou l'autre de ces arguments, il y a une conversion automatique de binaire vers chaîne et c'est à ce niveau qu'un massacre prend place : 0x00 devient une fin de chaîne et sinon il y a transcodage entre page de code et Unicode.

Cette fonction ne peut donc pas effectuer ce travail.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Boulanza
Niveau 9
Niveau 9
Messages : 697
Enregistré le : mer. 31 juil. 2013 15:49
Status : Hors ligne

Re: [R] Remplacer plusieurs occurrences sous AutoIt avec "_BinaryReplace"

#9

Message par Boulanza »

Bonsoir,
Le code ci-dessous est la solution pour remplacer plusieurs occurrences sous AutoIt: ceci prouve que StringReplace() est adaptée au traitement de binaire(s).
Pour plus d'information consultez le lien suvant:
https://www.autoitscript.com/forum/topi ... h-replace/
Cordialement.

Code : Tout sélectionner

$fh = FileOpen("C:\Documents and Settings\user\Desktop\old", 16)
$SH = FileRead($fh)
FileClose($fh)

$SH = StringReplace($SH, "36393639363936393639", "22222222222222222222")
 ConsoleWrite($SH & @CRLF)
$fh = FileOpen("C:\Documents and Settings\user\Desktop\new",  18) ; je pense 18 au lieu de 17 ! ?
FileWrite($fh, $SH)
FileClose($fh)
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Remplacer plusieurs occurrences sous AutoIt avec "_BinaryReplace"

#10

Message par jchd »

Oui ça marche, mais enfin seulement si on a de la chance !

Code : Tout sélectionner

$fh = FileOpen("test.in", 18)
FileWrite($fh, "0x012345678912345678")
FileClose($fh)

$fh = FileOpen("test.in", 16)
$SH = FileRead($fh)
FileClose($fh)

ConsoleWrite($SH & @CRLF)
$SH = StringReplace($SH, "1234", "DEADBEEF")
ConsoleWrite($SH & @CRLF)

$fh = FileOpen("test.out",  18)
FileWrite($fh, $SH)
FileClose($fh)
Si on n'a pas de chance, on bousille le binaire silencieusement.

Conclusion : la vraie solution n'est pas si simple !
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Répondre