Подтвердить что ты не робот

Программы обратного проектирования c

каждая программа c преобразуется в машинный код, если этот бинарный файл распределен. Поскольку набор команд компьютера хорошо известен, возможно ли вернуть исходную программу C?

4b9b3361

Ответ 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%.