Что нового

Поиск и замена строк в бинарном файле

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Снова столкнулся с проблемой замены в бинарном файле.

Имеется бинарная строка:
Код:
64 65 66 6C 61 74 65 2C 20 67 7A 69 70 2C 20 78 2D 67 7A 69 70 2C 20 69 64 65 6E 74 69 74 79 2C 20 2A 3B 71 3D 30
её нужно заменить на такую:
Код:
67 7A 69 70 2C 20 64 65 66 6C 61 74 65 2C 20 69 64 65 6E 74 69 74 79 2C 20 2A 3B 71 3D 30 00 00 00 00 00 00 00 00
Как это сдлелать?
Пробовал по разному, вот одна вариация из моих попыток:
Код:
$sDll = "C:\Opera\opera.dll"

$hFile = FileOpen($sDll, 16)
$sRead = FileRead($hFile)
FileClose($hFile)

$sFind = Binary("6465666C6174652C20677A69702C20782D677A69702C206964656E746974792C202A3B713D30")
$sReplace = Binary("677A69702C206465666C6174652C206964656E746974792C202A3B713D300000000000000000")

$sRead = StringReplace($sRead, $sFind, $sReplace)

$hFile = FileOpen($sDll, 16+2)
FileWrite($hFile, $sRead)
FileClose($hFile)


Сама Dll'ка лежит тут. В архиве кроме Dll'ки имеется патч который делает то что мне нужно, но естественно нужно это сделать без патча.
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
CreatoR

У меня версия библиотеки 10.63.3516.0...
Подстрока не найдена...
Но вот такая замена выполняется...

Код:
; НАЧАЛО

 $sDll = "opera.dll"

 $hFile = FileOpen($sDll)
 $sRead = FileRead($hFile)
 FileClose($hFile)

 $sFind = BinaryToString("0x64656667C9")
 $sReplace = BinaryToString("0x1111111111")

 $sRead = StringReplace($sRead, $sFind, $sReplace)

 $hFile = FileOpen($sDll,2)
 FileWrite($hFile, $sRead)
 FileClose($hFile)

; КОНЕЦ
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
snoitaleR [?]
У меня версия библиотеки 10.63.3516.0
Dll'ка должна быть распакована (Upx'ом).


snoitaleR [?]
вот такая замена выполняется
Спасибо, оказывается можно просто делать замену по файлу:

Код:
$sDll = "C:\Opera\opera.dll"

$hFile = FileOpen($sDll)
$sRead = FileRead($hFile)
FileClose($hFile)

$sFind = BinaryToString("0x6465666C6174652C20677A69702C20782D677A69702C206964656E746974792C202A3B713D30")
$sReplace = BinaryToString("0x677A69702C206465666C6174652C206964656E746974792C202A3B713D300000000000000000")

$sRead = StringReplace($sRead, $sFind, $sReplace)

$hFile = FileOpen($sDll, 2)
FileWrite($hFile, $sRead)
FileClose($hFile)
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Как вариант :
Код:
#include<String.au3>
#include<File.au3>
$hexFind="6465666C6174652C20677A69702C20782D677A69702C206964656E746974792C202A3B713D30"
$hexReplace ="677A69702C206465666C6174652C206964656E746974792C202A3B713D300000000000000000"

_ReplaceStringInFile($sFile,_HexToString($hexFind),_HexToString($hexReplace))
 

Yoy

Новичок
Сообщения
1
Репутация
0
Всем привет!

Как раз искал решение этой проблемы, и благодаря этой теме, смог ее найти.

Однако хочется немного усовершенствовать скрипт, дополнив его выводов сообщения о том, была ли произведена замена или нет:

Код:
MsgBox(0, "Ура!", "Вхождение найдено, файл пропатчен")


Т.е. нужно проверить, существует ли вхождение, и если да, то вывести об этом сообщение. В общем, тут нужен цикл, но я с AutoIt практически не знаком, поэтому рассчитываю на вашу помощь.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Yoy [?]
нужно проверить, существует ли вхождение
Код:
;...
$sRead = StringReplace($sRead, $sFind, $sReplace)
MsgBox(64, 'Info', 'Замен: ' & @extended)
;...
 
Верх