Page 1 sur 1

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

Posté : lun. 17 août 2020 10:49
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

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

Posté : lun. 17 août 2020 14:15
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

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

Posté : lun. 17 août 2020 15:44
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.

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

Posté : lun. 17 août 2020 16:18
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 ! ?

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

Posté : lun. 17 août 2020 21:21
par Boulanza
Le code de l’exemple du lien ci-dessus objet de ma demande,il est sans intérêt !

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

Posté : lun. 17 août 2020 22:50
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

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

Posté : lun. 17 août 2020 23:15
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 !

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

Posté : mar. 18 août 2020 00:23
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.

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

Posté : mer. 19 août 2020 22:25
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)

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

Posté : jeu. 20 août 2020 00:49
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 !