Это руководство предназначено для разработчиков приложений для Android, которые получают доход от IAP и хотят защитить себя от хакеров и мошеннических покупок с помощью хакерских инструментов. Существует несколько известных инструментов взлома IAP, которые я не буду здесь перечислять, но в основном эти инструменты отправляют в ваше приложение ложные квитанции о покупке, чтобы позволить пользователю пользоваться бесплатными IAP. Это может быть что угодно, от ежемесячной подписки до внутриигровых токенов.
В то время как новые версии этих хакерских инструментов всегда выпускаются, и очень важно внимательно следить за их последними обновлениями и методами, есть несколько вещей, которые вы можете сделать, чтобы защитить IAP ваших приложений от кражи. В частности, вам необходимо включить несколько методов проверки IAP на стороне сервера, которые я подробно опишу ниже.
Это руководство предназначено не для новичков, а для опытных разработчиков приложений, которые разбираются в различных языках в этом руководстве.
Использование подключаемого модуля Git Repo Специально для этой цели:
PiracyChecker
Добавьте репозиторий в ваш проект build.gradle:
репозитории {
maven {
URL «https://jitpack.io»
}
}
И добавьте библиотеку в свой модуль build.gradle:
зависимости {
скомпилируйте com.github.javiersantos: PiracyChecker: 1.1
}
рекомендации
- Всегда включайте ProGuard в ваших производственных выпусках.
- PiracyChecker должен быть включен в ваш метод onCreate, чтобы как можно скорее проверить действующую лицензию.
- Рекомендуется показывать новую активность вместо диалога, когда лицензия недействительна. Таким образом, вы убедитесь, что основное действие приложения завершено. См. «Отображение результатов в диалоге или новой активности».
Проверьте лицензирование Google Play (LVL)
Google Play предлагает службу лицензирования, которая позволяет вам применять политики лицензирования для приложений, которые вы публикуете в Google Play. С помощью Google Play Licensing ваше приложение может запросить Google Play, чтобы получить статус лицензии для текущего пользователя.
Любое приложение, которое вы публикуете через Google Play, может использовать сервис лицензирования Google Play. Никакой специальной учетной записи или регистрации не требуется.
новый PiracyChecker (это)
.enableGooglePlayLicensing ( «BASE_64_LICENSE_KEY»)
…
.Начните();
Чтобы получить лицензионный ключ BASE64, ваше приложение должно быть загружено в консоль разработчика Google Play. Затем доступ к вашему приложению -> Сервисы и API.
При использовании Google Play Licensing вы должны вызывать .destroy () в методе onDestroy () вашей Activity, чтобы избежать нескольких запущенных сервисов.
Проверьте сертификат подписи вашего приложения (подпись)
Разработчики должны всегда подписывать приложения своим закрытым ключом / сертификатом (содержащимся в файле .keystore), прежде чем приложение можно будет установить на пользовательские устройства. Сертификат подписи должен оставаться неизменным в течение всего срока службы приложения, и обычно срок его действия составляет 25 лет.
Подпись приложения будет нарушена, если файл .apk будет каким-либо образом изменен — неподписанные приложения обычно не могут быть установлены. Например, мы можем представить, как злоумышленник удаляет код проверки лицензии, чтобы включить все функции приложения без оплаты. Более опасный пример — изменение .apk для включения вредоносного ПО в легитимное приложение для сбора конфиденциальных пользовательских данных. Чтобы установить измененный .apk, злоумышленник должен подать в отставку.
новый PiracyChecker (это)
.enableSigningCertificate («478yYkKAQF + KST8y4ATKvHkYibo =») // Исходная подпись APK для версии PRODUCTION
…
.Начните();
БЫТЬ ОСТОРОЖЕН!! Ваша подпись приложения может быть получена с помощью метода PiracyCheckerUtils. Убедитесь, что вы подписали свой APK с помощью хранилища ключей PRODUCTION (не использует DEBUG) и установили версию, которую планируете распространять. Затем скопируйте подпись, возвращенную этим методом, в консоль и вставьте .enableSigningCertificate («YOUR_APK_SIGNATURE»)
// Этот метод напечатает подпись вашего приложения в консоли
Log.e («ПОДПИСЬ», PiracyCheckerUtils.getAPKSignature (это));
Проверьте установщик
Если вы планируете распространять приложение только в определенном магазине, этот метод заблокирует установку приложения из любого другого магазина.
Поддерживаемые магазины: Google Play, Amazon App Store и Samsung Galaxy Apps.
новый PiracyChecker (это)
.enableInstallerId (InstallerID.GOOGLE_PLAY)
.enableInstallerId (InstallerID.AMAZON_APP_STORE)
.enableInstallerId (InstallerID.GALAXY_APPS)
…
.Начните();
БЫТЬ ОСТОРОЖЕН!! Это действительно ограничительный метод, поскольку он блокирует установку вашего приложения с использованием другого рынка или прямой установки .apk на устройство. Это не рекомендуется в большинстве случаев.
Проверьте использование пиратских приложений
Если вы хотите проверить, установлены ли у пользователя пиратские приложения, вы можете использовать этот код.
Он проверит: Lucky Patcher, Uret Patcher, Freedom и CreeHack.
новый PiracyChecker (это)
.enableUnauthorizedAppsCheck ()
…
.Начните();
Вы можете заблокировать приложение, даже если это пиратское приложение было удалено. Это предотвращает исправление приложения, а затем удаляет пиратское приложение, чтобы продолжить использование приложения. Библиотека сохранит значение SharedPreference, чтобы узнать, когда было обнаружено пиратское приложение.
Есть два способа сделать это:
Определите SharedPreferences и имя предпочтения, где вы хотите сохранить результат.
новый PiracyChecker (это)
.enableUnauthorizedAppsCheck ()
.blockIfUnauthorizedAppUninstalled (настройки, «app_unauthorized») // Измените «app_unauthorized» на собственное значение
…
.Начните();
Определите имя SharedPreferences и имя предпочтения, где вы хотите сохранить результат.
новый PiracyChecker (это)
.enableUnauthorizedAppsCheck ()
.blockIfUnauthorizedAppUninstalled («license_preferences», «app_unauthorized») // Измените «license_preferences» и «app_unauthorized» со своим собственным значением
…
.Начните();
Проверьте использование сторонних приложений магазина
Если вы хотите проверить, установлены ли у пользователя сторонние приложения для магазина, вы можете использовать этот код.
Он проверит: Aptoide, BlackMart, Mobogenie, 1Mobile, GetApk, GetJar, SlideMe и ACMarket.
новый PiracyChecker (это)
.enableStoresCheck ()
…
.Начните();
Проверьте, является ли приложение отладочной сборкой
Если ваше приложение работает на эмуляторе вне процесса разработки, это указывает на то, что кто-то, кроме вас, пытается проанализировать приложение.
новый PiracyChecker (это)
.enableDebugCheck ()
…
.Начните();
Проверьте, запущено ли приложение в эмуляторе
Вне разработки маловероятно, что ваше приложение должно работать на эмуляторе, и выпуск приложений с включенной функцией отладки не рекомендуется, поскольку он позволяет подключенным компьютерам получать доступ и отлаживать приложение через Android Debug Bridge.
логическое глубокое = ложное;
новый PiracyChecker (это)
.enableEmulatorCheck (глубокая)
…
.Начните();
Замечания: глубокое логическое значение с заставкой библиотеки делать дополнительные проверки, чтобы определить, является ли устройство эмулятором или нет. Это может привести к некоторым странным сбоям, поэтому будьте мудры при его использовании.
Сохранить результат проверки лицензии в SharedPreferences
Сохранение результата проверки лицензии полезно для проверки состояния лицензии без многократного вызова .start ().
Есть два способа сделать это:
Определите SharedPreferences и имя предпочтения, где вы хотите сохранить результат.
новый PiracyChecker (это)
.saveResultToSharedPreferences (предпочтения, «valid_license») // Измените «valid_license» своим собственным значением
…
.Начните();
Определите имя SharedPreferences и имя предпочтения, где вы хотите сохранить результат.
новый PiracyChecker (это)
.saveResultToSharedPreferences («license_preferences», «valid_license») // Замените «license_preferences» и «valid_license» своим собственным значением
…
.Начните();
Адаптации
Отображать результаты в диалоге или новой активности
Рекомендуется показывать новую активность вместо диалога, когда лицензия недействительна. Таким образом, вы убедитесь, что основное действие приложения завершено.
По умолчанию будет отображаться неотменяемый диалог.
новый PiracyChecker (это)
.дисплей (Display.ACTIVITY)
…
.Начните();
По умолчанию отображаемое действие будет использовать цвета библиотеки. Чтобы применить пользовательский основной и основной темный цвет и определить, должна ли активность отображать обычную или светлую строку состояния, используйте:
.withActivityColors (R.color.colorPrimary, R.color.colorPrimaryDark, withLightStatusBar)
Вы также можете определить пользовательский макет XML для этого содержимого деятельности, используя:
.withActivityLayout (R.layout.my_custom_layout)
Использование пользовательских обратных вызовов
Добавление обратного вызова к сборщику позволяет вам настроить то, что будет происходить после проверки лицензии, и управлять ошибками проверки лицензии, если пользователю не разрешено использовать приложение. Имейте в виду, что при использовании этого метода Вы должны знать о блокировке приложения от неавторизованных пользователей.
По умолчанию библиотека будет отображать неотменяемое диалоговое окно, если пользователю не разрешено использовать приложение, иначе ничего не произойдет.
Используйте строитель и добавьте следующее:
.обратный вызов (новый PiracyCheckerCallback () {
@Override
public void allow () {
// Делаем что-то, когда пользователю разрешено использовать приложение
}
@Override
public void dontAllow (ошибка @NonNull PiracyCheckerError, приложение @Nullable PirateApp) {
// Вы можете сделать что-то конкретное, когда пользователю не разрешено использовать приложение
// Или самостоятельно обработайте ошибку, используя параметр «error» (проверьте ошибки в {@link PiracyCheckerError}).
// Кроме того, если вы включили проверку пиратских приложений и / или сторонних магазинов, параметр «app»
// это приложение, которое было обнаружено на устройстве. App может иметь значение NULL, а если NULL, это означает, что пиратское приложение или магазин не найдены,
// или вы отключили проверку для этих приложений.
// Это позволяет пользователям узнать возможные причины, по которым лицензия была недействительной.
}
@Override
public void onError (ошибка @NonNull PiracyCheckerError) {
// Этот метод не обязательно должен быть реализован / переопределен, но…
// Вы можете сделать что-то конкретное, если при проверке лицензии возникает ошибка,
// Или самостоятельно обработайте ошибку, используя параметр «error» (проверьте ошибки в {@link PiracyCheckerError}).
}
})