将代码注入APK

时间:2011-04-29 07:48:54

标签: android code-injection apk

我知道你可以使用apktool反编译代码并重新编译它,但我的问题是你如何能够将大量代码注入apk并执行它。

我看到亚马逊的appstore drm正在这样做我假设,因为他们说他们用他们自己的代码包装apk,一旦你反编译那个apk你就会看到他们已经添加了自己的类com.amazon等。

他们如何实现这一目标?

3 个答案:

答案 0 :(得分:20)

只是为了它的乐趣,我从亚马逊商店下载了一个apk(我从未在今晚之前使用它)并反编译它。你不会在清单中找到太多东西,但是在smali树中有一整套亚马逊类。亚马逊使用的机制在很大程度上超出了我非常有限的理解,但我可以为您指出一些数据。

更新:应用程序需要安装Amazon appstore apk才能运行,所以下面的类使用一些亚马逊活动来检查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(不那么有趣),Base64BC1(用于校验和) )。

在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,解析每个文件,添加必要的类,以及使用相同的密钥重新编译。

答案 1 :(得分:8)

有一个Python lib /工具,paraspace(我的小项目),可以帮助你将一个或多个类从DEX文件注入另一个。它会将给定类的代码插入到目标DEX文件中,并将调用类的所有调用重定向到另一个。因此,您可以实现java.io.File的派生,并用派生替换File的所有调用。

可以在http://hg.assembla.com/paraspace处获得寄生空间,您可以使用hg检索它。 它仍然不成熟,但它对于简单的例子是可行的。如果有副本空间,可以尝试以下命令。

    PYTHONPATH=`pwd` python examples/inject_redir.py data/suffile.dex \
   'Lcom/codemud/fakefile/fakefile;' data/helloworld.dex 'Ljava/io/File;' \
   output.dex

此命令将从suffile.dex读取com.codemud.fakefile.fakefile类并将其注入helloworld.dex,并将其写为output.dex。所有对java.io.File的调用都将被调用com.codemud.fakefile.fakefile的方法所取代。 helloworld.dex和suffile.dex的来源就在这里。

http://www.codemud.net/~thinker/downloads/paraspace-milestone1-sample.tar.gz

FYI

答案 2 :(得分:1)

我认为这篇文章:http://www.bulbsecurity.com/backdooring-apks-programmatically-2/详细描述了如何完成类的注入。我已经按照自己的步骤确认它是否有效,唯一的缺点是apk密钥会改变,这显然是亚马逊的情况。

至于在现有类中注入代码,这也可以通过对smali的一点理解来完成(我也在有限的范围内完成了这一点)。