каждая программа на c преобразуется в машинный код, если этот двоичный файл распространяется. Поскольку набор команд компьютера хорошо известен, можно ли вернуть исходную программу на языке C?
обратная инженерия программ c
Ответы (9)
Вы никогда не сможете вернуться к тому же самому источнику, поскольку нет метаданных о том, что сохранено с помощью скомпилированного кода.
Но вы можете воссоздать код из кода сборки.
Если вас интересуют следующие вещи, посмотрите эту книгу: Реверс: секреты обратного инжиниринга.
Изменить
Некоторые компиляторы-101 здесь, если бы вы определили компилятор другим словом, а не таким техническим, как «компилятор», что бы это было?
Ответ: Переводчик
Компилятор переводит синтаксис / фразы, которые вы написали, на другой язык, а компилятор C переводит в ассемблерный или даже машинный код. Код C # переведен на IL и так далее.
Исполняемый файл, который у вас есть, - это просто перевод вашего исходного текста / синтаксиса, и если вы хотите «отменить его», следовательно, «перевести обратно», вы, скорее всего, не получите ту же структуру, что и в начале.
Более реальный пример: если вы переведете с английского на немецкий и с немецкого обратно на английский, структура отправки, скорее всего, будет другой, могут использоваться другие слова, но значение, контекст, скорее всего, не изменится.
То же самое и с компилятором / транслятором, если вы переходите от C к ASM, логика такая же, просто другой способ его чтения (и, конечно, его оптимизация).
Это зависит от того, что вы подразумеваете под исходной программой C. Такие вещи, как имена локальных переменных, комментарии и т. Д., Не включены в двоичный файл, поэтому нет возможности получить тот же исходный код, что и тот, который использовался для создания двоичного файла. Такие инструменты, как IDA Pro, могут помочь вам дизассемблировать двоичный файл.
Я бы предположил, что коэффициент конверсии действительно опытного хакера составляет около 1 килобайта машинного кода в день. При обычных западных зарплатах это означает, что цена исполняемого файла размером 100 КБ составляет около 25000 долларов. После того, как вы потратили столько денег, все, что вы получили, - это кусок кода C, который делает именно то, что делает ваш, без комментариев и прочего. Она никоим образом не конкурирует с вашей версией, вы сможете доставлять обновления и улучшения намного быстрее. Обратный инжиниринг этих обновлений - тоже нетривиальная задача.
Если этот ценник вас не впечатляет, вы можете произвольно увеличить стоимость конверсии, добавив дополнительный код. Просто имейте в виду, что у опытных хакеров, которые могут взяться за такие большие программы, есть чем заняться. Они пишут свой код.
Одна из лучших работ по этой теме, о которой я знаю:
Свиньи из сосисок? Реинжиниринг с ассемблера на C через FermaT.
Утверждается, что вы получаете разумную программу на C, даже если исходный код asm не был написан на C! Есть много предостережений.
Декомпилятор Hex-Rays (расширение IDA Pro) может делать именно это. Это все еще относительно недавно и скоро, но подает большие надежды. К этому нужно немного привыкнуть, но это потенциально может ускорить процесс реверсирования. Это не «серебряная пуля» - нет декомпилятора c, но это большой плюс.
for
, while
и do-while
, если они могут быть по-разному закодированы в исходном коде? Кроме того, как он получает имена исходных функций? Как не оптимизировать код для соответствия оригиналу? Как он определяет имена переменных? Выполните поиск news: comp.lang.c по запросу * hamburger и cow.
- person Thomas Matthews; 16.02.2010
Распространенное название этой процедуры - «превращение гамбургера в корову». Можно реконструировать двоичный код в функционально эквивалентную программу на C, но вопрос о том, имеет ли этот код на C близкое сходство с оригиналом, остается открытым.
Работа над инструментами, которые делают это, - это исследовательская деятельность. То есть в легких случаях можно что-то получить (например, имена локальных переменных не восстановишь, если не будут отладочные символы). На практике это практически невозможно для больших программ или если программист решил усложнить задачу.
Между программой на C и создаваемым ею ASM / машинным кодом не существует сопоставления 1: 1 - одна программа на C может компилироваться с другим результатом на разных компиляторах или с разными настройками), а иногда два разных бита C могут давать одно и то же. Машинный код.
Вы определенно можете сгенерировать код C из скомпилированного EXE. Вы просто не можете знать, насколько он будет похож по структуре на исходный код - помимо потери имен переменных / функций, я предполагаю, что он не узнает исходный способ разделения кода между множеством файлов.
Вы можете попробовать hex-rays.com, у него действительно хороший декомпилятор, который декомпилирует ассемблерный код в C с точностью 99%.