Тип преобразования кода используется в исполняемых файлах Linux

Я хочу попросить это, какое кодирование используется для создания исполняемых файлов Linux, например, шестнадцатеричный, двоичный или что-либо еще. как это преобразовывается? Там какой-либо путь состоит в том, чтобы возвратить исходный код от этого исполняемого файла?

Вот немного кода, который я имею:

ELF���������>�����%|�����@�������������������@�8��@���������������������@�������@�����7<�����7<������� ������������������f�����f���������������������� ������[�UPX!L
h�h�8����������?�E�h=��ڊ̓�N�    4���9ISloB�q�w�]ȉ.��,ς��Q䝦����#e��-�N����/�b,���d<��'��-E��6E�s�/�U���ly�V�Y2]"a��S�.�hU�|�S�J�I�2���X}
�G0�;���5d�$���.)

что это, предполагают для значения?

13
задан 9 September 2015 в 05:15

5 ответов

Это является двоичным. Исходный код был скомпилирован. Можно просмотреть его в редакторе (Hex-редактор как bless мог бы сделать для более усовершенствованных изменений), но действительно необходимо знать то, что Вы делаете. Это, вероятно, только хорошо для внесения строковых изменений.

Для чего-либо больше хардкора можно начать перепроектировать двоичный файл в ассемблерный код. Это часто рассматривается как самый низкий язык программирования человека-parsable уровня.

objdump -d helloworld | less

Но это будет включать большую ерунду компилятора также. Например, если Вы компилируете самое простое helloworld.cpp с G ++ и затем objdump это, Вы заканчиваете с 226 строками (208 разделенных) фу. Вы могли записать "привет мир" во всего 15 строках блока, скомпилировать его и objdump это, но это все еще превращается в 166 (разделенных) строк.

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

Вы не можете возвратить скомпилированный код в код первоисточника.

Прошу прощения. Это - одностороннее преобразование, которое теряет информацию (комментарии, форматирование, читаемые понятия алгоритма, и т.д.), статически связано с другими вещами и обычно оптимизируется таким способом, который сделал бы это непонятным к чему-либо кроме лучшего и большинства закаленных программистов.

Для давания Вам общее представление о масштабе проблемы вся эта мысль перепроектировать программное обеспечение имеет свой собственный сайт Exchange Стека.

29
ответ дан 23 November 2019 в 03:10

У меня есть недостаточно точек репутации для комментария, таким образом, это - ответ:

нет, не возможно преобразовать его "назад". Вы упоминаете upx упаковщика, Вы когда-либо читали руководство upx?

, Если Вы потеряли источник или не имеете доступа к коду кого-то еще, не имеет значения здесь, это просто не возможно.

двоичный исполняемый файл был произведен с компилятором, не верьте ничему указанному на этом сайте, просто прочитайте руководство точно того компилятора. Затем Вы могли добавить здесь, в том, какой язык исходный код был написан, какой компилятор использовался, и затем Вы могли бы отметить себя, что это ступает (предварительная обработка, компиляция, соединение, возможно, упаковывая) не инвертируются в целом, но мог только быть проанализирован, что исходный автор, возможно, предназначил и записал.

7
ответ дан 23 November 2019 в 03:10

Это - вероятно, двоичный файл (Файл ELF), как описано приятно здесь:

https://en.wikipedia.org/wiki/Executable_and_Linkable_Format

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

3
ответ дан 23 November 2019 в 03:10

Как Oli, на который указывают уже в его ответе, Вы не можете получить код очень первоисточника исполняемого файла.

Во время компиляции исходного кода (компиляция, предназначенная как в ее типичном более широком принятом значении слова, следовательно как целый процесс, который "преобразовывает" исходный код в исполняемый файл), большая информация потеряна.

препроцессор C, со своей стороны, сделает следующее (среди прочего):

  • Интерпретируют, выполняют и удаляют директивы препроцессору (# операторы)
  • , Удаляют комментарии
  • , Удаляют ненужный пробел

, С другой стороны, что не потеряно во время компиляции исходного кода, технически revertible к функционально эквивалентному исходному коду.

Это вызвано тем, что:

  • Двоичные инструкции имеют 1:1 корреспонденция инструкциям по сборке; сборка исходного кода блока является просто простым преобразованием инструкций по сборке к двоичным инструкциям на основе таблицы корреспонденций; единственная двоичная инструкция всегда идентифицируется и revertible к единственной инструкции по сборке ;
  • Инструкции по сборке не делают , имеют 1:1 корреспонденция инструкциям C; компиляция исходного кода C обычно не просто простое преобразование инструкций C к инструкциям по сборке на основе таблицы корреспонденций, на самом деле это часто - противоположное; обычно инструкция C преобразовывается в несколько (часто отличающийся на основе компилятора) инструкции по сборке; однако, шаблоны нескольких инструкций по сборке обычно идентифицируются и revertible к единственной инструкции C ;

существуют инструменты, названные декомпиляторами, цель которых состоит в том, чтобы попытаться вернуться исполняемый файл к функционально эквивалентному исходному коду; однако результат обычно - что-то далекий из кода очень первоисточника (и обычно также некомпилируемый);

Рассматривают эту программу:

#include <stdio.h>

#define MESSAGE "Literal strings will be recovered" // This preprocessor directive won't be recovered

/*

This comment and the comment above won't be recovered

*/

int main(int argc, char* argv[]) {
    printf(MESSAGE);
    return 0;
}

Путем компиляции его в исполняемый файл и декомпиляции его в исходный код снова, это более или менее, что Вы обычно возвращаете (в этом конкретном случае, который я использовал gcc / Бумеранг ):

// address: 0x80483fb
int main(int argc, char **argv, char **envp) {
    printf("Literal strings will be recovered");
    return 0;
}

, Как предсказано:

  • Директивы препроцессору отсутствуют
  • , Комментарии отсутствуют (кроме // address: 0x80483fb, который был добавлен декомпилятором)
  • , Ненужный пробел отсутствует (кроме новых строк и табулирования, которое было добавлено декомпилятором)

, Это - также довольно хороший результат; не редко получить инструкции по встроенному ассемблерному коду в код:

asm("assembly_instruction");
__asm__("assembly_instruction");

нижняя строка уже (как указано в других ответах): Вы не можете получить очень первоисточник исполняемого файла *.

*However, в зависимости от исполняемого файла и на Вашей удаче, Вы могли бы смочь получить что-то с помощью декомпилятора.

3
ответ дан 23 November 2019 в 03:10

Исполняемые файлы являются обычно двоичными, если Вы говорите о скомпилированных программах. Можно найти больше информации при помощи file path/to/executable. Можно отобразить двоичные исполняемые файлы в шестнадцатеричном при помощи, например, hexdump -C path/to/executable | less (безотносительно пользы, которая сделала бы Вас). Если бы Вы хотите "преобразовать его назад в его исходную форму", необходимо было бы использовать соответствующий декомпилятор , видят это сообщение, например, , хотя это дало бы Вам довольно нечитабельный код не оригинал, это было скомпилировано от. Если бы это не скомпилированный двоичный файл, это был бы некоторый исполняемый сценарий, который должен быть легко читаемым в любом текстовом редакторе. Что Вы показали нам, вот, вероятно, скомпилированный исполняемый файл. ELF означает "Исполняемый файл и Соединение формата", который является общим двоичным форматом в системах Linux/Unix. Существует возможность извлечь читаемые строковые части из двоичных файлов при помощи strings path/to/executable, если это - то, в чем Вы нуждаетесь.

2
ответ дан 23 November 2019 в 03:10

Другие вопросы по тегам:

Похожие вопросы: