我知道你可以使用apktool反编译代码并重新编译它,但我的问题是你如何能够将大量代码注入apk并执行它。
我看到亚马逊的appstore drm正在这样做我假设,因为他们说他们用他们自己的代码包装apk,一旦你反编译那个apk你就会看到他们已经添加了自己的类com.amazon等。
他们如何实现这一目标?
答案 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
(不那么有趣),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,解析每个文件,添加必要的类,以及使用相同的密钥重新编译。
答案 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的一点理解来完成(我也在有限的范围内完成了这一点)。