каждая программа c преобразуется в машинный код, если этот бинарный файл распределен. Поскольку набор команд компьютера хорошо известен, возможно ли вернуть исходную программу C?
Программы обратного проектирования c
Ответ 1
Вы никогда не сможете вернуться к одному и тому же источнику, поскольку метаданные не сохранены вместе с скомпилированным кодом.
Но вы можете повторно создать код из ассемблерного кода.
Ознакомьтесь с этой книгой, если вас интересуют эти вещи: Реверс: Секреты обратной инженерии.
Edit
Некоторые компиляторы-101 здесь, если бы вы определили компилятор с другим словом, а не как технический, как "компилятор", что бы это было?
Ответ: Переводчик
Компилятор переводит синтаксис/фразы, написанные вами на другой язык, компилятор C переводит на Assembly или даже на машинный код. Код С# переводится в IL и т.д.
Исполняемый файл, который вы используете, представляет собой просто перевод исходного текста/синтаксиса, и если вы хотите "перевернуть его", следовательно, "перевести его обратно", вы, скорее всего, не получите ту же структуру, что и в начале.
Более реальным примером жизни может быть, если вы переводите с английского на немецкий и с немецкого обратно на английский, структура рассылки, скорее всего, будет другой, могут использоваться другие слова, но смысл, контекст, скорее всего, не будет изменились.
То же самое касается компилятора/транслятора, если вы переходите от C к ASM, логика такая же, это просто другой способ ее чтения (и, конечно, ее оптимизация).
Ответ 2
Это зависит от того, что вы подразумеваете под оригинальной программой C. Такие вещи, как локальные имена переменных, комментарии и т.д., Не включаются в двоичный файл, поэтому нет способа получить тот же исходный код, что и тот, который используется для создания двоичного файла. Такие инструменты, как IDA Pro, могут помочь вам разобрать двоичный файл.
Ответ 3
Я бы посоветовал коэффициент конверсии действительно квалифицированного хакера примерно в 1 килобайт машинного кода в день. При общей зарплате в западных странах, которая составляет, скажем, 100 КБ исполняемого файла в размере около 25 000 долларов США. После того, как потратили столько денег, все, что получилось, - это кусок кода C, который делает именно то, что делает ваш, минус преимущества комментариев и еще много чего. Это не способно конкурировать с вашей версией, вы сможете быстрее и быстрее выполнять обновления и улучшения. Обратное проектирование этих обновлений также является нетривиальным усилием.
Если этот ценовой тег не впечатляет вас, вы можете произвольно повысить стоимость конверсии, добавив больше кода. Просто имейте в виду, что квалифицированные хакеры, которые могут заниматься такими крупными программами, имеют намного больше возможностей. Они пишут свой собственный код.
Ответ 4
Одна из лучших работ по этой теме, о которой я знаю, - это:
Свиньи из колбас? Реинжиниринг от ассемблера до C через FermaT.
Претензия заключается в том, что вы получаете разумную программу на C, даже если исходный код asm не был написан на C! Предоставляется множество предостережений.
Ответ 5
Работа над инструментами, которые делают это исследовательская деятельность. То есть, можно получить что-то в простых случаях (вы не будете восстанавливать имена локальных переменных, если не присутствуют символы отладки). Практически это практически невозможно для больших программ или если программист решил сделать это затруднительно.
Ответ 6
Hex-Rays decompiler (расширение для IDA Pro) может сделать именно это. Это все еще довольно недавний и предстоящий, но демонстрирует большие перспективы. Это требует немного привыкания, но может потенциально ускорить процесс реверсирования. Это не "серебряная пуля" - нет декомпилятора c, но это большой плюс.
Ответ 7
Не существует сопоставления 1:1 между программой C и кодом ASM/машиной, который он произведет - одна программа C может скомпилировать другой результат на разных компиляторах или с разными настройками), а иногда два разных бита C могут создать тот же машинный код.
Вы определенно можете сгенерировать код C из скомпилированного EXE. Вы просто не можете знать, насколько похож по структуре он будет на исходный код - кроме потерянных имен переменных/функций, я предполагаю, что он не будет знать, как исходный код был разделен между многими файлами.
Ответ 8
Общее название этой процедуры - "превращение гамбургера обратно в коровы". Возможно обратное преобразование двоичного кода в функционально эквивалентную C-программу, но является ли этот код C близким к оригиналу открытым вопросом.
Ответ 9
Вы можете попробовать hex-rays.com, у него есть действительно хороший декомпилятор, который может декомпилировать код сборки на C с точностью 99%.