1 (изменено: kiber_punk, 2009-03-01 06:56:47)

Тема: CMD/BAT: патчер бинарных файлов

Должно работать во всех версиях Windows

:: patcher.bat v0.1 by kiber_punk
::
@echo off
chcp 1251>nul
if "%1"=="" (goto file)
if "%1"=="/?" (
    echo Used command line:  patcher [^<file^> [address [byte]]]
    echo -
    echo ^<file^>    - файл для обработки
    echo ^<address^> - начальный адрес смещения +100h ^(HEX^)
    echo ^<byte^>    - байт^(ы^) для внедрения, разделенные через пробел  
    echo   Пример:
    echo ...
    echo ^<patcher file.exe 100 01 02 3c^> - записывает в начало файла
    echo                                   последовательность байтов 01,02,3c
    echo ^<patcher file.lnk 13c 07^>       - записывает байт 07 по адресу 3C&echo ...
    goto :eof)        else (set file=%~s1)
if "%2"=="" (goto address)    else set a=%2
if "%3"=="" (goto byte)      else set data=%3
if not "%4"=="" (set data=%data% %4 %5 %6 %7 %8 %9)
goto work 

:file
set /p file=Enter filename:   
:address
set /p a=Enter offset address (+100h), default - begin file:   
if "%a%"=="" (set a=100)
:byte
set /p data=Input byte(s) for include:   
if "%data%"=="" (set data=00)
:work
echo e %a% >patch.txt
echo %data% >>patch.txt
echo w>>patch.txt
echo q>>patch.txt
debug %file%<patch.txt>nul
del patch.txt
echo File:    %~nx1 
echo Address: %a%
echo Byte:    %data%
pause>nul

В скрипте присутствует встроенная контекстная справка по использованию (ключ "/?")
При вызове без парметров последует интереактивный ввод имени файла и данных.
Адрес смещения следует вводить на 100h выше (особенность отладчика)
Для ввода байта 00 по адресу 3Ch используйте ком.строку:

patcher file.exe 13C 00

Для ввода последовательности байт по адресу 120h:

patcher file.exe 220 01 02 03 04

2

Re: CMD/BAT: патчер бинарных файлов

Работает, вроде .

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

3 (изменено: -red-, 2009-03-03 17:47:10)

Re: CMD/BAT: патчер бинарных файлов

kiber_punk пишет:

Адрес смещения следует вводить на 100h выше (особенность отладчика)

А для чего это оставлено? Нельзя в скрипте прибавить эти 100h чтоб избавить пользователя от лишних головоломок?
Кстати "::" - не работает в Вин 9х кажется ...

4

Re: CMD/BAT: патчер бинарных файлов

Написал "чисто для души", при исследовании структуры файлов .lnk и других форматов.
В первом посте скрипт не работает именами содержащими пробелы и с файлами *.hex  *.exe,  недосмотрел

-red- пишет:

в скрипте прибавить эти 100h

Это будет тяжеловато, если суммировать введённый адрес через SET /a, то на выходе будет число преобразованное в десятичный формат.

-red- пишет:

избавить пользователя от лишних головоломок

Не думаю что "пользователя" чем-то заинтересует этот скрипт
OFF: Только низкоуровневые программисты и крякеры

После множественных реконструкций вот что у меня получилось:
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

::ИМЕЕМ КОРОТКОЕ ИМЯ
:new
if "%2"=="" (GOTO address)
if "%3"=="" (GOTO byte)
if not "%3"=="" (GOTO go)

::ВВОД АДРЕСА
:address
set /p a=Offset address (+100h), default - BOF:  
if "%a%"=="" (set a=100)
::ВВОД БАЙТА
:byte
set /p data=Input byte for include, default ^<00^>:  
if "%data%"=="" (set data=00)

:go
::переименовать чтобы исключить все возможные ошибки
ren %1 "tmp.bin"
::задаём короткое имя в формате DOS
call :short "%~dp1tmp.bin"

CALL :WORK "%newname%" %2 %a% %data% %3 %4 %5 %6 %7 %8 %9

::обратное переименование
ren "%~dp1tmp.bin" "%~nx1"

::вывод информации
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

::ИНТЕРАКТИВНОЕ ЗАДАНИЕ ИМЕНИ
:file
set /p file=Enter filename:  
CALL :new %file%
exit /b


::РАБОЧАЯ ЧАСТЬ
: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

::СПРАВКА
: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

Для добавления пункта в коннтекстное меню проводника:
pat4.reg

REGEDIT4

[HKEY_CLASSES_ROOT\*\shell\Patch\command]
@="pat4.bat \"%1\""
[HKEY_CLASSES_ROOT\lnkfile\shell\patch\command]
@="pat4.bat \"%1\""

За один проход скрипта можно вводить по 7 байт.

5

Re: CMD/BAT: патчер бинарных файлов

Пример.

Создайте ярлык к файлу cmd.exe
Выполним такую команду:

PAT4.BAT cmd.exe.lnk 13c 07

Ярлык теперь имеет параметр запуска "свёрнутое в значёк"
Потом такую:

PAT4.BAT cmd.exe.lnk 13c 03

Окно запускается развёрнутым.

такую:

PAT4.BAT cmd.exe.lnk 13c 00

Опля! Запуск в режиме SW_HIDE

6 (изменено: alexii, 2009-03-06 07:23:32)

Re: CMD/BAT: патчер бинарных файлов

Увековечил: Серый форум / CMD/BAT: патчер бинарных файлов.
Пример с ярлыком тудаже или не стоит?

7 (изменено: -red-, 2009-03-05 12:54:16)

Re: CMD/BAT: патчер бинарных файлов

kiber_punk пишет:
-red- пишет:

в скрипте прибавить эти 100h

Это будет тяжеловато, если суммировать введённый адрес через SET /a, то на выходе будет число преобразованное в десятичный формат.

А если прикрутить примерчик:

echo WScript.Quit( (parseInt(%1,16)+0x100).toString(16) ) > test.js
cscript //B //Nologo test.js
echo %ERRORLEVEL%
del test.js

kiber_punk, по крайней мере это не противоречит твоей подписи

8

Re: CMD/BAT: патчер бинарных файлов

kiber_punk пишет:

Пример с ярлыком тудаже или не стоит?

Пример с ярлыком там точно не помешает, спасибо.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

9

Re: CMD/BAT: патчер бинарных файлов

-red- пишет:

А если прикрутить примерчик:

echo WScript.Quit( (parseInt(%1,16)+0x100).toString(16) ) > test.js
cscript //B //Nologo test.js
echo %ERRORLEVEL%
del test.js

kiber_punk, по крайней мере это не противоречит твоей подписи

И? Это тоже самое что и SET /a. Функция  parseInt возвращает число в десятичном формате, а нужен hex.

Можно проделать трюк с vbs-функцией hex(), но это всё костыли.

10

Re: CMD/BAT: патчер бинарных файлов

OFF: 2kiber_punk: прошу, при помещении чего-либо в Коллекцию, делать из ссылку из обсуждения на неё, например, так. Это облегчает жизнь.

11 (изменено: -red-, 2009-03-06 09:34:15)

Re: CMD/BAT: патчер бинарных файлов

kiber_punk пишет:

И? Это тоже самое что и SET /a. Функция  parseInt возвращает число в десятичном формате, а нужен hex.

Сразу видно что примерчик ты не запускал
ЗЫ: Костыли - это прибавлять 0х100 к требуему смещению

12 (изменено: kiber_punk, 2009-03-06 18:20:57)

Re: CMD/BAT: патчер бинарных файлов

alexii, извиняюсь, впреть больше такого не повторится

13 (изменено: kiber_punk, 2009-03-06 19:00:00)

Re: CMD/BAT: патчер бинарных файлов

-red- пишет:

Сразу видно что примерчик ты не запускал
ЗЫ: Костыли - это прибавлять 0х100 к требуему смещению

Мда..Клиника? (:
Примерчик то твой я пробывал, и немного запутался.. вот скажи, как ты получаешь через этот код ну например число 3c?
OFF: да и, давай не будем играть в перелядки-подмигивалки

14

Re: CMD/BAT: патчер бинарных файлов

UpDate.
Ввод реального адреса смещения (без необходимости предварительного суммирования с 100h) и костылей в виде временных файлов.
Небольшие добавления в справке (инклуд строки).


:: patcher v 2.0.1 by kiber_punk 
@echo off
CHCP 1251>nul
set a=
set data=
set ext=

if "%~1"=="/?" (GOTO HELP)
if "%~1"=="" (GOTO file)

set newname=%~s1

::ИМЕЕМ КОРОТКОЕ ИМЯ
:new
if "%2"=="" (GOTO address)
if "%3"=="" (GOTO byte)
if not "%3"=="" (GOTO go)

::ВВОД АДРЕСА
:address
set /p a=Offset address, default - BOF(00h):  
if "%a%"=="" (set a=00)
::ВВОД БАЙТА
:byte
set /p data=Input byte for include, default ^<00^>:  
if "%data%"=="" (set data=00)

:go
::переименовать чтобы исключить все возможные ошибки
ren %1 "tmp.bin"
::задаём короткое имя в формате DOS
call :short "%~dp1tmp.bin"

CALL :WORK "%newname%" %2 %a% %data% %3 %4 %5 %6 %7 %8 %9

::обратное переименование
ren "%~dp1tmp.bin" "%~nx1"

::вывод информации
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

::ИНТЕРАКТИВНОЕ ЗАДАНИЕ ИМЕНИ
:file
set /p file=Enter filename:  
if not exist %file% (Echo File not found&goto file)
CALL :new %file%
exit /b

::РАБОЧАЯ ЧАСТЬ
:WORK
call mshta "javascript:var s=((parseInt(0x100))+(parseInt(0x%2)));function toHex(s){  return (enHex((0xf000 & s) >> 12) + enHex((0x0f00 & s) >>  8) + enHex((0x00f0 & s) >>  4) + enHex((0x000f & s) >>  0)) } ;function enHex(aDigit){  return("0123456789ABCDEF".substring(aDigit, aDigit+1))};new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(('E ')+((toHex(s))));close();" >patch.dbg
echo  %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
::СПРАВКА
:HELP
    echo Used command line:  pat4 [^<file^> [address [bytes]]] [/?]
    echo ...
    echo ^<file^>    - файл для обработки
    echo ^<address^> - адрес смещения для ввода байтов ^(HEX^)
    echo ^<byte^>    - байт^(ы^)  и(или) строки разделенные через пробел.
    echo           Между байтом и строкой пробел необязателен: 04 20'string' 20 
    echo ..
    echo   Пример:
    echo ^<pat4.bat file.exe 00 01 02 3c^> - записывает в начало файла
    echo                             последовательность байтов 01,02,3c
    echo ^<pat4.bat file.lnk 3c 07^>       - записывает байт 07 по адресу 3C&echo ..
exit /b

:short
set newname=%~s1

Код HEX-преобразования заимствован отсюда

15

Re: CMD/BAT: патчер бинарных файлов

2kiber_punk: а эту функцию можно использовать для добавления 0x100?

@echo off
setlocal enableextensions enabledelayedexpansion

set /a Decimal = 511
call :DecimalToHex %Decimal% Hex
echo Decimal [%Decimal%] == Hex [%Hex%]

endlocal
exit /b 0

rem ===============================================================
:DecimalToHex DecimalValueIn HexStringOut
rem ===============================================================
    setlocal enableextensions enabledelayedexpansion

    set /a DecimalValue = %1
    set HexString=
    
:Repeat
    set /a Index         = DecimalValue %% 16 + 1
    set /a DecimalValue  = DecimalValue / 16

    for /f "tokens=%Index%" %%h in ("0 1 2 3 4 5 6 7 8 9 A B C D E F") do set HexString=%%h%HexString%
    
    if %DecimalValue% GTR 0 goto :Repeat
    
    endlocal & set %2=%HexString%
exit /b 0
rem ===============================================================

Наподобие такого (на примере «set /p…» из оригинального скрипта):

@echo off
setlocal enableextensions enabledelayedexpansion

set /p Adress=Enter offset address, default - begin file: 
if "%Adress%"=="" (
    set Adress=100
) else (
    set /a DecimalAdress = 0x!Adress! + 0x100
    call :DecimalToHex !DecimalAdress! Adress
    rem echo Here Adress in hex = !Adress!
)
echo HexAdress [%Adress%]

endlocal
exit /b 0

rem ===============================================================
:DecimalToHex DecimalValueIn HexStringOut
rem ===============================================================
    setlocal enableextensions enabledelayedexpansion

    set /a DecimalValue = %1
    set HexString=
    
:Repeat
    set /a Index         = DecimalValue %% 16 + 1
    set /a DecimalValue  = DecimalValue / 16

    for /f "tokens=%Index%" %%h in ("0 1 2 3 4 5 6 7 8 9 A B C D E F") do set HexString=%%h%HexString%
    
    if %DecimalValue% GTR 0 goto :Repeat
    
    endlocal & set %2=%HexString%
exit /b 0
rem ===============================================================

alexii, извиняюсь, впредь больше такого не повторится

Ну, что Вы, это была просто просьба .

OFF: сделано на основе TSCMD032 FAQ: How can I convert a decimal number to binary, octal, hexadecimal? Assorted NT/2000/XP/.. CMD.EXE script tricks written by Timo Salmi. Много там, конечно, совершенно лишнего — я многое убрал, но вот использование:

call :LabelName %ArgIn% ArgOut

для вызова функции «:LabelName» и возврат значения «Variable» в вызывающий скрипт через параметры в виде:

endlocal & set %2=%Variable%

я встретил впервые. Самое интересное, что это работает. Как говорится, chapeau!

16 (изменено: -red-, 2009-03-10 10:40:26)

Re: CMD/BAT: патчер бинарных файлов

OFF:

kiber_punk пишет:

как ты получаешь через этот код ну например число 3c?

Вот я лох то.
ЗЫ: Нехочешь перемигиваться - так и написал бы сразу что код не корректен, я ж тебе идею подать хотел и судя по всему подал (:

17 (изменено: kiber_punk, 2009-03-12 01:32:31)

Re: CMD/BAT: патчер бинарных файлов

Спасибо
Очень интересные трюки на ресурсе по ссылке.
Теперь скрипт работает заметно быстрее.
__
UpDate

:: patcher v 2.1 by kiber_punk 
@echo off
CHCP 1251>nul
set a=
set data=
set ext=
if "%~1"=="/?" (GOTO HELP)
if "%~1"=="" (GOTO file)

set newname=%~s1
::ИМЕЕМ КОРОТКОЕ ИМЯ
:new
if "%2"=="" (GOTO address)
if "%3"=="" (GOTO byte)
if not "%3"=="" (GOTO go)

::ВВОД АДРЕСА
:address
set /p a=Offset address, default - BOF(00h):  
if "%a%"=="" (set a=00)
::ВВОД БАЙТА
:byte
set /p data=Input byte for include, default ^<00^>:  
if "%data%"=="" (set data=00)

:go
::переименовать чтобы исключить все возможные ошибки
ren %1 "~tmp.bin"
::задаём короткое имя в формате DOS
call :short "%~dp1~tmp.bin"
CALL :WORK "%newname%" %2 %a% %data% %3 %4 %5 %6 %7 %8 %9
::обратное переименование
ren "%~dp1~tmp.bin" "%~nx1"

::вывод информации
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 

::ИНТЕРАКТИВНОЕ ЗАДАНИЕ ИМЕНИ
:file
set /p file=Enter filename:  
if not exist %file% (Echo File not found!&goto file)
CALL :new %file%
exit /b

::РАБОЧАЯ ЧАСТЬ
:WORK
call :HEX %2
set pat4=%TMP%\patch.dbg
rem =================================
echo e %offset% %3 %4 %5 %6 %7 %8 %9>%pat4%
echo  %3 %4 %5 %6 %7 %8 %9>>%pat4%
echo w>>%pat4%
echo q>>%pat4%
rem =================================
chcp 866>nul
debug %~1 <%pat4%>nul
exit /b
::СПРАВКА
:HELP
    echo Used command line:  pat4 [^<file^> [address [bytes]]] [/?]
    echo ...
    echo ^<file^>    - файл для обработки
    echo ^<address^> - адрес смещения для внедряемых байтов ^(HEX^)
    echo ^<byte^>    - байт^(ы^)  и(или) строки разделенные через пробел.
    echo           строки заключаются в одинарные кавычки.
    echo           Между байтом и строкой пробел необязателен: 04 20'string' 20 
    echo ..
    echo   Пример:
    echo ^<pat4.bat file.exe 00 01 02 3c^> - записывает в начало файла
    echo                             последовательность байтов 01,02,3c
    echo ^<pat4.bat file.lnk 3c 07^>       - записывает байт 07 по адресу 3C&echo ..
exit /b

:short
set newname=%~s1
exit /b

rem ==Преобразование адреса==
:HEX
setlocal enableextensions enabledelayedexpansion
    SET Adr=%1
    set /a plus100 = 0x%Adr% + 0x100
    call :Dec2HEX !plus100! Adr    
endlocal&set offset=%Hexstr%

exit /b 0
:Dec2HEX 
set /a Dec = %1
set HexString=
:Repeat
set /a Index = Dec %% 16 + 1
set /a     Dec  = Dec / 16

for /f "tokens=%Index%" %%h in ("0 1 2 3 4 5 6 7 8 9 A B C D E F") do (set HexString=%%h%HexString%)
if %Dec% GTR 0 goto :Repeat
set Hexstr=%HexString%

__
(ой, забыл раскомментировать вторую строку )

18

Re: CMD/BAT: патчер бинарных файлов

Что в коллекцию то последнюю версию не отправил?

19

Re: CMD/BAT: патчер бинарных файлов

Бета-Тест Чувствую что ещё что-то можно оптимизировать.

20

Re: CMD/BAT: патчер бинарных файлов

UpDate
Ну вроде закончил. Pat4_v3
Подчистил лишние переходы, упаковал всё в удобную инсталляшку

21

Re: CMD/BAT: патчер бинарных файлов

Может кто-нибудь обьяснить как пользоваться этим скриптом??? создал pat4.bat и  pat4.reg, скопировал батник в C:\windows внёс изменения в регистр, а дальше что?? открываю двоичный файл и всё так же...

22 (изменено: jite, 2010-11-14 18:53:58)

Re: CMD/BAT: патчер бинарных файлов

а) Как работает скрипт, написано в нем самом, в разделе :HELP. Скрипт специфичный. Вероятно те, кому он действительно нужен, без труда в нем разберутся.

б) Если же вам нужен просто патчер, то рекомендую воспользоваться xdelta.
Сделать файл различий diff между ver1.txt и ver2.txt

xdelta3.0t.x86-32.exe -f -e -s ver1.txt ver2.txt diff

После этого можно из ver1.txt и diff всегда сделать ver2.txt:

xdelta3.0t.x86-32.exe -f -d -s ver1.txt diff ver2.txt

Например, экономней скачать образ CD.iso и diff для превращения его в DVD.iso (CD.iso + доп. материалы), чем качать и то и другое.

upd
в) Ах, да, может быть я все усложняю, и вам просто нужно поправить в файле пару байт по известному смещению. Тогда вам нужен шестнадцатиричный редактор.