Почему декомпиляторы не могут создать оригинальный код теоретически - PullRequest
0 голосов
/ 14 июля 2011

Я искал в интернете, но не нашел конкретного ответа, почему декомпиляторы не могут создать оригинальный исходный код. Я не получаю удовлетворительного ответа. Где-то было написано, что это похоже на остановку проблемы, но не подскажите, как. Итак, каково теоретическое и техническое ограничение создания идеального декомпилятора.

Ответы [ 4 ]

4 голосов
/ 14 июля 2011

Это, просто, проблема «многие к одному». Например, в C:

b++;

и

b+=1;

и

b = b + 1;

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

Он даже достаточно умен, чтобы удалить ненужные переменные:

{
a=5;
b=func();
c=a+b;
d=func2(c);
}
## gets rewritten as:
REGISTERA=func()
REGISTERA+=5
return(func2(REGISTERA))
3 голосов
/ 14 июля 2011

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

2 голосов
/ 14 июля 2011

Компиляторы выкидывают информацию;не вся информация в исходном коде находится в скомпилированном коде.Например, в скомпилированной Java вы не можете определить разницу между параметризованным и непараметризованным универсальным типом, потому что информация используется только компилятором;некоторые аннотации используются только во время компиляции и не включаются в скомпилированный вывод.Это не значит, что вы не можете получить какой-то исходный код путем декомпиляции;он просто не будет соответствовать и не будет настолько информативным, как реальный исходный код.

1 голос
/ 14 июля 2011

Обычно между исходным кодом и скомпилированным кодом нет соответствия 1: 1. Если по существу бесконечное количество возможных источников может привести к одному и тому же объектному коду (с учетом неограниченных длин имен переменных и т. Д.), Как декомпилятору угадать, какой из них выплевывать?

...