Ввод кода в APK

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

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

Как они это понимают?

Ответ 1

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

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

Ответ 2

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

Парапас доступен в 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

Ответ 3

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

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