Важный
Этот проект заархивирован и больше не поддерживается.
Ответы на некоторые наиболее распространенные вопросы можно найти в разделах «Часто задаваемые вопросы» и «Устранение неполадок».
Инструмент «черного ящика» для приложений Android.
Obfuscapk — это модульный инструмент Python для запутывания приложений Android без необходимости использования их исходного кода, поскольку apktool
используется для декомпиляции исходного файла APK и создания нового приложения после применения некоторых методов обфускации к декомпилированному коду smali
, ресурсам и манифесту. Замаскированное приложение сохраняет ту же функциональность, что и исходное, но различия внутри иногда сильно отличают новое приложение от оригинала (например, от антивирусного программного обеспечения на основе сигнатур).
Obfuscapk добавляет поддержку пакетов приложений Android (файлов aab) с помощью BundleDecompiler (см. № 121). Чтобы использовать эту новую функцию, загрузите последнюю версию BundleDecompiler, доступную здесь, сохраните ее как BundleDecompiler.jar
в каталоге, включенном в PATH
(например, в Ubuntu, /usr/local/bin
или /usr/bin
) и сделайте убедитесь, что у него установлен флаг исполняемого файла.
Важный
BundleDecompiler пока не работает в Windows, поэтому Obfuscapk не поддерживает обфускацию пакетов приложений на платформе Windows. Кроме того, поддержка пакетов приложений все еще находится на ранней стадии разработки, поэтому, если у вас возникли какие-либо проблемы или вы хотите помочь нам улучшиться, см. раздел «Внесение вклада».
Более подробную информацию об Obfuscapk можно найти в статье «Obfuscapk: инструмент обфускации черного ящика с открытым исходным кодом для приложений Android». Вы можете цитировать статью следующим образом:
@article { aonzo2020obfuscapk ,
title = " Obfuscapk: An open-source black-box obfuscation tool for Android apps " ,
journal = " SoftwareX " ,
volume = " 11 " ,
pages = " 100403 " ,
year = " 2020 " ,
issn = " 2352-7110 " ,
doi = " https://doi.org/10.1016/j.softx.2020.100403 " ,
url = " https://www.sciencedirect.com/science/article/pii/S2352711019302791 " ,
author = " Simone Aonzo and Gabriel Claudiu Georgiu and Luca Verderame and Alessio Merlo " ,
keywords = " Android, Obfuscation, Program analysis "
}
Obfuscapk спроектирован так, чтобы быть модульным и легко расширяемым, поэтому он создан с использованием системы плагинов. Следовательно, каждый обфускатор — это плагин, который наследуется от абстрактного базового класса и должен реализовать метод obfuscate
. Когда инструмент начинает обработку нового файла приложения Android, он создает объект обфускации для хранения всей необходимой информации (например, местоположения декомпилированного кода smali
) и внутреннего состояния операций (например, списка уже используемых обфускаторов). . Затем объект обфускации передается в качестве параметра метода obfuscate
всем активным плагинам/обфускаторам (последовательно) для обработки и изменения. Список и порядок активных плагинов задаются с помощью параметров командной строки.
Инструмент легко расширяется новыми обфускаторами: достаточно добавить исходный код, реализующий технику обфускации, и метаданные плагина (файл <obfuscator-name>.obfuscator
) в каталог src/obfuscapk/obfuscators
(возьмем простой существующий обфускатор типа Nop
для начала). Инструмент автоматически обнаружит новый плагин, поэтому дальнейшая настройка не требуется (новый плагин будет обрабатываться так же, как и все другие плагины, входящие в состав инструмента).
Есть два способа получить рабочую копию Obfuscapk на свой компьютер: либо с помощью Docker, либо напрямую используя исходный код в среде Python 3
. В обоих случаях первое, что нужно сделать, — это получить локальную копию этого репозитория, поэтому откройте терминал в каталоге, в котором вы хотите сохранить проект, и клонируйте репозиторий:
$ git clone https://github.com/ClaudiuGeorgiu/Obfuscapk.git
Это рекомендуемый способ установки Obfuscapk, поскольку единственным требованием является наличие последней версии Docker:
$ docker --version
Docker version 20.10.21, build baeda1f
Официальный образ Obfuscapk Docker доступен в Docker Hub (автоматически создан из этого репозитория):
$ # Download the Docker image.
$ docker pull claudiugeorgiu/obfuscapk
$ # Give it a shorter name.
$ docker tag claudiugeorgiu/obfuscapk obfuscapk
Если вы загрузили официальный образ из Docker Hub, вы готовы использовать этот инструмент, поэтому проверьте инструкции по использованию, в противном случае выполните следующую команду в ранее созданном каталоге Obfuscapk/src/
(папке, содержащей файл Dockerfile
), чтобы собрать Докер-образ:
$ # Make sure to run the command in Obfuscapk/src/ directory.
$ # It will take some time to download and install all the dependencies.
$ docker build -t obfuscapk .
Когда образ Docker будет готов, проведите быстрый тест, чтобы убедиться, что все установлено правильно:
$ docker run --rm -it obfuscapk --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
Obfuscapk теперь готов к использованию. Дополнительную информацию см. в инструкциях по использованию.
Убедитесь, что у вас установлены последние версии apktool
, apksigner
и zipalign
и доступны из командной строки:
$ apktool
Apktool v2.9.0 - a tool for reengineering Android apk files
...
$ apksigner
Usage: apksigner < command > [options]
apksigner --version
apksigner --help
...
$ zipalign
Zip alignment utility
Copyright (C) 2009 The Android Open Source Project
...
Для поддержки обфускации пакетов приложений вам также понадобится BundleDecompiler, поэтому загрузите последнюю доступную версию отсюда, сохраните ее как BundleDecompiler.jar
в каталоге, включенном в PATH
(например, в Ubuntu, /usr/local/bin
или /usr/bin
) и убедитесь, что у него установлен флаг исполняемого файла.
Чтобы использовать BundleDecompiler и apktool
вам также потребуется последняя версия Java. zipalign
и apksigner
включены в Android SDK. Местоположение исполняемых файлов также можно указать с помощью следующих переменных среды: APKTOOL_PATH
, BUNDLE_DECOMPILER_PATH
, APKSIGNER_PATH
и ZIPALIGN_PATH
(например, в Ubuntu запустите export APKTOOL_PATH=/custom/location/apktool
перед запуском Obfuscapk в том же терминале).
Помимо вышеперечисленных инструментов, единственным требованием для этого проекта является работающая установка Python 3
(не ниже 3.7
) (вместе с его менеджером пакетов pip
).
Запустите следующие команды в основном каталоге проекта ( Obfuscapk/
), чтобы установить необходимые зависимости:
$ # Make sure to run the commands in Obfuscapk/ directory.
$ # The usage of a virtual environment is highly recommended.
$ python3 -m venv venv
$ source venv/bin/activate
$ # Install Obfuscapk's requirements.
$ python3 -m pip install -r src/requirements.txt
После установки требований проведите быстрый тест, чтобы убедиться, что все работает правильно:
$ cd src/
$ # The following command has to be executed always from Obfuscapk/src/ directory
$ # or by adding Obfuscapk/src/ directory to PYTHONPATH environment variable.
$ python3 -m obfuscapk.cli --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
Obfuscapk теперь готов к использованию. Дополнительную информацию см. в инструкциях по использованию.
С этого момента Obfuscapk будет рассматриваться как исполняемый файл, доступный как obfuscapk
, поэтому вам необходимо адаптировать команды в соответствии с тем, как вы установили инструмент:
Образ Docker : локальный каталог, содержащий запутывающее приложение, должен быть смонтирован в /workdir
в контейнере (например, текущий каталог "${PWD}"
), поэтому команда:
$ obfuscapk [params...]
становится:
$ docker run --rm -it -u $( id -u ) : $( id -g ) -v " ${PWD} " : " /workdir " obfuscapk [params...]
Из источника : каждая инструкция должна выполняться из каталога Obfuscapk/src/
(или путем добавления каталога Obfuscapk/src/
в переменную среды PYTHONPATH
) и команды:
$ obfuscapk [params...]
становится:
$ python3 -m obfuscapk.cli [params...]
Начнем с просмотра справочного сообщения:
$ obfuscapk --help
obfuscapk [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB] [-i] [-p] [-k VT_API_KEY]
[--keystore-file KEYSTORE_FILE] [--keystore-password KEYSTORE_PASSWORD]
[--key-alias KEY_ALIAS] [--key-password KEY_PASSWORD] [--use-aapt2]
< APK_OR_BUNDLE_FILE >
Существует два обязательных параметра: <APK_OR_BUNDLE_FILE>
, путь (относительный или абсолютный) к файлу apk или пакета приложения, который необходимо запутать, и список с именами применяемых методов запутывания (указанный с помощью опции -o
, которую можно использовать несколько раз). раз, например, -o Rebuild -o NewAlignment -o NewSignature
). Другие необязательные аргументы следующие:
-w DIR
используется для установки рабочего каталога, в котором будут сохраняться промежуточные файлы (сгенерированные apktool
). Если не указано, каталог с именем obfuscation_working_dir
создается в том же каталоге, что и входное приложение. Это может быть полезно для целей отладки, но если в этом нет необходимости, его можно установить во временный каталог (например, -w /tmp/
).
-d OUT_APK_OR_AAB
используется для установки пути к файлу назначения: файлу apk, созданному процессом обфускации (например, -d /home/user/Desktop/obfuscated.apk
или -d /home/user/Desktop/obfuscated.aab
). Если не указано, окончательный запутанный файл будет сохранен внутри рабочего каталога. Примечание: существующие файлы будут перезаписаны без предупреждения.
-i
— это флаг игнорирования известных сторонних библиотек во время процесса обфускации, чтобы использовать меньше ресурсов, повысить производительность и снизить риск ошибок. Список игнорируемых библиотек взят из проекта LiteRadar.
-p
— флаг для отображения индикаторов выполнения во время операций обфускации. При использовании инструмента в пакетных операциях/автоматических сборках удобно отключать индикаторы выполнения, в противном случае этот флаг следует включить, чтобы увидеть прогресс обфускации.
-k VT_API_KEY
необходим только при использовании обфускатора VirusTotal
, чтобы установить ключ API, который будет использоваться при взаимодействии с Virus Total.
--keystore-file KEYSTORE_FILE
, --keystore-password KEYSTORE_PASSWORD
, --key-alias KEY_ALIAS
и --key-password KEY_PASSWORD
можно использовать для указания пользовательского хранилища ключей (необходимого для подписи apk). Если используется --keystore-file
, необходимо также указать --keystore-password
и --key-alias
, а --key-password
необходим только в том случае, если выбранный ключ имеет пароль, отличный от пароля хранилища ключей. По умолчанию (если --keystore-file
не указан) для операций подписи используется хранилище ключей, связанное с Obfuscapk.
--ignore-packages-file IGNORE_PACKAGES_FILE
— это путь к файлу, который включает имена пакетов, которые следует игнорировать. При использовании этой опции все классы внутри этих пакетов не будут запутываться. В каждой строке файла должно быть одно имя пакета, как показано в примере ниже:
com.mycompany.dontobfuscate
com.mycompany.ignore
...
--use-aapt2
— это флаг использования опции aapt2 при пересборке приложения с помощью apktool
.
Давайте теперь рассмотрим простой рабочий пример, чтобы увидеть, как работает Obfuscapk:
$ # original.apk is a valid Android apk file.
$ obfuscapk -o RandomManifest -o Rebuild -o NewAlignment -o NewSignature original.apk
При запуске приведенной выше команды за кулисами происходит следующее:
поскольку рабочий каталог не указан, новый рабочий каталог ( obfuscation_working_dir
) создается в том же месте, что и original.apk
(это может быть полезно для проверки файлов/манифеста/ресурсов smali
в случае ошибок)
выполняются некоторые проверки, чтобы убедиться, что все необходимые файлы/исполняемые файлы доступны и готовы к использованию.
начинается фактический процесс обфускации: указанные обфускаторы выполняются (по порядку) один за другим, пока не останется обфускатор или пока не возникнет ошибка
при запуске первого обфускатора original.apk
декомпилируется с помощью apktool
и результаты сохраняются в рабочий каталог
поскольку первый обфускатор — RandomManifest
, записи в декомпилированном манифесте Android переупорядочиваются случайным образом (без нарушения структур xml
)
Обфускатор Rebuild
просто пересобирает приложение (теперь с измененным манифестом) с помощью apktool
, и, поскольку выходной файл не был указан, полученный apk-файл сохраняется в созданном ранее рабочем каталоге.
Обфускатор NewAlignment
использует инструмент zipalign
для выравнивания полученного apk-файла.
Обфускатор NewSignature
подписывает вновь созданный файл apk с помощью специального сертификата, содержащегося в хранилище ключей, включенном в Obfuscapk (хотя другое хранилище ключей можно указать с помощью параметра --keystore-file
)
когда все обфускаторы выполнены без ошибок, полученный запутанный apk-файл можно найти в obfuscation_working_dir/original_obfuscated.apk
, он подписан, выровнен и готов к установке на устройство/эмулятор.
Как видно из предыдущего примера, обфускаторы Rebuild
, NewAlignment
и NewSignature
всегда необходимы для завершения операции обфускации и создания окончательного запутанного APK. Это не настоящие методы обфускации, но они необходимы в процессе сборки, поэтому они включены в список обфускаторов, чтобы сохранить модульность общей архитектуры.
Не работает так, как ожидалось? См. раздел Часто задаваемые вопросы и устранение неполадок.
Обфускаторы, входящие в состав Obfuscapk, можно разделить на разные категории в зависимости от выполняемых ими операций:
Тривиальный : как следует из названия, эта категория включает в себя простые операции (которые не сильно изменяют исходное приложение), такие как подписание apk-файла новой подписью.
Rename : операции, изменяющие названия используемых идентификаторов (классов, полей, методов).
Шифрование : упаковка зашифрованного кода/ресурсов и их расшифровка во время выполнения приложения. Когда Obfuscapk запускается, он автоматически генерирует случайный секретный ключ (длиной 32 символа, с использованием букв и цифр ASCII), который будет использоваться для шифрования.
Код : все операции, включающие модификацию декомпилированного исходного кода.
Ресурсы : операции с файлами ресурсов (например, изменение манифеста).
Другой
Обфускаторы, в настоящее время поставляемые в комплекте с Obfuscapk, кратко представлены ниже (в алфавитном порядке). Для получения более подробной информации обратитесь к исходному коду проекта.
Кончик
Не все приведенные ниже обфускаторы соответствуют реальным методам обфускации (например, Rebuild
, NewAlignment
, NewSignature
и VirusTotal
), но они реализованы как обфускаторы, чтобы сохранить модульность архитектуры и легко расширять ее новыми функциями.
Использует отражение для вызова опасных API-интерфейсов Android Framework. Чтобы узнать, принадлежит ли метод Android Framework, Obfuscapk обращается к сопоставлению, обнаруженному Бэкесом и др.
? Исходный код AdvancedReflection
Вставьте мусорный код. В этом случае мусорный код состоит из арифметических вычислений и инструкции ветвления, зависящей от результата этих вычислений, созданной таким образом, что ветвь никогда не выполняется.
? Исходный код ArithmeticBranch
Зашифруйте файлы ресурсов.
? Исходный код AssetEncryption
Этот метод изменяет граф потока управления, не влияя на семантику кода: он добавляет новые методы, которые вызывают исходные. Например, вызов метода m1 будет заменен новым методом-оболочкой m2 , который при вызове вызывает исходный метод m1 .
? Исходный код CallIndirection
Измените имя пакета и переименуйте классы (даже в файле манифеста).
? Исходный код ClassRename
Шифрование константных строк в коде.
? Исходный код ConstStringEncryption
Удалить отладочную информацию.
? Исходный код DebugRemoval
Переименуйте поля.
? Исходный код FieldRename
Учитывая метод, он вставляет инструкцию
goto
, указывающую на конец метода, и еще однуgoto
указывающую на инструкцию после первогоgoto
; он изменяет граф потока управления, добавляя два новых узла.
? Перейти к исходному коду
Зашифруйте собственные библиотеки.
? Исходный код LibEncryption
Он использует функцию перегрузки языка программирования Java для присвоения одного и того же имени разным методам, но с использованием разных аргументов. Учитывая уже существующий метод, этот метод создает новый метод void с тем же именем и аргументами, но также добавляет новые случайные аргументы. Затем тело нового метода заполняется инструкциями случайной арифметики.
? Исходный код MethodOverload
Переименуйте методы.
? Переименование исходного кода метода
Перенастройте приложение.
? Исходный код NewAlignment
Повторно подпишите приложение новой пользовательской подписью.
? Исходный код NewSignature
Вставьте мусорный код. Nop, сокращение от no-operation , представляет собой специальную инструкцию, которая ничего не делает. Этот метод просто вставляет случайные инструкции
nop
в каждую реализацию метода.
? Нет исходного кода
Произвольное изменение порядка записей в файле манифеста.
? Исходный код случайного манифеста
Пересоберите приложение.
? Восстановить исходный код
Этот метод анализирует существующий код в поисках вызовов методов приложения, игнорируя вызовы платформы Android (см.
AdvancedReflection
). Если он находит инструкцию с подходящим вызовом метода (т. е. отсутствие методов конструктора, публичная видимость, достаточное количество свободных регистров и т. д.), такой вызов перенаправляется на пользовательский метод, который будет вызывать исходный метод с использованием API-интерфейсов отражения.
? Исходный код отражения
Этот метод заключается в изменении порядка основных блоков в коде. Когда команда перехода найдена, условие инвертируется (например, переход, если меньше , становится ветвью, если больше или равен ), и целевые базовые блоки соответствующим образом переупорядочиваются. Более того, он также случайным образом перестраивает код, злоупотребляя инструкциями
goto
.
? Изменить порядок исходного кода
Шифруйте строки в ресурсах (только те, которые вызываются внутри кода).
? Исходный код ResStringEncryption
Отправьте оригинал и обфусцированное приложение в Virus Total. Вы должны предоставить ключ API VT (см. параметр
-k
).
? Исходный код VirusTotal
Вы можете использовать этот код по лицензии MIT.
Это программное обеспечение было разработано для исследовательских целей в Лаборатории компьютерной безопасности (CSecLab), расположенной в DIBRIS Университета Генуи.