Как защитить приложение андроид от копирования
Как запретить приложение Android из приложений, которые могут делать резервную копию файла .apk.
Такие приложения, как файловый менеджер Astro, позволяют пользователю сделать это, menu: tools - > сделайте резервную копию дополнительной информации здесь и можно сделать резервную копию любого установленного apk на SD-карте.
Позже я могу переименовать его в .zip и распаковать, и могу легко украсть DRAWABLE / ASSET из этого приложения.
У меня вопрос: как защитить свое приложение от такой резервной копии?
Насколько мне известно, нет надежного способа остановить это. Но даже в этом случае я всегда спрашивал себя, прежде чем пытаться попробовать, действительно ли меня волнует, если кто-то пытается что-то украсть из моего приложения. Я прилагаю все усилия, чтобы убедиться, что все данные в безопасности.
Это старый вопрос, но если вы хотите защитить свои активы, вы должны зашифровать их. Вы можете расшифровать активы во время выполнения. Это не остановит всех, но будет сложнее скопировать активы.
Если вы хотите защитить свой код, вы должны использовать собственный код. Собственный код сложнее декомпилировать и модифицировать.
Если вы будете использовать java, вы должны запутать свой код.
Попробуйте использовать progaurd, даже если они открыли apk, они не могут видеть файлы внутри этого
На самом деле нет никакого способа запретить пользователю скопировать apk на свой компьютер и открыть его.
То, что говорят ответы, не соответствует действительности. Если вы настроите свое приложение на использование старой защиты от копирования, представленной в маркете (флажок все еще стоит), для чтения APK потребуется телефон с рутированным доступом. Кроме того, я недавно видел приложение (ICE, на случай чрезвычайной ситуации), которое я не мог выполнить резервное копирование, и я думаю, что оно не использовало старую защиту от копирования. Понятия не имею, как это происходит. Кроме того, дело не в «воровстве» активов, это не имеет значения. Для взломщика каждый дополнительный шаг, каждая неприятность, которую он находит на своем пути, подрывает его решимость взломать ваше приложение, вот о чем идет речь. Достаточно одного решительного взломщика, чтобы вокруг бродили тысячи пиратских копий, а мы этого не хотим.
Нет возможности сделать это. То, что есть в вашем APK, можно брать. Вы можете создавать чертежи во время выполнения или извлекать их с сервера - но стоит ли это того? Есть более эффективные способы борьбы с кражей контента, защищенного авторским правом - один из хороших инструментов называется «адвокат».
Уровень пиратства в экосистеме Android таков, что говорить об этом нет никакого смысла. Приложение не только легко украсть — его легко взломать, отвязать от сервисов проверки, отключить рекламу или даже внедрить в него бэкдор. Выкладывая свое творение в Play Store, ты рассчитываешь получить прибыль, а в результате даришь любителям вареза еще один хороший продукт. К счастью, с этим вполне можно бороться.— Как украсть приложение для Android?
— Берешь и крадешь.
Для рубрики «Взлом» я написал цикл статей, в которых наглядно показал, насколько на самом деле легко взламываются приложения для Android. Для этого не нужен даже дизассемблер, достаточно поверхностных знаний Java и языка Smali. Поэтому, если твое приложение будет достаточно популярно, знай: его украдут и путем нехитрых манипуляций активируют платные функции. А если ты решил монетизировать его с помощью рекламы — ее отключат.
Защитить приложение сложно, но можно. Во-первых, стоит сразу отказаться от модели распространения Pro/Lite. Приложение очень легко вытащить со смартфона, поэтому вору будет достаточно один раз купить приложение, и дальше его можно распространять as is. Во-вторых, необходимо позаботиться о защите кода от реверса. Декомпиляция Java-кода — дело простое, а изменение бинарного кода не требует каких-то особых навыков или инструментов. В-третьих, нужно сделать так, чтобы в случае даже успешного взлома приложение просто не стало работать. Тогда взломщику придется решать сразу две задачи: взломать приложение и заставить взломанную версию работать.
Итак, отказываемся от Pro-версии и начинаем борьбу.
Скрываем и запутываем код
Лучший способ защиты кода приложения от реверса — это обфускация, другими словами — запутывание байт-кода так, чтобы реверсеру было невыносимо трудно в нем разобраться. Существует несколько инструментов, способных это сделать. Наиболее простой, но все же эффективный есть в составе Android Studio. Это ProGuard.
Для его активации достаточно добавить в раздел android → buildTypes → release файла build.gradle строку minifyEnabled true :
После этого Android Studio начнет пропускать все «релизные» сборки через ProGuard. В результате приложение станет компактнее (благодаря удалению неиспользуемого кода), а также получит некоторый уровень защиты от реверса. «Некоторый» в том смысле, что ProGuard заменит имена всех внутренних классов, методов и полей на одно-двухбуквенные сочетания. Это действительно существенно затруднит понимание декомпилированного/дизассемблированного кода.
Так выглядят классы в декомпиляторе JADX после применения ProGuard
Следующий шаг — шифрование строк. Это особенно полезно в том случае, если внутри приложения ты хранишь какие-либо сенситивные данные: идентификаторы, ключи, REST API endpoints. Все это поможет взломщику сориентироваться в твоем коде или вычленить из него важную информацию.
Зашифровать строки можно разными способами, например используя инструменты Stringer или DexGuard. Преимущество: полностью автоматизированная модификация уже имеющегося кода с целью внедрения шифрования строк. Недостаток: цена, которая доступна компаниям, но слишком высока для независимого разработчика.
Поэтому мы попробуем обойтись своими силами. В простейшем случае шифрование строк средствами Java выполняется так:
А расшифровка — так:
Для генерации ключа достаточно одной строки:
Смысл в том, чтобы написать простенькое настольное/мобильное приложение на Java, которое возьмет на вход все твои строки и выдаст на выходе их зашифрованные варианты. Далее ты вставляешь эти строки в основное приложение вместо оригинальных и в местах, где происходит к ним обращение, вызываешь функцию decryptString() .
В результате взломщик просто не сможет увидеть зашифрованные строки, декомпилировав приложение. Но, конечно же, сможет написать простейший дешифратор, основанный на декомпилированном коде твоего шифратора. Другими словами, это не панацея, но еще один уровень сложности шифрование строк добавит.
Можно пойти еще дальше и воспользоваться одним из инструментов комплексной защиты Android-приложений, например AppSolid. Стоит оно опять же дорого, но позволяет зашифровать все приложение целиком. Это действительно способно отпугнуть многих реверсеров, однако есть ряд инструментов, в том числе платный Java-декомпилятор JEB, который умеет снимать такую защиту в автоматическом режиме.
Также ты можешь попытаться разбить свое приложение на множество небольших модулей, как я уже писал в статье Пишем модульные приложения для Android. Сам по себе это не метод защиты, и он почти не затруднит работу реверсера. Но зато обломает различные автоматизированные системы кракинга приложений. Они просто не смогут понять, где искать находящийся в модуле код.
Ну и последнее: из кода необходимо обязательно удалить (закомментировать) все обращения к логгеру, то есть все вызовы Log.d() , Log.v() и так далее. Иначе взломщик сможет использовать эту информацию, чтобы понять логику работы приложения.
Крашим взломанное приложение
Окей, жизнь реверсеру мы немного подпортили. Настало время сделать это еще раз! Но как узнать, было ли приложение взломано? Точнее, как оно само может это выяснить? Ведь понятия «взломанное» и «не взломанное» существуют только в наших с тобой головах, то есть это понятия достаточно высокого порядка, которые не описать алгоритмически.
Так оно, да не так. Дело в том, что внутри APK-файла есть набор метаданных, которые хранят контрольные суммы абсолютно всех файлов пакета, а сами метаданные подписаны ключом разработчика. Если изменить приложение и вновь его запаковать, метаданные пакета изменятся и пакет придется подписывать заново. А так как твоего ключа разработчика у реверсера нет и быть не может, он использует либо случайно сгенерированный, либо так называемый тестовый ключ.
Сам Android такое приложение спокойно проглотит (он не держит базу всех цифровых подписей всех возможных Android-разработчиков), но у нас-то есть своя цифровая подпись, и мы можем ее сверить!
Сверяем цифровую подпись
Собственно, метод довольно простой. Тебе необходимо вставить в приложение код, который будет получать хеш ключа текущей цифровой подписи пакета и сравнивать его с ранее сохраненным. Совпадают — приложение не было перепаковано (и взломано), нет — бьем тревогу.
Для начала вставь следующий кусок кода в приложение (чем глубже ты его запрячешь, тем лучше):
Он как раз и будет сверять сохраненный хеш с хешем ключа, которым в данный момент подписано приложение. Функция возвращает true, если цифровая подпись твоя (приложение не было пересобрано), и false — если оно подверглось модификации. Что делать во втором случае — решать тебе. Ты можешь просто завершить приложение с помощью os.exit(0) либо «уронить» его, например вызвав метод неинициализированного объекта или обратившись к несуществующему значению массива.
Но запомни: взломщик может просто вырезать твой код сверки цифровой подписи и он никогда не сработает (это справедливо и в отношении кода, приведенного далее). Поэтому спрячь его в неочевидном месте, а хеш оригинального ключа зашифруй, как было показано выше.
Искомый хеш ключа
Проверяем источник установки
Еще один метод защиты — выяснить, откуда было установлено приложение. Тут логика простая: если источник установки — Play Store, то все нормально, это оригинальное неперепакованное приложение. Если нет — варез, скачанный с форума и установленный с карты памяти или из «черного маркета».
Выяснить, откуда было установлено приложение, можно в одну строку, а сама функция, делающая это, может выглядеть так:
Как обычно: true — все нормально, false — Хьюстон, у нас проблемы.
Определяем эмулятор
Некоторые методы реверса приложений предполагают использование эмулятора. Поэтому нелишним будет внести в приложение код, проверяющий, не запущено ли оно в виртуальной среде. Сделать это можно, прочитав значение некоторых системных переменных. Например, стандартный эмулятор Android Studio устанавливает такие переменные и значения:
Поэтому, прочитав значения этих переменных, можно предположить, что код исполняется в эмуляторе:
Обрати внимание, что класс android.os.SystemProperties скрытый и недоступен в SDK, поэтому для обращения к нему мы используем рефлексию (о скрытых API Android я уже писал).
Также имей в виду, что существует огромное количество других эмуляторов Android и в них значения переменных могут отличаться. Данный код способен обнаружить только стандартный эмулятор Android.
Отладка
Еще один метод реверса — это запуск приложения под управлением отладчика. Взломщик может декомпилировать твое приложение, затем создать в Android Studio одноименный проект, закинуть в него полученные исходники и просто запустить отладку, не компилируя проект. В этом случае приложение само покажет ему свою логику работы.
Чтобы защититься от отладки, можно использовать следующий код:
Так делать не стоит: код проверок необходимо раскидать по коду и продублировать
Выводы
Создать на 100% защищенное приложение у тебя не получится, можешь даже не пытаться. Но есть достаточно простые способы существенно усложнить жизнь среднестатистическому реверсеру. Да, приложение все равно рано или поздно взломают, но так у тебя хотя бы будет время, чтобы заработать на нем. Ну и стоит почаще обновлять свое творение, чтобы реверсерам жизнь медом не казалась.
Евгений Зобнин
Редактор рубрики X-Mobile. По совместительству сисадмин. Большой фанат Linux, Plan 9, гаджетов и древних видеоигр.
И еще, поскольку приложение я пишу на Си, без явы, существующие решения мне может и не помогут, в связи с этим вопрос: а Google Play при передаче APK просто передаёт готовый архив, или может "встроить" в него, например, какой-нибудь идентификационный номер устройства, на которое загружается приложение? Имеется ли что-то подобное в Google Play?
Защита от пиратства должна быть заложена в идеологию получения дохода от приложения, а не решатся техническими методами.
Если вы являетесь создателем софта, продумайте модель, которая исключит пиратство как факт, и не надейтесь на технические методы.
shosh
> идеологию получения дохода от приложения
Приложение платное. Вот и вся идеология.
Требуется исключить (ну, или заметно усложнить) возможность установки приложения бесплатно. А это решается техническими средствами.
ALPINE
Пишите без явы?
ReeV
> Приложение платное. Вот и вся идеология.
Одним этим вы себя обрекаете на борьбу с ветром.
Рассказывайте подробнее, что за невнятные ответы.
ReeV
> Пишите без явы?
Да, пишу без явы.
shosh
> Одним этим вы себя обрекаете на борьбу с ветром.
Почему?
> Рассказывайте подробнее
А что рассказывать? Просто платное приложение. Игрушка. Есть бесплатная лайт-версия с урезанным количеством уровней (демо-версия по сути), есть полная платная версия со всеми уровнями. Монетизация только засчёт покупок платного приложения. Рекламы нет, in-game покупок нет. Вот и всё.
Задача - не допустить (усложнить) установку полной версии бесплатно.
ALPINE
А может продавать остальные уровни in-app purchase-ом?
Пишите свою систему, LVL вас никак не защитит, если ваша поделка станет популярной.
В отличии от iOS, Андроид=целый зоопарк из декартово произведения версий ОС на варианты железа. Гугл очень сильно ступил и не заложил изначально апи, которое всегда и везде гарантированно возвращало бы уникальный номер устройства. Так, чтоб ни рутом ни фектори резетом его сменить нельзя было.
Я бы порекомендовал использовать привязку не к железу, а какой-то учётной записи пользователя. Тогда бы можно было спокойно трекать, кто и как юзает вашу поделку, ваш софт бы время от времени обращался бы к какому-то серверу и запрашивал бы валидацию. Один недостаток -- необходимость интернет подключения для работы вашей софтины.
Уровни грузить из инета. На устройстве храть текущий уровнь и следующий. Это позволит играть офлайн. При прохождении каждого уровня добро пожаловать за следующим.
> А может продавать остальные уровни in-app purchase-ом?
Думал об этом, но "просто игра без заморочек" показалась проще для пользователя. Не найду других решений - придется делать так.
Disabled
> Основная проблема при написании своей защиты-- получить уникальный айди
> устройства на которое ставиться ваш софт
Дело еще в том, что даже если я получу его - что дальше? При покупке же Play Market высылает обычный .apk, общий для всех, я не могу "на той стороне" на основе этого айди что-нибудь сделать. Получается, интернет для докачивания уровней (шифрованных уникальным айди) нужен все равно.
Вот в Steam, насколько я знаю, есть "Custom exe generation" - исполняемый файл генерируется на основе учётки пользователя или как-то так. Подобной фичи у гугла нет? Умеет ли гугл вшивать в .apk что-нибудь уникальное при загрузке приложения?
> Уровни грузить из инета. На устройстве храть текущий уровнь и следующий.
Тоже думал. Идеальная цель - реализовать защиту, не требующую интернет. Не удастся - что ж, буду через инет.
Любые методы защиты бесполезны. Андроидовскую защиту куда сложнее встроить, чем снять. Вообще любую защиту снять совершенно не сложно, в том числе онлайновую.
ALPINE
> Не удастся - что ж, буду через инет.
Лучше даже не пытайтесь :) В отличие от пользователей ПК пользователи телефонов в большинстве случаев не держат постоянное подключении к тырнету. У большинства даже не подключена соответствующая тарифная опция, все качается дома через вайфай.
По опыту скажу, что даже хорошие бесплатные игры сносят только из-за того, что они требуют наличия тырнета при запуске. Вашу же игру просто не купят.
Хуже того, ее декомпилигуют, випилят онлайновую защиту и выложат на торренты, где она будет более привлекательной, чем в маркете.
Наилучшим выходом будет выставить низкую цену на игру. Дополнительные доходы может принести донат за внутриигровые предметы (тут главное не переусердствовать :)
Barabus
Ну я так и думал собственно. даже сам купил игру Spirit и однажды наткнулся на то, что ей нужен инет для запуска. Мелькнула еще мысль - что за херня, пиратка лучше была бы.
Просто хотелось исключить ситуацию, когда ТУПОЕ копирование .apk сразу успешно устанавливает приложение без покупки. Хотелось заставить хоть один бит сменить.
Короче, надо бесплатной демо-версией так сильно привлечь игроков, чтобы они сразу купили полную, позабыв о том, что есть торренты.
ЛИЦЕНЗИОННЫЙ КЛЮЧ ДЛЯ ЭТОГО ПРИЛОЖЕНИЯ
Включите этот открытый ключ RSA в свои исполняемые файлы (удалите пробелы).
Куда вставлять ключ RSA на Гугл Плей что бы защитить приложение от копирования?? и какие пробелы удалить? там в коде нет ни каких пробелов.
У меня есть приложение PhoneGap в Android. Теперь я готов опубликовать его, но хотел бы защитить приложение от глаз сценаристов-детишек. Я сначала подумал, что это невозможно, чем обнаружил функцию "Copy protection" при публикации приложения на рынке. Поэтому я был взволнован, но когда я включил его ON, он на самом деле ничего не делал.
Я могу установить приложение на корневой телефон без проблем, я могу скопировать его на карту SD и увидеть все источники. Я думал, что эта функция "Copy protection" не позволит людям с укоренившимися телефонами установить приложение. Или я что-то упускаю ?
Есть ли ANY способ, как сделать его по крайней мере трудным, если не отключить его вообще, чтобы люди видели все мои источники HTML и JS в моем приложении ?
4 ответа
Как мы можем защитить наше изображение от копирования с нашего веб-сайта? Можем ли мы отключить копирование графического контента с нашего веб-сайта или любого другого?
Мне нужно защитить свое приложение от защиты от копирования. Я видел некоторые приложения на рынке, которые не могут извлечь с помощью каких-либо резервных приложений на моем устройстве android. Как я могу сделать свое заявление тоже против копии?
Функция защиты от копирования устарела в Google. Не используйте его.
Используйте ProGuard для запутывания кода.
Шифруйте свои активы и расшифровывайте их по мере чтения.
Используйте механизм лицензирования , если у вас есть платное приложение.
Лучшая комбинация, которую я нашел, - это DojoToolkit и компилятор закрытия в расширенном режиме.
Закрытие в расширенном режиме делает код JavaScript практически невозможным для обратного проектирования, даже после прохождения через улучшитель. Как только ваш код JavaScript будет запутан до неузнаваемости и любой возможности обратного проектирования, ваш HTML не раскроет большую часть ваших секретов.
Эта ссылка для использования инструментария Dojo с компилятором закрытия в расширенном режиме для мобильных приложений:
Защита от копирования Android market настолько бесполезна, что Google планирует удалить ее.
Если вы хотите, чтобы просмотр встроенных ресурсов был затруднен, вам следует зашифровать их. Это не сделает его невозможным, просто еще более трудным. В конце концов, ключ расшифровки должен быть доступен вашему приложению, и вы должны предполагать, что все, что может сделать ваше приложение, может быть замечено кем-то, кто посвящен ему.
Похожие вопросы:
Я создаю музыкальный плеер в android и загружаю mp3 файлов, купленных Пользователем в нашем магазине (сервере). Как я могу защитить эти загруженные музыкальные файлы от общего доступа, копирования с.
Я хочу защитить свои файлы epub от недопустимого доступа. Кто-нибудь знает, как защитить файл epub от копирования и печати?
Как предотвратить приложение android от приложений, которые могут сделать резервную копию файла .apk. Такие приложения, как astro file manager , позволяют пользователю сделать это, меню: Инструменты.
Как мы можем защитить наше изображение от копирования с нашего веб-сайта? Можем ли мы отключить копирование графического контента с нашего веб-сайта или любого другого?
Мне нужно защитить свое приложение от защиты от копирования. Я видел некоторые приложения на рынке, которые не могут извлечь с помощью каких-либо резервных приложений на моем устройстве android. Как.
Кто-нибудь знает, как с помощью программирования защитить файлы Word (doc или docx) от копирования-редактирования с помощью macros или других методов программирования!?
У меня есть приложение на рынке Android, которое было опубликовано более года назад с использованием устаревшей защиты от копирования рынка (которая все еще активна, но обесценилась по сравнению с.
Я разработал приложение в Oracle Apex 4.2 Я хочу дать экспорт этого приложения и базы данных также одному человеку. Но я не хочу, чтобы он мог обновить это приложение (и базу данных, если это.
как защитить приложение android от резервного копирования моего приложения. apk. Я использую также allowBackup=false. Тем не менее я легко получаю свой .apk через приложения резервного копирования.
Читайте также: