Существует ли инструмент Linux / Unix, который можно использовать для преобразования массива шестнадцатеричного дампа файла C (т. Е. Вывод xxd -i
) к соответствующему исходному коду?
Бумеранг декомпилятор бесплатен, работает на Linux и доступен на SourceForge.
Выход из xxd -i xyz.c
для исходного файла xyz.c
похоже:
unsigned char xyz_c[] = {
0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x74,
0x64, 0x69, 0x6f, 0x2e, 0x68, 0x3e, 0x0a, 0x23, 0x69, 0x6e, 0x63, 0x6c,
0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x2e,
0x68, 0x3e, 0x0a, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20,
0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x68, 0x3e, 0x0a, 0x0a,
…
0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x73, 0x74, 0x61, 0x72, 0x74,
0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x3b, 0x0a,
0x7d, 0x0a
};
unsigned int xyz_c_len = 4442;
Предположим, что хранится в файле xyz.xxd
,
Во многих отношениях самый простой способ восстановить исходный код:
#include <stdio.h>
#include "xyz.xxd"
int main(void)
{
for (unsigned int i = 0; i < xyz_c_len; i++)
putchar(xyz_c[i]);
return 0;
}
С некоторой большей осторожностью и некоторыми макросами вы можете сделать это универсальной программой для работы — вам нужно будет указать имя файла и имена двух переменных C, которые будут использоваться.
Если вы не можете (или не хотите) использовать компилятор C для этой работы, тогда написание инструмента с использованием Python или Perl — простое упражнение. Например, не обязательно минимальный скрипт Perl:
#!/usr/bin/env perl -na
use strict;
use warnings;
# xxd -i drops the final comma - aargh (why?)!
foreach my $word (@F)
{
next unless $word =~ m/^0[Xx][[:xdigit:]]{2},?$/;
$word =~ s/,//;
printf "%c", hex($word);
}
Используется опция «авто-разделение» (-a
) и опция «автоматическое чтение, но не печать» (-n
), а затем обрабатывает любые слова на входе, которые выглядят как шестнадцатеричные символы, например 0x0a (необязательно, после запятой, так как xxd -i
несколько излишне пропускает запятую после последнего значения байта) и преобразует ее в соответствующий байт. Это Perl, TMTOWTDI — есть больше, чем один способ сделать это.