Fai*_*bid 13 android code-injection apk
我知道你可以使用apktool反编译代码并重新编译它,但我的问题是你如何能够将大量代码注入apk并执行它.
我看到亚马逊的appstore drm正在做这个我假设,因为他们说他们用他们自己的代码包装apk,一旦你反编译那个apk你就会看到他们已经添加了自己的类com.amazon等.
他们如何实现这一目标?
Ale*_*dam 20
只是为了它的乐趣,我从亚马逊商店下载了一个apk(我从未在今晚之前使用它)并反编译它.你不会在清单中找到太多东西,但是在smali树中有一整套亚马逊类.亚马逊使用的机制在很大程度上超出了我非常有限的理解,但我可以为您指出一些数据.
更新:应用程序需要安装Amazon appstore apk才能运行,因此下面的类使用一些亚马逊活动来检查drm.
方法:
$apktool d xxx.apk
$cd xxx/smali
$grep -RHin 'amazon' *
Run Code Online (Sandbox Code Playgroud)
调查结果:
首先,您可能想看看
.class public Lcom/amazon/mas/kiwi/util/ApkHelpers;
Run Code Online (Sandbox Code Playgroud)
用它的方法:
.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
Run Code Online (Sandbox Code Playgroud)
在同一个com/amazon/mas/kiwi/util文件夹中还有一些类,例如DeveloperInfo(不那么有趣)Base64和BC1(对于校验和).
在com/amazon/android /文件夹中,您将找到该类 Kiwi
.class public final Lcom/amazon/android/Kiwi;
Run Code Online (Sandbox Code Playgroud)
有一个非常明显的领域:
.field private final drmFull:Z
Run Code Online (Sandbox Code Playgroud)
该类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
Run Code Online (Sandbox Code Playgroud)
结论:
该方法涉及在apk的每个类中注入代码,可能是通过反编译apk,解析每个文件,添加必要的类,以及使用相同的密钥重新编译.
有一个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
Run Code Online (Sandbox Code Playgroud)
此命令将从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
| 归档时间: |
|
| 查看次数: |
14316 次 |
| 最近记录: |