[AutoIt] Как пропатчить файл

Предположим, нужно найти в каком-то файле последовательность байт 8B87380600003987 и перезаписать на B80001000090898738060000909090909090 с помощью AutoIt.
Нам понадобится файл Binary.au3 (скачать), положите его в папку со скриптом.
Подключаем необходимые модули:

#include "Binary.au3"
#include <WinAPIFiles.au3>

Основной код:

Func PatchFile($fileName, $pattern, $patch)
	Local $fileData = FileReadToMemory($fileName)
	Local $offset = _BinaryInBin($fileData, $pattern, 1)
	If $offset > 0 Then
		FileWriteBytes($fileName, $offset, $patch)
		Return True
	Else
		Return False
EndIf
EndFunc

If PatchFile("somefile.exe", "0x8B87380600003987", "0xB80001000090898738060000909090909090" Then
	ConsoleWrite("OK")
Else
	ConsoleWrite("Error")
EndIf

Вспомогательные функции для чтения и записи:

Func FileWriteBytes($filename, $offset, $buffer)
	$buffer = Binary($buffer)
	Local $length = BinaryLen($buffer)
	Local $nBytes
	If $offset > 0 Then $offset -= 1
	$hFile = _WinAPI_CreateFile($filename, 2, 4, 2)
	$tBuffer = DllStructCreate("byte[" & $length & "]")
	DllStructSetData($tBuffer, 1, $buffer)
	_WinAPI_SetFilePointer($hFile, $offset)
	_WinAPI_WriteFile($hFile, DllStructGetPtr($tBuffer), $length, $nBytes)
	_WinAPI_CloseHandle($hFile)
EndFunc

Func FileReadToMemory($fileName)
	Local $iBytes
	$iSize = FileGetSize($fileName)
	$tData = DllStructCreate('byte[' & $iSize & ']')
	$pData = DllStructGetPtr($tData);
	$hFile = _WinAPI_CreateFile($filename, 2, 2, 2)
	_WinAPI_ReadFile($hFile, $pData, $iSize, $iBytes)
	_WinAPI_CloseHandle($hFile)
	$buffer = DllStructCreate('byte[' & $iBytes & ']', $pData)
	Return DllStructGetData($buffer, 1)
EndFunc

Добавить комментарий

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешённые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Syntax highlight code surrounded by the <pre class="brush: lang">...</pre> tags, where lang is one of the following language brushes: autoit, bash, csharp, cpp, delphi, erlang, php, plain, powershell, sql.
  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Syntax highlight code surrounded by the <pre class="brush: lang">...</pre> tags, where lang is one of the following language brushes: autoit, bash, csharp, cpp, delphi, erlang, php, plain, powershell, sql.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
13 + 1 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.