Injection de code dans APK
je sais que vous pouvez décompiler le code en utilisant apktool et le recompiler à nouveau, mais ma question Est de savoir comment vous pouvez injecter de grandes quantités de code dans un apk et l'exécuter.
je vois que l'appstore DRM d'amazon fait cela Im présumant, puisqu'ils disent qu'ils enveloppent l'apk avec leur propre code, et une fois que vous décompilez que apk vous voyez qu'ils ont ajouté là-bas propre classe com.amazon etc.
comment souffrent-ils cela?
3 réponses
juste pour le plaisir, j'ai téléchargé un apk du magasin Amazon (Je ne l'ai jamais utilisé avant ce soir) et je l'ai décomposé. Vous ne trouverez pas grand-chose dans le manifeste, mais il y a un dossier complet de classes Amazones à l'intérieur de l'arbre de smali. Les mécanismes Qu'Amazon utilise dépassent largement ma compréhension très limitée, mais je peux vous indiquer quelques données.
Update : les applications nécessitent L'installation de L'AppStore apk Amazon pour fonctionner, donc les classes ci-dessous utilisent une certaine activité amazon pour vérifier la drm.
Méthode :
$apktool d xxx.apk
$cd xxx/smali
$grep -RHin 'amazon' *
Résultats :
D'abord, vous pourriez vouloir jeter un oeil à
.class public Lcom/amazon/mas/kiwi/util/ApkHelpers;
avec ses méthodes:
.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
dans le même dossier com/amazon/mas/kiwi/util il y a quelques classes supplémentaires, comme DeveloperInfo
(pas que intéressant), Base64
et BC1
(pour dames).
dans le dossier com/amazon/android/, vous trouverez la classe Kiwi
.class public final Lcom/amazon/android/Kiwi;
avec un champ assez évident:
.field private final drmFull:Z
Qui classe le Kiwi est des références dans tous les originaux smali fichier dans l'application. Exemple:
.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
Conclusions :
la méthode consiste à injecter du code dans chaque classe de l'apk, probablement en décomposant l'apk, en analysant chaque fichier, en ajoutant les classes nécessaires, et en recompilant à l'aide de la même clé.
il y a un lib/tool Python, paraspace (mon petit projet), qui peut vous aider à injecter une ou plusieurs classes d'un fichier DEX dans un autre. Il insérera le code de la classe donnée dans le fichier cible DEX, et redirigera tous les appels invoquant une classe vers une autre. Ainsi, vous pouvez implémenter une dérivation de java.io.File, et remplacer tous les appels du fichier par le derivation.
La paraspace est disponible à http://hg.assembla.com/paraspace , vous pouvez récupérer avec hg. Elle est encore immature, mais elle est utilisable pour des exemples simples. Vous pouvez essayer de suivre la commande quand vous avez une copie de paraspace.
PYTHONPATH=`pwd` python examples/inject_redir.py data/suffile.dex \
'Lcom/codemud/fakefile/fakefile;' data/helloworld.dex 'Ljava/io/File;' \
output.dex
cette commande se lira com.codemud.fakefile.fakefile classe de suffile.Dex et l'injecter à helloworld.dex, et l'écrire en sortie.dex. Tous les appels à java.io.File sera remplacé par calling methods of com.codemud.fakefile.fakefile. La source de helloworld.dex et suffile.dex est là.
http://www.codemud.net/~thinker/downloads/paraspace-milestone1-sample.tar.gz
FYI
je pense que ce post: http://www.bulbsecurity.com/backdooring-apks-programmatically-2 / décrit de façon assez détaillée Comment l'injection des classes peut être faite. J'ai suivi les étapes me suis un peut confirmer qu'il fonctionne, avec le seul inconvénient étant que l'apk clé, qui apparemment est le cas avec amazon.
Comme pour l'injection de code dans les classes existantes, cela peut aussi être fait avec un peu de compréhension de smali (j'ai fait aussi sur une échelle limitée).