我知道你可以使用apktool反编译代码,然后重新编译它,但我的问题是,你如何能够将大量代码注入到apk中并执行它。
我看到亚马逊的appstore drm正在做这件事,我猜,因为他们说他们用自己的代码包装了apk,一旦你反编译了apk,你就会看到他们已经添加了自己的类com.amazon等。
他们是怎么做到的?
发布于 2011-05-15 15:37:49
为了好玩,我从亚马逊商店下载了一个apk (今晚之前我从未用过它),并反编译了它。您不会在清单中找到太多内容,但在smali树中有一个完整的Amazon类文件夹。亚马逊使用的机制在很大程度上超出了我有限的理解,但我可以向你指出一些数据。
drm :这些应用程序需要安装亚马逊应用商店apk才能运行,所以下面的类使用一些亚马逊活动来检查。
方法
$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/ as /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,解析每个文件,添加必要的类,然后使用相同的键重新编译。
发布于 2011-08-19 11:37:28
有一个Python库/工具paraspace (我的小项目)可以帮助您将一个或多个类从一个DEX文件注入到另一个DEX文件中。它会将给定类的代码插入到目标DEX文件中,并将调用一个类的所有调用重定向到另一个类。因此,您可以实现java.io.File的派生,并将文件的所有调用替换为派生。
http://hg.assembla.com/paraspace上提供了paraspace,您可以使用hg检索它。它还不成熟,但对于简单的例子来说是可行的。当您有paraspace的副本时,可以尝试执行以下命令。
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
仅供参考
发布于 2015-08-29 13:59:59
我认为这篇文章:http://www.bulbsecurity.com/backdooring-apks-programmatically-2/非常详细地描述了如何实现类的注入。我自己已经遵循了这些步骤,并且可以确认它是有效的,唯一的缺点是apk密钥将会改变,这显然是亚马逊的情况。
至于在现有类中注入代码,这也可以通过对smali的一些了解来完成(我已经在有限的规模上做到了这一点)。
https://stackoverflow.com/questions/5829424
复制相似问题