Что нового

[Данные, строки] hex binary патчер

damien2008

Осваивающий
Сообщения
178
Репутация
34
AutoIt: 3.3.8.1
Версия: 1.0
Лицензия:
Категория: Кодирование, Файловая, (HEX, Binary)

Описание:
понадобился небольшой патчер бинарных файлов. (может кому пригодится)
вот нашел на английском, ссылка.
тут не нашел, поэтому решил добавить сюда.

Код/Пример:
Код:
; наглядно посмотреть hex строку можно с помощью двоичного редактора, например WinHex

$1 = FileOpen(@ScriptDir & "\orig.txt", 2) ;запишем в новый файл данные, которые будем менять
FileWrite($1, "Autoit ROCKS!")
FileClose($1)

$sInFile = @ScriptDir & "\orig.txt" ; начальный файл
$sFind = "524F434B53" ; MSFT 5.0 hex значение которое будем менять
$sReplace = "5448452042455354" ; внезапно! новое значение, которое пропишем
$sOutFile = @ScriptDir & "\patched.txt" ; выходной файл

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

Func _BinaryReplace($sInFile, $sFind, $sReplace, $sOutFile)
    Local $FO, $FR
    $FO = FileOpen($sInFile, 16) ; принудительное открытие первого файла, бинарное (по байтам) чтение
    $FR = FileRead($FO) ; читаем файл в новую переменную
    FileClose($FO) ; закрываем открытый прочитанный файл
    $FR = StringReplace($FR, $sFind, $sReplace, 1); находим и меняем hex строку
    $FO = FileOpen($sOutFile, 18) ; открываем новый файл в режиме бинарной записи 16+2
    FileWrite($FO, $FR) ; записываем новое значение
    FileClose($FO) ; закрываем созданный файл
EndFunc

; можно сравнить два файла с помощью WinMerge


Источник: autoit-script.ru
Автор(ы): smashly, перевод damien2008
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Круто :smile:
А поиск строки и замена на другую строку будет работать?
(Например найти bootmgr и заменить на 003tmgr)
 
Автор
damien2008

damien2008

Осваивающий
Сообщения
178
Репутация
34
inververs,
UPD . вот. в контексте hex
держи:
Код:
#include <String.au3>

$sInFile = @ScriptDir & "\orig.txt"
$sFind = _StringToHex("bootmgr")
$sReplace = _StringToHex("003tmgr")

_BinaryReplace($sInFile, $sFind, $sReplace)

Func _BinaryReplace($sInFile, $sFind, $sReplace)
    Local $FO, $FR
    $FO = FileOpen($sInFile, 16)
    $FR = StringReplace(FileRead($FO), $sFind, $sReplace, 1)
    $FO = FileOpen($sInFile, 18)
    FileWrite($FO, $FR)
    FileClose($FO)
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
inververs
Grub делает такие замены не исправляя сам файл, только в памяти на этапе загрузки, например так:
Код:
write --offset=0x105E (rd)+1 \xEB\x08
 
Верх