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 !