Как записать двоичный файл из шестнадцатеричной строки в командной строке Windows - PullRequest
0 голосов
/ 26 мая 2020

Я хочу сделать двоичный исполняемый файл из шестнадцатеричной строки в windows cmd. Я использовал команду cmd "echo", но она написана в обычной строке, а не в двоичном формате. Таким образом, выходной exe-файл не может быть выполнен.

input: "\x4d\x5a\x90\x00\x03\x00\x00\x00\x04\x00\x00\x00\xff\xff\..." (this is first part of PE)
output: binary executable file

Возможно ли это в windows cmd? Если возможно, пожалуйста, помогите мне. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Да, есть способ: есть инструмент под названием CertUtil.exe (доступен с Windows XP, хотя некоторые глаголы могли быть изменены), в котором есть глагол под названием -decodehex ( для необязательного параметра type взгляните на аргумент dwFlags функции CryptBinaryToStringA):

Usage:
  CertUtil [Options] -decodehex InFile OutFile [type]
  Decode hexadecimal-encoded file
    type -- numeric CRYPT_STRING_* encoding type
[...]

Однако это не понять шестнадцатеричные коды ваших входных данных, \x необходимо удалить.


Следующий скрипт считывает вашу входную шестнадцатеричную строку из файла, заменяет каждый \x на SPACE во временном файле и преобразует его в двоичный файл, используя certutil -decodehex:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_INPF=%~1" & rem // (input file; `%~1` is first command line argument)
set "_OUTF=%~2" & rem // (output file; `%~2` is second command line argument)
set "_TMPF=%TEMP%\%~n0_%RANDOM%.tmp" & rem // (temporary file)

rem // Prepare input file by replacing `\x` with ` ` and writing result to temp. file:
< nul set /P ="Preparing data... "
< "%_INPF%" > "%_TMPF%" call :PREPARE
echo done.
rem // Convert temporary file with hex codes into binary output file:
certutil -f -v -decodehex "%_TMPF%" "%_OUTF%" 4
rem // Clean up temporary file:
del "%_TMPF%"

endlocal
exit /B


:PREPARE
    setlocal EnableDelayedExpansion
    rem // Initialise auxiliary variables:
    set "REST="
    rem /* Read input file in chunks of 1 KBytes using `set /P`; `for /F` is avoided
    rem    for reading the file, because it would limit line lengths to 8 KBytes: */
:PREPARE_LOOP
    rem // Read a chunk or line of hex codes:
    set "LINE=" & set /P LINE=""
    rem // Read chunk is empty, hence end of data is reached, so terminate loop:
    if not defined LINE goto :PREPARE_NEXT
    rem // Prepend potential fragment from previous chunk:
    set "LINE=!REST!!LINE!" & set "REST="
    rem // Now replace every `\x` by ` `:
    set "LINE=!LINE:\x= !"
    rem // Store remaining fragment of search string to be processed with next chunk:
    if "!LINE:~-1!"=="\" (set "LINE=!LINE:~,-1!" & set "REST=\")
    rem /* Return converted chunk without trailing line-break in order to avoid hex
    rem    codes to become torn apart: */
    < nul set /P ="!LINE!"
    rem // Loop back at this point:
    goto :PREPARE_LOOP
:PREPARE_NEXT
    endlocal
    exit /B

Обратите внимание, что certutil ограничивает размер файла несколькими десятками мегабайт (как также упоминалось здесь ).

0 голосов
/ 26 мая 2020

Прошло время, но я думаю, что это было возможно в старой отладке DOS. Взгляните сюда: https://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissasemblers/DOS-Debug.shtml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...