LINUX.ORG.RU
ФорумTalks

Ламерский вопрос


0

0

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

anonymous

отображение между сишным кодом и ассемблерным не есть взаимно однозначное.

anonymous
()

А что мешает из песка сотворить раковину или из пыли камень ? =)

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

anonymous
()
Ответ на: комментарий от anonymous

Стоп, но ведь исходный код преобразуется в бинарный по чёткому алгоритму, или я что-то не понимаю?

anonymous
()
Ответ на: комментарий от anonymous

Да ну? Прямо таки для любой программы? И что значит "хорошо структурированный"? ЯА для i8086 "хорошо структурирован"?

anonymous
()
Ответ на: комментарий от anonymous

> Хорошо структурированный ассемблер

Это что за чудо такое?

anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()

Дело еще усложняется тем, что разные версии одного и того же компилятора (gcc например), могут компилировать один и тот же код по-разному. Потом еще есть различные флаги оптимизации по скорости, флаги оптимизации под конкретный процессор, различные версии линкуемых библиотек и пр. затрудняющие "декомпилирование" программы. Но самая фундаментальная сложность - неоднозначность.

anonymous
()
Ответ на: комментарий от anonymous

То, что код на С ты можешь преобразовать в несколько вариантов ассемблерного кода, дающего 1 и тот же результат (например, оптимизации и использование разных инструкций, делающих одно и то же) тебя не смущает?

Shaman007 ★★★★★
()
Ответ на: комментарий от Shaman007

Спасибо. Помогли ламеру :) избавили от головной боли :)

anonymous
()
Ответ на: комментарий от anonymous

a+b=c - очень чёткий алгоритм. А теперь, ламер, восстанови из того, что c=4, точные значения a и b. Понял?

anonymous
()
Ответ на: комментарий от anonymous

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

Дизассемблирование программ написаных даже на ассемблере невозможно автоматизировать, что уж говорить о C/C++.

cpu
()

там все правильно сказали, почему этого нелья в принципе сделать
автоматически; но есть такой инструмент как IDA (под винды точно
есть, под линукс не уверен), который пытается эту задачу с переменным
успехом решать. И в некоторой степени, для кода который не был
специально особенно запутан, Си-конструкции восстанавливаются.
Кстати для java по скомпилированному коду исходный текст восстанавливается
практически однозначно, и защита от дизассемблирования там довольно
острая проблема.

anonymous
()
Ответ на: комментарий от anonymous

IDA даже асемблер востановить автоматически не может, что уж говорить о C/C++. Я тебе могу сейчас навернуть иеархию классов которые в результате откомпилируются скажем в вызов printf - какое к чертям востановление кода ?

cpu
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.