Ответ 1
Просто для удовольствия, я загрузил apk из магазина Amazon (я никогда не использовал его до сегодняшнего вечера) и декомпилировал его. Вы не найдете много в манифесте, но там есть целая папка классов Amazon внутри дерева smali. Механизмы, которые использует Amazon, в значительной степени превышают мое очень ограниченное понимание, но я могу указать вам некоторые данные.
Обновить: приложения требуют, чтобы apk app appore Store был установлен для того, чтобы функционировать, поэтому нижеприведенные классы используют некоторую активность amazon для проверки drm.
Метод:
$apktool d xxx.apk
$cd xxx/smali
$grep -RHin 'amazon' *
Выводы
Во-первых, вы можете взглянуть на
.class public Lcom/amazon/mas/kiwi/util/ApkHelpers;
с его методами:
.method public static getApkSignature(Ljava/lang/String;)[B
.method private static getCodeSigners(Ljava/util/jar/JarFile;)[Ljava/security/CodeSigner;
.method public static getContentID(Ljava/util/jar/JarFile;)Ljava/lang/String;
.method public static getContentIDFromName(Ljava/lang/String;)Ljava/lang/String;
.method private static getFirstSigningCert(Ljava/util/jar/JarFile;)Ljava/security/cert/Certificate;
.method public static isSigned(Ljava/util/jar/JarFile;)Z
.method private static scanJar(Ljava/util/jar/JarFile;)V
В той же папке com/amazon/mas/kiwi/util есть еще несколько классов, таких как DeveloperInfo
(не так интересно), Base64
и BC1
(для контрольных сумм).
В папке com/amazon/android/вы найдете класс Kiwi
.class public final Lcom/amazon/android/Kiwi;
с вполне очевидным полем:
.field private final drmFull:Z
Этот класс Kiwi является ссылкой в каждом оригинальном файле smali в приложении. Пример:
.method public onCreate(Landroid/os/Bundle;)V
.locals 1
invoke-virtual {p0, p1}, Lxxx/xxxx/Xxxx;->xxxxXxxxx(Landroid/os/Bundle;)V
const/4 v0, 0x1
invoke-static {p0, v0}, Lcom/amazon/android/Kiwi;->onCreate(Landroid/app/Activity;Z)V
return-void
.end method
Выводы
Метод включает в себя инъекцию кода в каждый класс apk, возможно, путем декомпиляции apk, разбора каждого файла, добавления необходимых классов и повторной компиляции с использованием того же ключа.