обратная инженерия программ c

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


person shreyasva    schedule 16.02.2010    source источник
comment
можно ли вернуть исходную программу C?   -  person shreyasva    schedule 16.02.2010
comment
@ Роджер Пейт, поставьте вопросительный знак в конце исходной программы, и у вас будет свой вопрос: | ух ты....   -  person Shawn Mclean    schedule 16.02.2010
comment
Вы знаете, я полностью прочитал это как есть. Тем не менее, покажите, что вы над этим задумались. Что вы имеете в виду под оригиналом? Понимаете ли вы некоторые основы, например, удаление комментариев?   -  person    schedule 16.02.2010
comment
да, по крайней мере, базовый скелет программы, который в основном включает в себя логику   -  person shreyasva    schedule 16.02.2010
comment
Восстановление имен зависит от параметров компилятора. Переключатель gcc -g может сохранить некоторые.   -  person joveha    schedule 16.02.2010
comment
Я только что приготовила рыбный суп. можно мне вернуть оригинальную рыбу?   -  person Stefano Borini    schedule 16.02.2010
comment
Два основных препятствия: оптимизация и удаление информации об имени. В коде времени выполнения компиляторы предпочитают опускать имена функций и переменных, потому что они не нужны. Компиляторы также могут оптимизировать код, чтобы он не выглядел как оригинал, но работал так же.   -  person Thomas Matthews    schedule 16.02.2010
comment
@stefano: если вопрос касается текстовой реконструкции, а не логики, обычная линия гласит: вы можете делать гамбургеры из коров, но не коровы из гамбургеров :)   -  person joveha    schedule 16.02.2010
comment
@stefano это ооочень не аналогия   -  person shreyasva    schedule 18.02.2010
comment
user265260: хоть вкусно.   -  person Stefano Borini    schedule 18.02.2010
comment
Его можно декомпилировать в исходный код (теоретически). Например, каждая инструкция, такая как код ASM - [ADD R0, R1, R2], может быть преобразована в код C - [R0 = R1 + R2;] .. хех, эмулятор статического кода;). Но вы не можете получить настоящий исходный код.   -  person Egg Head    schedule 20.10.2013


Ответы (9)


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

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

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

Изменить

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

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

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

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

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

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

person Filip Ekberg    schedule 16.02.2010

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

person Darin Dimitrov    schedule 16.02.2010
comment
нет не до уровня имен переменных, а по крайней мере логики программы - person shreyasva; 16.02.2010
comment
(а программа была скомпилирована с -g?) - person Tom; 16.02.2010

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

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

person Hans Passant    schedule 16.02.2010
comment
Быстрый анализ нескольких файлов показывает, что 1 КБ - это всего лишь несколько сотен строк машинного кода, и он, как правило, тем меньше, чем больше программа. Анализировать это будет относительно легко для не очень опытного хакера. Однако я сомневаюсь, что кто-то захочет заплатить за необработанный код C, который потребует дальнейшего реверс-инжиниринга, поэтому программисту нужно будет переписать или иным образом документировать код удобным для использования способом. Если вы просто хотите украсть алгоритм или взаимодействовать с конкретным секретным API, это может быть рентабельным, но в остальном это звучит слишком дорого, чтобы беспокоиться. - person ; 16.02.2010

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

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

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

person Ira Baxter    schedule 18.02.2010
comment
Хороший. У меня есть одно предостережение. В результате выполнения одной из моих программ через него создается программа на C, но полученная программа на C не работает из-за того, что код сборки принимает мой нестандартный стековый фрейм. - person Joshua; 01.05.2010
comment
Вы действительно использовали конвертер FermaT? ... Я ожидал, что макет фрейма стека не будет иметь никакого значения; фрейм стека - это просто своего рода структура, и если вы можете предложить разумные структуры для значений кучи, вы сможете сделать это для фреймов стека. Можете привести конкретный пример? - person Ira Baxter; 02.05.2010

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

person joveha    schedule 16.02.2010
comment
Как декомпилятор различает циклы for, while и do-while, если они могут быть по-разному закодированы в исходном коде? Кроме того, как он получает имена исходных функций? Как не оптимизировать код для соответствия оригиналу? Как он определяет имена переменных? Выполните поиск news: comp.lang.c по запросу * hamburger и cow. - person Thomas Matthews; 16.02.2010
comment
Это имеет значение? Либо подойдет, если мне важна логика, а не форма - person joveha; 16.02.2010

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

person John Bode    schedule 16.02.2010

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

person Pascal Cuoq    schedule 16.02.2010

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

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

person Mr. Boy    schedule 16.02.2010

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

person Yuriy Y. Yermilov    schedule 15.03.2010