В любом случае, мой вопрос заключается в следующем: почему приложение Java может быть декомпилировано?
Любое приложение на любом языке может быть декомпилировано. Это должно быть очевидно для любого, у кого есть сложный опыт программирования на скомпилированном языке программирования.
Компилятор берет байты и создает другой набор байтов, представляющий один и тот же набор инструкций. Декомпилятор берет байты и создает другой набор байтов, который представляет один и тот же набор инструкций. Разница лишь в том, что эти байты. Компилятор берет байты, которые (относительно) читаются человеком и создают байты, которые (относительно) считаны машинами. Декомпилятор делает обратное.
Как скважина данный декомпилятор может выполнять свою работу, однако, зависит от языка программирования и реализации самого декомпилятора.
В случае языка, такого как C, компилятор генерирует машинные инструкции для CPU. Они могут быть легко декомпилированы в язык ассемблера, поскольку инструкции ассемблера достаточно точно сопоставляют 1: 1 с машинным инструкциям. Достаточно сложный декомпилятор может испускать C как вывод, хотя, вероятно, не C, что было бы естественным для записи. Что еще более важно, декомпилированный вывод будет в значительной степени использовать генерируемые декомпилятором имена для функций и переменных, если только скомпилированный код C не имеет отладочных символов, и в этом случае декомпилятор может их использовать.
Язык, подобный Java, в концепции существенно не отличается. Хотя байт-код Java или Dalvik для виртуальной машины, а не для процессора, базовый подход тот же. Обфускация помогает обеспечить минимальное количество человекочитаемых символов в полученном байт-коде, чтобы уменьшить удобочитаемость любых декомпилированных результатов. Кроме того, сопоставление байт-кода VM с языковыми инструкциями, как правило, намного ближе, чем сопоставление машинного кода с операторами C, что упрощает запись декомпилятора, который дает вам ближе к синтаксису Java назад (например, smali/baksmali).
Это сложность в интерпретации декомпилированного машинного кода, что приводит к рекомендациям по переходу на логику управления лицензиями в собственный код через NDK. Однако это не означает, что результаты компилятора C вообще нельзя декомпилировать.
Это не повод. Любой скомпилированный язык может быть декомпилирован. Если A + B = C, C - B = A. – Simon
Если Java-класс * не может быть декомпилирован, как может VM * запустить * это? (Даже код, скомпилированный в ML, должен быть * понят * процессором.) Обратите внимание, что обфускация отличается от компиляции: obfuscation предназначена для того, чтобы сделать декомпилированный скомпилированный вывод * менее дружественным * для людей (например, идентификатор/код). Машины не заботятся - и не тот, кто действительно хочет видеть, как это делается. – user2246674
, почему же нельзя сделать то же самое для приложений iOS? – rusty009