是否可以在Android应用程序中注入代码?

时间:2010-11-23 19:52:34

标签: android bytecode dalvik bytecode-manipulation

我想在运行时在android应用程序中注入代码。我曾尝试使用dx工具在sdcard中生成dexfile,但是当我想要实例化时,它会失败。是否有任何工具可以注入生成新dalvik字节码的代码?我正在研究一些库,aspecjt或guice for android。使用脚本语言更好吗?

谢谢大家:)

5 个答案:

答案 0 :(得分:6)

Dexmaker是新的,专为此而设计。以下是项目网站示例的一部分:

    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);

答案 1 :(得分:2)

您可以使用DexClassLoader类指定自己的DEX文件。一些需要“插件”行为的应用程序使用此功能。

然而,设备上没有任何内容可以生成DEX文件。没有机制可以动态生成代码并使用它。

答案 2 :(得分:0)

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

此示例使用ASM和BCEL在设备上生成两个类。 这些类被创建到SD卡内存中,然后动态加载到Android操作系统中。

以下类是示例的模板:

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);
    }

}

首先,我使用BCEL或ASM在SD卡中创建一个新的ad-hoc类。 其次,我已经使用SD卡中的Dxclient utiliy将Java类转换为Dex类。 最后我创建了一个jar文件,然后我将这个软件包从SD卡加载到设备中

DXClient参考

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

答案 3 :(得分:-1)

您可以查看此页面,但必须使用某些工具,例如APKTool,SignApk。

http://blackhatcrackers.blogspot.de/2013/05/injecting-custom-code-into-android-apks.html

答案 4 :(得分:-10)

不,这是不可能的。如果可能的话,Android应用程序权限将不起作用。