Внедрение кода в APK - PullRequest
       2

Внедрение кода в APK

13 голосов
/ 29 апреля 2011

Я знаю, что вы можете декомпилировать код с помощью apktool и перекомпилировать его снова, но мой вопрос заключается в том, как вы сможете внедрить большое количество кода в apk и выполнить его.

Я вижу, что Amazon AppStore drmя делаю это, я предполагаю, так как они говорят, что оборачивают apk своим собственным кодом, и как только вы декомпилируете этот apk, вы увидите, что они добавили туда собственный класс com.amazon и т. д.

Как они достигают этого?

Ответы [ 3 ]

20 голосов
/ 15 мая 2011

Просто для удовольствия, я скачал APK из магазина Amazon (я никогда не использовал его сегодня вечером) и декомпилировал его.Вы не найдете много в манифесте, но внутри дерева smali есть целая папка классов Amazon.Механизмы, которые использует Amazon, в значительной степени превосходят мое очень ограниченное понимание, но я могу указать вам на некоторые данные.

Обновление : для работы приложений требуется установить apk Amazon appstore, чтобы функционировать,поэтому в приведенных ниже классах используется некоторая активность amazon, чтобы проверить наличие в drm.

Method :

$apktool d xxx.apk
$cd xxx/smali
$grep -RHin 'amazon' *

Findings :

Во-первых, вы можете взглянуть на

.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, анализа каждого файла и добавления необходимыхклассов и перекомпиляции с использованием того же ключа.

8 голосов
/ 19 августа 2011

Существует Python lib / tool, paraspace (мой маленький проект), который может помочь вам внедрить один или несколько классов из файла DEX в другой. Он вставит код данного класса в целевой файл DEX и перенаправит все вызовы, вызывающие класс, в другой. Таким образом, вы можете реализовать деривацию java.io.File и заменить все вызовы файла деривацией.

Paraspace доступен на http://hg.assembla.com/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

Эта команда будет читать класс com.codemud.fakefile.fakefile из suffile.dex, вставлять его в 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

1 голос
/ 29 августа 2015

Я думаю, что этот пост: http://www.bulbsecurity.com/backdooring-apks-programmatically-2/ довольно подробно описывает, как можно вводить классы. Я сам выполнил шаги и могу подтвердить, что это работает, с единственным недостатком, состоящим в том, что ключ apk изменится, что, очевидно, имеет место с amazon.

Что касается внедрения кода в существующие классы, это также может быть сделано с небольшим пониманием smali (я сделал это также в ограниченном масштабе).

...