Я хочу попросить это, какое кодирование используется для создания исполняемых файлов 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�$���.)
что это, предполагают для значения?
Это является двоичным. Исходный код был скомпилирован. Можно просмотреть его в редакторе (Hex-редактор как bless
мог бы сделать для более усовершенствованных изменений), но действительно необходимо знать то, что Вы делаете. Это, вероятно, только хорошо для внесения строковых изменений.
Для чего-либо больше хардкора можно начать перепроектировать двоичный файл в ассемблерный код. Это часто рассматривается как самый низкий язык программирования человека-parsable уровня.
objdump -d helloworld | less
Но это будет включать большую ерунду компилятора также. Например, если Вы компилируете самое простое helloworld.cpp
с G ++ и затем objdump
это, Вы заканчиваете с 226 строками (208 разделенных) фу. Вы могли записать "привет мир" во всего 15 строках блока, скомпилировать его и objdump
это, но это все еще превращается в 166 (разделенных) строк.
Если Вы достаточно хороши с блоком, это может предоставить Вам достаточно доступа для понимания то, что происходит, и даже позвольте Вам изменить его... Но отвечать на Ваш исходный вопрос:
Прошу прощения. Это - одностороннее преобразование, которое теряет информацию (комментарии, форматирование, читаемые понятия алгоритма, и т.д.), статически связано с другими вещами и обычно оптимизируется таким способом, который сделал бы это непонятным к чему-либо кроме лучшего и большинства закаленных программистов.
Для давания Вам общее представление о масштабе проблемы вся эта мысль перепроектировать программное обеспечение имеет свой собственный сайт Exchange Стека.
У меня есть недостаточно точек репутации для комментария, таким образом, это - ответ:
нет, не возможно преобразовать его "назад". Вы упоминаете upx упаковщика, Вы когда-либо читали руководство upx?
, Если Вы потеряли источник или не имеете доступа к коду кого-то еще, не имеет значения здесь, это просто не возможно.
двоичный исполняемый файл был произведен с компилятором, не верьте ничему указанному на этом сайте, просто прочитайте руководство точно того компилятора. Затем Вы могли добавить здесь, в том, какой язык исходный код был написан, какой компилятор использовался, и затем Вы могли бы отметить себя, что это ступает (предварительная обработка, компиляция, соединение, возможно, упаковывая) не инвертируются в целом, но мог только быть проанализирован, что исходный автор, возможно, предназначил и записал.
Это - вероятно, двоичный файл (Файл ELF), как описано приятно здесь:
https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
, Если Вы изменили его с редактором обычного текста и сохранили Ваши изменения, это не было никакой хорошей идеей, и Вы, возможно, уничтожили его.
Как Oli, на который указывают уже в его ответе, Вы не можете получить код очень первоисточника исполняемого файла.
Во время компиляции исходного кода (компиляция, предназначенная как в ее типичном более широком принятом значении слова, следовательно как целый процесс, который "преобразовывает" исходный код в исполняемый файл), большая информация потеряна.
препроцессор C, со своей стороны, сделает следующее (среди прочего):
#
операторы) , С другой стороны, что не потеряно во время компиляции исходного кода, технически revertible к функционально эквивалентному исходному коду.
Это вызвано тем, что:
существуют инструменты, названные декомпиляторами, цель которых состоит в том, чтобы попытаться вернуться исполняемый файл к функционально эквивалентному исходному коду; однако результат обычно - что-то далекий из кода очень первоисточника (и обычно также некомпилируемый);
Рассматривают эту программу:
#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, в зависимости от исполняемого файла и на Вашей удаче, Вы могли бы смочь получить что-то с помощью декомпилятора.
Исполняемые файлы являются обычно двоичными, если Вы говорите о скомпилированных программах. Можно найти больше информации при помощи file path/to/executable
. Можно отобразить двоичные исполняемые файлы в шестнадцатеричном при помощи, например, hexdump -C path/to/executable | less
(безотносительно пользы, которая сделала бы Вас). Если бы Вы хотите "преобразовать его назад в его исходную форму", необходимо было бы использовать соответствующий декомпилятор , видят это сообщение, например, , хотя это дало бы Вам довольно нечитабельный код не оригинал, это было скомпилировано от. Если бы это не скомпилированный двоичный файл, это был бы некоторый исполняемый сценарий, который должен быть легко читаемым в любом текстовом редакторе. Что Вы показали нам, вот, вероятно, скомпилированный исполняемый файл. ELF означает "Исполняемый файл и Соединение формата", который является общим двоичным форматом в системах Linux/Unix. Существует возможность извлечь читаемые строковые части из двоичных файлов при помощи strings path/to/executable
, если это - то, в чем Вы нуждаетесь.