Попробую пояснить на пальцах: 2 разных по смыслу и содержанию строки на языке С могут быть транслированы в идентичный ассемблерный код. Если ты захочешь по этому ассемблерному коду восстановить С-шный возникнет неоднозначность. Теперь понятно?
Дело еще усложняется тем, что разные версии одного и того же компилятора (gcc например), могут компилировать один и тот же код по-разному. Потом еще есть различные флаги оптимизации по скорости, флаги оптимизации под конкретный процессор, различные версии линкуемых библиотек и пр. затрудняющие "декомпилирование" программы. Но самая фундаментальная сложность - неоднозначность.
То, что код на С ты можешь преобразовать в несколько вариантов ассемблерного кода, дающего 1 и тот же результат (например, оптимизации и использование разных инструкций, делающих одно и то же) тебя не смущает?
>Стоп, но ведь исходный код преобразуется в бинарный по чёткому >алгоритму, или я что-то не понимаю
Преобразуется, а походу оптимизируется. Вообщем это необратимый процесс, другое дело что изучив ассемблерный текст ты можешь понять алгоритм и написать другую программу с этим алгоритмом, но исходную программу ты получить не сможешь.
Дизассемблирование программ написаных даже на ассемблере невозможно автоматизировать, что уж говорить о C/C++.
там все правильно сказали, почему этого нелья в принципе сделать
автоматически; но есть такой инструмент как IDA (под винды точно
есть, под линукс не уверен), который пытается эту задачу с переменным
успехом решать. И в некоторой степени, для кода который не был
специально особенно запутан, Си-конструкции восстанавливаются.
Кстати для java по скомпилированному коду исходный текст восстанавливается
практически однозначно, и защита от дизассемблирования там довольно
острая проблема.
IDA даже асемблер востановить автоматически не может, что уж говорить о C/C++. Я тебе могу сейчас навернуть иеархию классов которые в результате откомпилируются скажем в вызов printf - какое к чертям востановление кода ?