2010-11-23 30 views
5

Je voudrais injecter du code dans une application Android à l'exécution. J'ai essayé d'utiliser l'outil dx pour générer un fichier dex dans la carte SD, mais quand je veux instancier, il échoue. Existe-t-il des outils pour injecter du code générant un nouveau bytecode dalvik? J'étudie quelques bibliothèques, aspecjt ou guice pour android. Est-il préférable de travailler avec un langage de script?Est-il possible d'injecter du code dans une application Android?

Merci les gens :)

+0

On dirait que tout ce que vous faites est extrêmement mal et même si elle fonctionne, a une utilisation plus malicieuse que légitime – Falmarri

+0

Ce n'est pas l'idée, je voudrais utiliser un outil similaire à BCEL Ou ASM. Vous pouvez adapter le code aux informations disponibles. ; P – Sergio

+1

Si vous souhaitez étendre l'une de vos applications auto-écrites en invoquant du code ajouté dynamiquement, veuillez réécrire la question pour le dire. –

Répondre

-10

Non, ce n'est pas possible. Les autorisations d'application Android ne fonctionneraient pas si cela était possible.

+6

Les autorisations d'application Android sont totalement indépendantes de cela. Les autorisations (comme l'accès réseau et le stockage externe) doivent fonctionner avec le code natif, elles sont donc basées sur les mécanismes de sécurité des processus Linux plutôt que sur les fonctionnalités de langue. Sauf un trou de sécurité, il n'y a rien qu'une application peut faire pour les contourner. – fadden

+0

Bon point. Je n'y pensais pas avant de répondre. – Juhani

2

Vous pouvez spécifier votre propre fichier DEX avec la classe DexClassLoader. Ceci est utilisé par quelques applications qui veulent un comportement "plugin".

Toutefois, rien sur l'appareil ne génère de fichiers DEX. Il n'y a aucun mécanisme pour générer du code à la volée et en faire usage.

0

Generating Dalvik Bytecode at Runtime on-device Using ASM or BCEL

Cet exemple l'utilisation ASM et BCEL pour generete deux classes sur l'appareil. Les classes sont créées dans la mémoire de la carte SD, puis chargées dynamiquement dans le système d'exploitation Android.

La classe suivante est le modèle de l'exemple:

public class HelloWorld { 
    public static void hello(){ 
     int a=0xabcd; 
     int b=0xaaaa; 
     int c=a-b; 
     String s=Integer.toHexString(c); 
     System.out.println(s); 
    } 

} 

Tout d'abord, je l'ai utilisé BCEL ou ASM pour créer une nouvelle classe ad hoc dans la carte SD. Deuxièmement, j'ai converti la classe Java en une classe Dex avec l'utilitaire Dxclient dans la carte SD. Enfin j'ai créé un fichier jar puis j'ai chargé ce paquet dans le dispositif de carte SD

de référence DXClient

https://github.com/headius/dexclient/blob/master/src/DexClient.java

5

Dexmaker est nouveau et conçu spécialement pour cela. Voici une partie de l'exemple du site Web du projet:

DexMaker dexMaker = new DexMaker(); 

    // Generate a HelloWorld class. 
    TypeId<?> helloWorld = TypeId.get("LHelloWorld;"); 
    dexMaker.declare(helloWorld, "HelloWorld.generated", Modifier.PUBLIC, TypeId.OBJECT); 
    generateHelloMethod(dexMaker, helloWorld); 

    // Create the dex file and load it. 
    File outputDir = new File("."); 
    ClassLoader loader = dexMaker.generateAndLoad(HelloWorldMaker.class.getClassLoader(), 
      outputDir, outputDir); 
    Class<?> helloWorldClass = loader.loadClass("HelloWorld"); 

    // Execute our newly-generated code in-process. 
    helloWorldClass.getMethod("hello").invoke(null);