首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将代码注入APK

将代码注入APK
EN

Stack Overflow用户
提问于 2011-04-29 15:48:54
回答 3查看 16.3K关注 0票数 15

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

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

他们是怎么做到的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-15 15:37:49

为了好玩,我从亚马逊商店下载了一个apk (今晚之前我从未用过它),并反编译了它。您不会在清单中找到太多内容,但在smali树中有一个完整的Amazon类文件夹。亚马逊使用的机制在很大程度上超出了我有限的理解,但我可以向你指出一些数据。

drm :这些应用程序需要安装亚马逊应用商店apk才能运行,所以下面的类使用一些亚马逊活动来检查

方法

代码语言:javascript
复制
$apktool d xxx.apk
$cd xxx/smali
$grep -RHin 'amazon' *

调查结果

首先,您可能想看一下

代码语言:javascript
复制
.class public Lcom/amazon/mas/kiwi/util/ApkHelpers;

使用它的方法:

代码语言:javascript
复制
.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 (不是很有趣),Base64BC1 (用于校验和)。

在com/amazon/android/文件夹中,您将找到类 Kiwi

代码语言:javascript
复制
.class public final Lcom/amazon/android/Kiwi;

有一个非常明显的字段:

代码语言:javascript
复制
.field private final drmFull:Z

这个类Kiwi在应用程序中的每个原始smali文件中都有引用。示例:

代码语言:javascript
复制
.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,解析每个文件,添加必要的类,然后使用相同的键重新编译。

票数 22
EN

Stack Overflow用户

发布于 2011-08-19 11:37:28

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

http://hg.assembla.com/paraspace上提供了paraspace,您可以使用hg检索它。它还不成熟,但对于简单的例子来说是可行的。当您有paraspace的副本时,可以尝试执行以下命令。

代码语言:javascript
复制
    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

仅供参考

票数 8
EN

Stack Overflow用户

发布于 2015-08-29 13:59:59

我认为这篇文章:http://www.bulbsecurity.com/backdooring-apks-programmatically-2/非常详细地描述了如何实现类的注入。我自己已经遵循了这些步骤,并且可以确认它是有效的,唯一的缺点是apk密钥将会改变,这显然是亚马逊的情况。

至于在现有类中注入代码,这也可以通过对smali的一些了解来完成(我已经在有限的规模上做到了这一点)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5829424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档