2013-06-04 2 views
-2

Недавно я работал над некоторыми приложениями для Android, и я немного разочарован тем, что мои приложения могут быть обратно спроектированы. Я обдумываю свой код, но это может только зайти так далеко, талантливый разработчик может легко обойти обсчету.Почему Java-приложения/апплеты могут быть декомпилированы?

В любом случае, мой вопрос в том, почему приложение Java может быть декомпилировано? Какая часть дизайна Java позволяет декомпилировать его приложение?

Я понимаю, что приложения Java используют JIT-компиляцию, поэтому они компилируются только до того, как они используются для повышения эффективности, это правильно? Я хотел бы узнать причину,

спасибо!

+6

Это не повод. Любой скомпилированный язык может быть декомпилирован. Если A + B = C, C - B = A. – Simon

+2

Если Java-класс * не может быть декомпилирован, как может VM * запустить * это? (Даже код, скомпилированный в ML, должен быть * понят * процессором.) Обратите внимание, что обфускация отличается от компиляции: obfuscation предназначена для того, чтобы сделать декомпилированный скомпилированный вывод * менее дружественным * для людей (например, идентификатор/код). Машины не заботятся - и не тот, кто действительно хочет видеть, как это делается. – user2246674

+0

, почему же нельзя сделать то же самое для приложений iOS? – rusty009

ответ

3

В любом случае, мой вопрос заключается в следующем: почему приложение Java может быть декомпилировано?

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

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

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

В случае языка, такого как C, компилятор генерирует машинные инструкции для CPU. Они могут быть легко декомпилированы в язык ассемблера, поскольку инструкции ассемблера достаточно точно сопоставляют 1: 1 с машинным инструкциям. Достаточно сложный декомпилятор может испускать C как вывод, хотя, вероятно, не C, что было бы естественным для записи. Что еще более важно, декомпилированный вывод будет в значительной степени использовать генерируемые декомпилятором имена для функций и переменных, если только скомпилированный код C не имеет отладочных символов, и в этом случае декомпилятор может их использовать.

Язык, подобный Java, в концепции существенно не отличается. Хотя байт-код Java или Dalvik для виртуальной машины, а не для процессора, базовый подход тот же. Обфускация помогает обеспечить минимальное количество человекочитаемых символов в полученном байт-коде, чтобы уменьшить удобочитаемость любых декомпилированных результатов. Кроме того, сопоставление байт-кода VM с языковыми инструкциями, как правило, намного ближе, чем сопоставление машинного кода с операторами C, что упрощает запись декомпилятора, который дает вам ближе к синтаксису Java назад (например, smali/baksmali).

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

+1

Вывод заключается в том, что почти ничего не может быть сделано для того, чтобы сделать изначально код запуска невозможным для декомпиляции и понимания. Если вы действительно не хотите, чтобы кто-то мог понять логику приложения, единственное, что нужно сделать, - никогда не распространять этот код (запускать его на своем сервере и использовать RESTful API или что-то еще). Даже аппаратные средства не защищены от декомпиляции (обратная инженерия), так как всегда будет кто-то достаточно умный, чтобы взять готовый продукт и выяснить, как он был построен. Практически это неэффективно. – LucienK

+0

@Dazedy: «Если вы действительно не хотите, чтобы кто-то мог понять логику приложения, единственное, что нужно сделать, - никогда не распространять этот код», - согласился. То же самое относится и к данным: если вы не хотите, чтобы пользователи имели доступ к «вашим» данным, не кладите их на свое устройство. – CommonsWare

+0

Одной из основных причин нарушения безопасности/данных является то, что информация была помещена в недостаточно защищенную среду. IE: Неважно, сколько паролей вы наденете на свой ноутбук, если вы выйдете на крыльцо по ночам, скорее всего, кто-то возьмет его. Информация еще сложнее быть осторожной из-за того, что вещи взаимосвязаны. – LucienK

Смежные вопросы