обратный инжиниринг c программами - PullRequest
14 голосов
/ 16 февраля 2010

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

Ответы [ 9 ]

16 голосов
/ 16 февраля 2010

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

Но вы можете заново создать код из ассемблерного кода.

Посмотрите эту книгу, если вас интересуют следующие вещи: Реверс: Секреты обратного инжиниринга .

Редактировать

Некоторые компиляторы-101 здесь, если бы вы определяли компилятор другим словом, а не таким техническим, как «компилятор», что бы это было?

Ответ: Переводчик

Компилятор переводит написанные вами синтаксис / фразы на другой язык, который компилятор C переводит на ассемблер или даже машинный код. Код C # переводится в IL и пр.

Исполняемый файл, который у вас есть, является просто переводом вашего исходного текста / синтаксиса, и если вы хотите «перевернуть его» и, следовательно, «перевести обратно», вы, скорее всего, не получите ту же структуру, что и в начале.

Более реальным примером будет то, что если вы переводите с английского на немецкий и с немецкого обратно на английский, структура пересылки, скорее всего, будет другой, могут использоваться другие слова, но значение, контекст, скорее всего, не будут изменились.

То же самое относится и к компилятору / транслятору, если вы переходите с C на ASM, логика та же, это просто другой способ чтения (и, конечно, его оптимизированный).

5 голосов
/ 16 февраля 2010

Это зависит от того, что вы подразумеваете под оригинальной C-программой. Такие вещи, как имена локальных переменных, комментарии и т. Д., Не включены в двоичный файл, поэтому нет способа получить точно такой же исходный код, который использовался для создания двоичного файла. Такие инструменты, как IDA Pro , могут помочь вам разобрать двоичный файл.

4 голосов
/ 18 февраля 2010

Одна из лучших работ на эту тему, о которой я знаю, это:

Свиньи из колбас? Реинжиниринг от ассемблера до C через FermaT .

Претензия в том, что вы получаете разумную программу на C, даже если оригинальный код asm не был написан на C! Применяется много предостережений.

4 голосов
/ 16 февраля 2010

Я бы предположил, что коэффициент конверсии действительно опытного хакера составляет около 1 килобайта машинного кода в день.При обычной зарплате в западных странах цена исполняемого файла в 100 КБ, например, составляет около 25 000 долларов.Потратив столько денег, все, что вы получили, это кусок кода на C, который делает именно то, что делает ваш, за вычетом комментариев и тому подобного.С вашей версией она никоим образом не конкурирует, вы сможете гораздо быстрее доставлять обновления и улучшения.Пересмотреть эти обновления также нетривиально.

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

3 голосов
/ 16 февраля 2010

Общее название этой процедуры - «превращение гамбургера обратно в коров». Можно преобразовать двоичный код в функционально эквивалентную C-программу, но вопрос о том, имеет ли этот C-код сходство с оригиналом, остается открытым вопросом.

3 голосов
/ 16 февраля 2010

Декомпилятор Hex-Rays (расширение для IDA Pro) может сделать именно это. Это все еще довольно недавно и наступает, но показывает большое обещание. Требуется немного привыкнуть, но потенциально может ускорить процесс реверса. Это не «серебряная пуля» - никакой декомпилятор с не существует, но это большой актив.

3 голосов
/ 16 февраля 2010

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

2 голосов
/ 16 марта 2010

Вы можете попробовать hex-rays.com, он имеет действительно хороший декомпилятор, который может декомпилировать код сборки в C с точностью до 99%.

2 голосов
/ 16 февраля 2010

Нет сопоставления 1: 1 между программой C и ASM / машинным кодом, который она выдаст - одна программа C может компилировать с разными результатами на разных компиляторах или с разными настройками), а иногда два разных бита C произвести тот же машинный код.

Вы определенно можете генерировать код C из скомпилированного EXE. Вы просто не можете знать, насколько по структуре он будет похож на исходный код - кроме потери имен переменных / функций, я предполагаю, что он не будет знать, каким образом исходный код был разделен между многими файлами.

...