Я знаю, что вы можете декомпилировать код с помощью 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 (я сделал это также в ограниченном масштабе).