Пиратство, пиратство, пиратство. Что я могу сделать?
Я только что выпустил приложение, платное приложение, через 4 дня пользователь сказал мне, что есть еще один веб-сайт в Китае, на котором размещено мое приложение. Я скачал его оттуда, и он отлично работает на моем устройстве!
Здесь есть сообщения о том, что люди могут изменить имя пакета и опубликовать apk. Но это не мой случай, взломанная версия все еще использует то же имя пакета. Я использовал Android Vending Licensing в программе, но взломанная версия вообще не выполняет проверку лицензий. Я использовал ProGuard, чтобы запутать его, но это не мешает хакерам.
Вопрос № 1: я подписал файл apk в соответствии с инструкциями Google. Но, тем не менее, они изменили код и сняли часть проверки лицензий. Я ошибаюсь, что подписывание apk-файла предназначено для того, чтобы люди не вмешивались в его содержимое?
Вопрос № 2: Для программ Win32 .exe я использовал контрольную сумму, чтобы определить, был ли файл изменен. Вот как это работает: когда создается.exe, я использовал инструмент для вычисления суммы содержимого в байтах файла, а затем вставил его в какое-то место в файле, например, через 4 байта после текстового шаблона "МОЯ ПОДПИСЬ", Затем во время выполнения программа открывает файл.exe и вычисляет сумму байтов, сравнивает ее с целым числом после подписи.
Кто-нибудь пробовал этот подход на apk-файлах? Хотите поделиться своим опытом?
4 ответа
В конечном счете встроенная защита приложений в Android очень плохая. Вот ваши лучшие практики.
1) Да. Рекомендация Google по использованию обфускации кода, подписанного кода и сервера проверки лицензии предназначена для предотвращения кражи программного обеспечения. Однако их реализация имеет серьезные недостатки. Единственное требование к APK - это его подпись. Неважно, кто подписал это все же. Там нет никаких проверок, что ваша подпись является той, с которой она подписана. Таким образом, чтобы взломать его, вы просто удалите проверку лицензии и заново подпишите с любым сертификатом, который вы хотите. Затем пользователь может загрузить его на свой телефон с отметкой "разрешить нерыночные приложения".
Не используйте лицензирование Google как есть. Модифицировать код сильно. Добавьте некоторые новые параметры для использования при генерации ключей. Переместите код вокруг / перестройте его. Не включайте библиотеку лицензирования Google в качестве библиотечного проекта. Поместите это прямо в ваш код. Сделайте код максимально тонким и хитрым. Добавьте функции, которые ничего не делают, но изменяют значения на лету. Сделайте другие функции позже, чтобы преобразовать их обратно. Распространите проверку лицензии по всей вашей кодовой базе.
Если вы не выполните эти шаги, то код может быть взломан автоматически. Делая эти шаги, по крайней мере, взломщик должен найти время, чтобы взломать его. Это, вероятно, займет не более нескольких часов. Но несколько часов - это гораздо больше, чем мгновенный взлом стандартного уровня лицензирования Google. Существуют инструменты для взлома, которые на самом деле просто автоматически загружают недавно выпущенные пакеты для Android и, если они используют стандартное лицензирование для Android, взламывают их и загружают взломанные APK на эти типы веб-сайтов. Делая вашу реализацию, а не ванильную реализацию, вы делаете вещи намного сложнее, всего лишь за несколько часов усилий.
2) Это распространенная техника против трещин. Вы можете сделать это на Android, если хотите. Но его можно взломать примерно за 5 минут. Если вы Google, есть учебники о том, как взломать эту конкретную технику. По сути, вы просто просматриваете код CRC в коде и удаляете проверку после возвращения CRC.
Android не имеет внутренней безопасности. Вы можете получить root права на любой телефон и скачать APK. Вы можете легко взломать APK для включения отладки и просто пошагово выполнить код, чтобы увидеть все ключи, которые вы сохранили в коде. В итоге я бы не стал тратить на это слишком много времени. Невозможно обеспечить приложение для Android. Я бы просто занялся здравым смыслом из списка выше и продолжил.
3) Если вы действительно параноик, вы можете реализовать свое собственное лицензирование на своем собственном сервере лицензирования. Я выбрал этот подход, но не столько для защиты приложения от кражи, сколько для того, чтобы дать мне механизм для продажи приложений непосредственно с моего веб-сайта, чтобы пользователи, у которых нет Google Play, могли по-прежнему покупать мои приложения.
Пассивное / Агрессивное Бросание
Я согласен с @metalideath в том, что запутывание и создание кода лицензии не является надежным.
Вот легко скрываемая техника, которую я называю "scuttling", которая работает для приложений, развернутых в Google и Amazon. Scuttling - это обнаружение пиратского интерфейса приложений. Что делать, когда обнаружен, находится в распоряжении создателя приложения.
- Агрессивное затопление: напр. Прекращение и / или тревоги на пиратском приложении. Сетевое общение не обязательно требуется.
- Passive Scuttling: нет модификации приложения. Например. включить отслеживание.
- Пассивный / агрессивный Scuttling: тонкая модификация приложения. Например. молча отключить ключевые функции. Привести пирата к мысли, что они напутали, и отменить публикацию пиратского приложения.
Если ваше приложение было переименовано и / или установлено из любого источника, кроме Google или Amazon, scuttle() возвращает true.
// Dont just copy/paste this code - that is what automated crackers look for - cludge it!
// No network communication is required at runtime.
// myPackageName should decode at runtime to "com.yourpackagename"
// google should decode at runtime to "com.android.vending";
// amazon should decode at runtime to "com.amazon.venezia";
public boolean scuttle(Context context, String myPackageName, String google, String amazon)
{
//Scallywags renamed your app?
if (context.getPackageName().compareTo(myPackageName != 0)
return true; // BOOM!
//Rogues relocated your app?
String installer = context.getPackageManager().getInstallerPackageName(myPackageName);
if (installer == null)
return true; // BOOM!
if (installer.compareTo(google) != 0 && installer.compareTo(amazon) != 0)
return true; // BOOM!
return false;
}
РЕЗУЛЬТАТЫ
Следующий снимок экрана был взят из Google Analytics и показывает пиратское бесплатное приложение с трекингом из playstore (com.android.vending), которое было повторно развернуто с агрессивным трепетанием (обнаружение и прекращение установки без playstore). Non-PlayStore (не установлен) отслеживания капель. Отслеживание не требуется, но включено для этих измерений.
ОБСУЖДЕНИЕ
Подписание службы заметок играет важную роль в удалении: менеджер пакетов обеспечивает уникальные имена пакетов с уникальными сигнатурами.
Это ставит вопрос о том, что делать, когда приложение отключено (пират обнаружен приложением). Пиратство - это форма вирусизации (неконтролируемого распространения) вашего приложения. Это уже можно обнаружить, включив бэкэнд отслеживания аналитики. Scuttling позволяет создателю приложения настраивать внешний интерфейс с отслеживанием или без него.
Агрессивное затопление очевидно обнаруживается пиратами (БУМ!). Это способствует дальнейшему взлому. Пассивное переключение гораздо менее очевидно, но может включать в себя отслеживание.
Пиратство не может быть предотвращено, но оно предсказуемо, выявляется и отслеживается.
Отслеживание может представлять непреодолимые проблемы для пиратов, но также представляет свои этические проблемы.
Пассивное / агрессивное переключение, не требующее сетевого взаимодействия, как описано выше, является, пожалуй, лучшим решением. Он легко скрыт (в отличие от лицензирования) и может быть адаптирован как можно более неочевидным.
Лучше всего не беспокоиться об этом. Люди, занимающиеся пиратством в Китае, не являются вашими клиентами и никогда не будут такими. Если бы не было пиратской версии, они все равно не заплатили бы вам за копию, по всей вероятности. Кроме того, если ваше приложение станет популярным, оно все равно будет клонировано, как и приложения для iOS. Системы безопасности, которые вы уже внедрили, - это все, что вам нужно, поскольку они предотвращают пиратство приложения большинством пользователей.
Попытка сделать ваше приложение защищенным от пиратства только повредит кодовой базе и усложнит обслуживание, а также потенциально создаст проблемы для ваших подлинно платящих клиентов. Вместо этого сосредоточьтесь на продвижении своего приложения и облегчении покупателям оплаты и использования. Быстро реагируя на запросы функций и отчеты об ошибках, вы повышаете ценность, за которую люди готовы платить, вместо того, чтобы искать какую-то хитрую взломанную копию на китайском веб-сайте, который, вероятно, в любом случае является трояном.
Наконец, сообщите о пиратских копиях поставщикам антивирусов. Поставляем копии АПК. Они будут добавлять подписи в свои базы данных, чтобы они были помечены как потенциально опасные.
Я связался с Google и был направлен на очень полезную беседу о том, как изменить базовую лицензию LVL. Проверьте этот разговор от Google I/O 2011.
Насколько я понимаю, ознакомившись с условиями рынка Google, вы не можете продавать свое приложение напрямую со своего сайта, поскольку это нарушает условия рынка приложений Google. Я думаю, что реализация пользовательских защит в вашем коде - лучший путь. Стандартные методы просто не эффективны, так как код легко разбирается