
Быстрый фронтенд для декомпиляции Android APK, который напрямую запрашивает скомпилированные артефакты DEX, извлекая классы и перекрёстные ссылки за миллисекунды без предварительной обработки.
При декомпиляции огромных Android APK стандартная процедура — ждать. Мы ждём, пока инструменты съедят гигабайты оперативной памяти, полностью развернут артефакты и потратят десятки минут на построение тяжёлых глобальных индексов и перекрёстных ссылок... Всё это лишь для того, чтобы гарантировать быстрый поиск по коду в дальнейшем, но вот в чём противоречие. Скомпилированный артефакт уже высокоструктурирован, современные декомпиляторы никогда этим не пользуются, они тратят огромные объёмы времени и памяти на реконструкцию раздутой базы данных связей кода поверх уже структурированных данных. Этот инженерный подход противоречит здравому смыслу. Когда я могу напрямую извлечь любую связь кода из APK за миллисекунды, сохраняет ли эта предварительная обработка хоть какую-то ценность?
Вместо того чтобы заставлять декомпиляторы выполнять тяжёлую предварительную обработку, мы решили запрашивать скомпилированный артефакт напрямую как базу данных. Мы построили движок без сохранения состояния и с нулевыми накладными расходами, который извлекает и ищет код по требованию за миллисекунды. В этом докладе мы рассмотрим инженерные основы, необходимые для обхода традиционных узких мест. Мы продемонстрируем, как отказаться от полного развёртывания, зондируя непосредственно внутри битового потока Deflate и строя плотные таблицы поиска Хаффмана для извлечения ключевых метаданных без обращения к нерелевантным блокам данных. Кроме того, мы объясним детали оптимизации компилятора R8, особенно то, как детерминированное перемещение констант и дедупликация инструкций оставляют после себя высококонцентрированные физические макеты, — мы используем это поведение компилятора для выполнения молниеносно быстрых кросс-DEX поисков кода. Чтобы сопоставить эти необработанные смещения байткода с методами, мы разработали примитив локализации инструкций за O(1), достигая разрешения методов за константное время без построения тяжёлых таблиц сопоставления. Наконец, при попадании в цель Droid ASC извлекает только конкретные байткоды и их зависимости, динамически реконструируя минимальный и самосогласованный DEX полностью в памяти для мгновенной декомпиляции.
Мы продемонстрируем эту архитектуру вживую на коммерческом APK размером 352 МБ. Droid ASC выполняет глобальные поиски перекрёстных ссылок за 1,79 секунды и декомпилирует целевые классы за 177 миллисекунд, используя всего 141 МБ оперативной памяти. Рассматривая артефакт как базу данных только для чтения и работая с нулевой предварительной обработкой, мы возвращаем декомпилятор к его сути. Это больше не раздутый инструмент индексации, а молниеносно быстрый движок декомпиляции по требованию, который фундаментально переопределяет то, как мы анализируем скомпилированный код.

https://github.com/user-attachments/assets/4c4a6813-8561-490c-a573-ef113da861b6
# from PyPI
pip install droidasc
# or from source
pip install .
После установки команда CLI droidasc доступна глобально:
usage: droidasc [-h] {getclass,listclass,getmanifest,findrefs} ...
ASC tooling entry.
positional arguments:
{getclass,listclass,getmanifest,findrefs}
getclass Locate the target class in APK, extract one DEX in memory, then decompile.
listclass List classes defined across all DEX entries in APK.
getmanifest Decode AndroidManifest.xml from APK and print it as XML.
findrefs Find code references for string/type/method/field across all DEX entries in APK.
options:
-h, --help show this help message and exit
examples:
droidasc app.apk --gui
droidasc getclass app.apk Lcom/poc/Main; -o Main.java
droidasc getclass app.apk com.poc.Main --threads 16
droidasc listclass app.apk -o classes.txt
droidasc listclass app.apk --prefix com.poc
droidasc getmanifest app.apk -o AndroidManifest.xml
droidasc findrefs app.apk string token -o string_refs.txt
droidasc findrefs app.apk type com.poc.Main
droidasc findrefs app.apk method onCreate --class com.poc.Main
droidasc findrefs app.apk method notify --class MainActivity --fuzzy-class -o method_refs.txt
droidasc findrefs app.apk field apiKey -o field_refs.txt
listclass выводит дескрипторы классов Dalvik в порядке определения в APK/DEX, по одному
на строку. С -o вывод записывается в указанный файл вместо stdout.
--prefix com.poc фильтрует по Lcom/poc; уже нормализованный префикс, такой как
Lcom/poc, остаётся без изменений.
Вы также можете использовать python main.py, как и раньше — он делегирует к той же точке входа.
| Спонсор | Сумма |
|---|---|
| HTTChina | 5000¥ |
| c01ns | 11.9¥ |
| gguowang AND cococount | 2¥ |
| Ylarod | 50.11¥ |
Спасибо всем спонсорам за вашу поддержку!
ASC создан с надеждой, что он сможет по-настоящему помочь каждому улучшить свой рабочий процесс обратной разработки — от ускорения утомительных частей до превращения невозможного в рутину.
Спасибо проекту Androguard за предоставление основы для обратной разработки Android и анализа DEX, используемой Droid ASC.