Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

Тот Самый Шестигранные лучи декомпилятор (расширение для IDA Pro) может сделать именно это.Это все еще довольно недавний проект, который только намечается, но подает большие надежды.К этому нужно немного привыкнуть, но потенциально это может ускорить процесс обращения вспять.Это не "серебряная пуля" - никакой декомпилятор c таковым не является, но это отличный актив.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top