Тема: CMD/BAT: патчер бинарных файлов
Скрипт должен с успехом работать во всех версиях Windows.
pat4.bat
:: patcher v 1.0.3 by kiber_punk
@echo off
CHCP 1251>nul
set a=
set data=
set ext=
if "%~1"=="/?" (GOTO HELP)
if "%~1"=="" (GOTO file)
if not "%~1"=="" (echo File: %~nx1)
set newname=%~s1
rem ИМЕЕМ КОРОТКОЕ ИМЯ
:new
if "%2"=="" (GOTO address)
if "%3"=="" (GOTO byte)
if not "%3"=="" (GOTO go)
rem ВВОД АДРЕСА
:address
set /p a=Offset address (+100h), default - BOF:
if "%a%"=="" (set a=100)
rem ВВОД БАЙТА
:byte
set /p data=Input byte for include, default ^<00^>:
if "%data%"=="" (set data=00)
:go
rem переименовать чтобы исключить все возможные ошибки
ren %1 "tmp.bin"
rem задаём короткое имя в формате DOS
call :short "%~dp1tmp.bin"
CALL :WORK "%newname%" %2 %a% %data% %3 %4 %5 %6 %7 %8 %9
rem обратное переименование
ren "%~dp1tmp.bin" "%~nx1"
rem вывод информации
echo ...
echo Filename: %~nx1
echo Address: %2 %a%
echo Byte: %data% %3 %4 %5 %6 %7 %8 %9
echo ...
echo Press AnyKey...
pause>nul
exit /b
rem ИНТЕРАКТИВНОЕ ЗАДАНИЕ ИМЕНИ
:file
set /p file=Enter filename:
CALL :new %file%
exit /b
rem РАБОЧАЯ ЧАСТЬ
:WORK
echo e %2 %3 %4 %5 %6 %7 %8 %9>patch.dbg
echo w>>patch.dbg
echo q>>patch.dbg
chcp 866>nul
debug %~1 < patch.dbg >nul
del patch.dbg
exit /b
rem СПРАВКА
:HELP
echo Used command line: pat4 [^<file^> [address [byte]]] [/?]
echo ...
echo ^<file^> - файл для обработки
echo ^<address^> - адрес ввода байтов +100h ^(HEX^)
echo ^<byte^> - байт^(ы^) разделенные через пробел ^(HEX^)
echo Пример:
echo ..
echo ^<pat4.bat file.exe 100 01 02 3c^> - записывает в начало файла
echo последовательность байт 01,02,3c
echo ^<pat4.bat file.lnk 13c 07^> - записывает байт 07 по адресу 3C&echo ..
exit /b
:short
set newname=%~s1
Для добавления пункта "Patch" в контекстное меню проводника необходимо скопировать скрипт в системную директорию и выполнить reg-файл:
pat4.reg
REGEDIT4
[HKEY_CLASSES_ROOT\*\shell\Patch\command]
@="pat4.bat \"%1\""
[HKEY_CLASSES_ROOT\lnkfile\shell\patch\command]
@="pat4.bat \"%1\""
За один проход скрипта можно вводить по 7 байт.
__
Обсуждение скрипта на форуме