Скрипт / Инструмент для преобразования исходного кода на C, закодированного как «xxd -i» в исходный код C?

Существует ли инструмент Linux / Unix, который можно использовать для преобразования массива шестнадцатеричного дампа файла C (т. Е. Вывод xxd -i) к соответствующему исходному коду?

-5

Решение

Бумеранг декомпилятор бесплатен, работает на Linux и доступен на SourceForge.

1

Другие решения

Выход из 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 — есть больше, чем один способ сделать это.

2

По вопросам рекламы [email protected]