Внедрение кода в APK
Я знаю, что вы можете декомпилировать код с помощью apktool и перекомпилировать его снова, но мой вопрос заключается в том, как вы сможете внедрить большие объемы кода в apk и выполнить его.
Я вижу, что Amazon AppStore drm делает это, я предполагаю, так как они говорят, что оборачивают apk своим собственным кодом, и как только вы декомпилируете этот apk, вы увидите, что они добавили туда собственный класс com.amazon и т. Д.
Как они добиваются этого?
3 ответа
Просто для удовольствия, я скачал APK из магазина Amazon (я никогда не использовал его сегодня вечером) и декомпилировал его. Вы не найдете много в манифесте, но внутри дерева smali есть целая папка классов Amazon. Механизмы, которые использует Amazon, в значительной степени превосходят мое очень ограниченное понимание, но я могу указать вам на некоторые данные.
Обновление: приложения требуют, чтобы приложение Amazon appstore apk было установлено, чтобы функционировать, поэтому нижеприведенные классы используют некоторую активность 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, анализа каждого файла, добавления необходимых классов и повторной компиляции с использованием того же ключа.
Существует 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
Я думаю, что этот пост: http://www.bulbsecurity.com/backdooring-apks-programmatically-2/ довольно подробно описывает, как можно вводить классы. Я сам выполнил эти шаги и могу подтвердить, что это работает, с единственным недостатком, состоящим в том, что ключ apk изменится, что, очевидно, имеет место с amazon.
Что касается внедрения кода в существующие классы, это также может быть сделано с небольшим пониманием smali (я сделал это также в ограниченном масштабе).