Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
rdx — Нативный декомпилятор APK и DEX, написанный на Rust | Kitploit
Инструменты/GitHubGitHub/ch0pin/rdx
Безопасность AndroidСтатический анализАнализ КодаДинамический анализ кода (DAST)Пентестинг мобильных приложенийОбратная инженерияМобильная безопасностьУтилиты и фреймворкиАнализ Бинарных Файлов
GitHubch0pin/rdx

rdx

Нативный декомпилятор APK и DEX, написанный на Rust

261181 день назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Репозиторий

Атрибуция JADX и нативный порт DEX

Изначальный парсер DEX на Rust в src/native_dex.rs адаптирует логику парсинга из JADX v1.5.6, зафиксированного на коммите 28ff15e4ae69950aebea110a13e5ab895d234dfc. JADX является собственностью Skylot и его участников; применимые уведомления Android Open Source Project и других вышестоящих проектов сохранены в NOTICE.

Эталонной реализацией является плагин ввода DEX, включая DexReader, sections/DexHeader, sections/SectionReader, sections/DexClassData и utils/Leb128.

Модификации RDX переносят логику парсера на Rust с проверяемым доступом к байтам, явным распространением ошибок и собственными представлениями классов/членов RDX. Нативный эмиттер исходного кода — это новый код RDX. Это начальная, частичная реализация парсера и нативного движка, а не полный порт конвейера декомпиляции JADX и не заявление об эквивалентном охвате выходных данных.

Приведённые ниже файлы — это неизменённые копии, загруженные из зафиксированного релиза:

  • LICENSE: https://raw.githubusercontent.com/skylot/jadx/v1.5.6/LICENSE (Git blob 8dada3edaf50dbc082c9a125058f25def75e625a).
  • NOTICE: https://raw.githubusercontent.com/skylot/jadx/v1.5.6/NOTICE (Git blob 5c0b69a0f5298e0b329e33e860f7626f0c2c3891).

Полный вышестоящий NOTICE сохранён, включая исторические уведомления о встроенных библиотеках и иконках. Сохранение не означает, что парсер на Rust включает все эти библиотеки или ресурсы. Реализация на Java и её runtime-зависимости больше не поставляются.

Дистрибутивы, содержащие адаптированный парсер, должны включать применимую лицензию и уведомления. Изменения, производные от дополнительных вышестоящих файлов, должны сохранять их уведомления и расширять это сопоставление источников по мере развития порта.

Нативное декодирование бинарного XML Android

src/native_resources.rs отображает диспетчеризацию чанков, парсинг пространств имён, элементов и типизированных атрибутов зафиксированного JADX v1.5.6 jadx-core/src/main/java/jadx/core/xmlgen/BinaryXMLParser.java на нативный Rust. Его читатель пула строк и ограниченный эмиттер XML — это код RDX. Декодер проверяет границы входных данных/чанков/строк, поддерживает пулы UTF-8/UTF-16 и обрабатывает распространённые типизированные значения атрибутов Android без Java runtime. Идентификаторы ресурсов остаются числовыми: поиск символов ARSC и имена enum/flag в манифесте пока не портированы. Это не полная вышестоящая подсистема ресурсов.

Нативная реконструкция Java

src/native_java/ — это консервативный слой RDX на Rust для понижения регистровых значений и эмиссии Java поверх адаптированного читателя DEX. Он обрабатывает поддерживаемые типизированные инструкции, прямые ветвления, простые циклы и прямые switch с явной материализацией эффектов и сгенерированными сопоставлениями исходного кода. Обработка опкодов массивов/типов следует спецификации инструкций AOSP DEX. Это не порт конвейера CFG/SSA/вывода типов JADX и не заявляет его охват реконструкции. Неподдерживаемые методы сохраняют нативный вывод DEX.

Порт конвейера базовых блоков

src/native_cfg.rs адаптирует подход разделения/соединения из зафиксированного JADX BlockSplitter.java. Реализация на Rust работает напрямую с проверенными кодовыми единицами DEX, сохраняет инструкции goto и исходные смещения, исключает данные полезной нагрузки и консервативно изолирует защищённые инструкции для исключительных рёбер. Она пока не реализует синтетические преобразования блоков JADX, SSA или построение регионов. Анализ доминаторов — это отдельный этап, описанный ниже. Этот этап доступен через отдельный аудит корпуса; рендерер исходного кода GUI по-прежнему использует существующее понижение регистровых значений. См. docs/jadx-port-plan.md для оставшихся проходов.

src/native_dominators.rs адаптирует зафиксированный DominatorTree.java: итеративный алгоритм непосредственных доминаторов Купера/Харви/Кеннеди, пересечение предшественников и обходы границы доминирования. Модификации на Rust сохраняют исходные идентификаторы блоков, используют итеративный обход в обратном постпорядке, ограничивают хранилище работы/границы и используют интервалы дерева для запросов доминирования вместо побитовых наборов доминаторов для каждого блока. Виртуальный предшественник входа обрабатывает обратные рёбра к входу метода. Достижимость определяется от фактического входа метода по нормальным и консервативным исключительным рёбрам; отключённые блоки обработчиков сообщаются как недостижимые. Это анализ доминаторов, а не полный проход преобразования BlockProcessor.

Операнды инструкций для SSA

src/native_ir.rs адаптирует отображение операндов семейств инструкций из зафиксированного InsnDecoder.java. Его проверяемый читатель сырых операндов DEX следует форматам инструкций AOSP и является кодом RDX. Он сохраняет смещения/опкоды, упорядоченные чтения и записи регистров, ширины слов, литералы, индексированные ссылки и консервативное поведение при генерации исключений. В отличие от вышестоящего, он пока не разрешает записи пула, не объединяет результаты вызовов и не выполняет вывод типов. Аргументы вызова остаются упорядоченными сырыми регистровыми словами до разрешения сигнатуры. src/native_calls.rs теперь разрешает записи пула методов и группирует слова получателя/аргументов по их эффективным прототипам, следуя тем же зафиксированным соглашениям invoke/result из InsnDecoder. Он обрабатывает широкие аргументы, владельцев-массивы, полиморфные вторичные прототипы и заполненные массивы, а также связывает смежные типизированные инструкции move-result. Пользовательские invoke явно отклоняют отсутствующие метаданные места вызова. Это привязка сигнатур, а не разрешение виртуальной диспетчеризации или SSA.

Категории регистров описывают ограничения ширины хранилища/ссылок, а не выведенные типы Java. CFG и декодирование операндов используют один декодер ширины инструкций; старый рендерер исходного кода остаётся отдельным, пока строится этот конвейер анализа.

Дополнительные нативные метаданные и типизированное понижение

src/native_dex_metadata.rs декодирует закодированные значения, списки обработчиков try/catch и общие наборы аннотаций классов/полей/методов/параметров из формата AOSP DEX. Проверяемые смещения, бюджеты выделения/работы, общее хранилище обработчиков и представления на Rust — это код RDX. src/native_java/annotations.rs рендерит распространённые значения аннотаций Java, сохраняя ссылки на типы/enum и экранированные строки/символы. Размещение аннотаций следует зафиксированному AnnotationGen.java. Аннотации времени сборки/выполнения отображаются, в том числе на методах с телами-заглушками DEX. Системные аннотации остаются метаданными; Throws также рендерится как предложение throws. Неподдерживаемые значения Java помечаются явно. Значения по умолчанию аннотаций и отладочные метаданные реконструируются не полностью.

src/native_java/numeric.rs, strings.rs, liveness.rs и рендерер исключений — это реализации RDX поверх семантики инструкций DEX. Их консервативные границы отката и независимые фикстуры поведения на Rust описаны в docs/native-engine.md и docs/validation.md. Они не выполняют и не встраивают вышестоящий код Java.

Нативный SSA

src/native_ssa.rs адаптирует вставку phi по границе доминирования с отсечением live-in и переименование из зафиксированного JADX SSATransform.java. Адаптации на Rust используют итеративный обход, ограниченные идентификаторы слов и синтетические блоки нормального успеха для сохранения исключительного состояния до записи. Последнее заменяет вышестоящее исправление try-рёбер после переименования. Упрощение phi остаётся непортированным; частичный вывод типов описан ниже. native_call_values.rs привязывает существующие ограничения сигнатур к словам SSA. Никакой вышестоящий код Java не выполняется.

Границы типов SSA и идентичности конструкторов

src/native_types.rs адаптирует разделение привязок присваивания/использования и последовательность распространения из зафиксированного JADX TypeInferenceVisitor.java и TypeUpdate.java. Ограниченный рабочий список на Rust, проверки пар слов, литеральные альтернативы и явные результаты неразрешённости/конфликта — это адаптации RDX. Это частичный вывод: слушатели элементов массивов теперь распространяют типы загрузки и ограничения сохранения. Общий обратный вывод для массивов, наименьшие верхние границы ссылок, обобщения и вставка преобразований остаются неполными.

src/native_constructors.rs следует цепочкам присваиваний SSA, как в зафиксированном ConstructorVisitor.java. RDX проверяет доминирование выделения и сохраняет источник и исходного вызванного владельца. Отличающийся владелец помечается для перенацеливания только тогда, когда иерархия доказывает, что он является предком типа выделения. Связывание через доказанного предка на this следует зафиксированному ConstructorInsn.java. Этот анализ не удаляет и не перемещает инструкции, не устанавливает корректность состояния инициализации и не эмитирует конструкторы.

Ограниченный путь вложенных выделений в native_java/allocation_lowering.rs теперь использует эти привязки конструкторов SSA. Точные идентичности выделения/invoke и проверка событий эффектов RDX управляют Java-выражениями с общим захватом. Эта интеграция не является портом полного конвейера регионов/генерации кода JADX; эмиссия перенацеливания владельца, регионы исключений и общая проверка состояния инициализации остаются неподдерживаемыми в этом пути.

Отношения присваивания массивов в native_hierarchy.rs следуют JLS 4.10.3: ковариантность ссылочных компонентов, инвариантность примитивных компонентов и стандартные супертипы Object/Cloneable/Serializable. Вложенность дескрипторов ограничена; отсутствующие внешние отношения классов остаются неизвестными.

Небольшая иерархия платформы также включает проверенные рёбра интерфейсов для Throwable / Serializable и SQLException / Iterable. Эти факты позволяют избежать ложноотрицательных ответов о подтипах из предыдущего графа родителей только для исключений; они не constitute полный classpath платформы Android.

Вызовы builder внутри аргументов выделения

Ограниченный декодер выделений распознаёт игнорируемые результаты StringBuilder.append(String), руководствуясь нецепочечным шаблоном использования builder из зафиксированного SimplifyVisitor.convertInvoke. RDX сохраняет фактические вызовы конструктора/append и точные трассировки эффектов; он не выполняет полное вышестоящее преобразование конкатенации строк. Принимаются только точный конечный класс платформы и перегрузка с её документированным контрактом возврата получателя; произвольные методы, выглядящие как fluent, остаются неподдерживаемыми. См. StringBuilder.append(String).

Вызовы суперкласса с владельцем-предком

Эмиссия invoke-super класса в native_java/method.rs следует обработке суперкласса в зафиксированном InsnGen.callSuper/getClassForSuperCall. RDX доказывает строгое наследование суперкласса, используя свою ограниченную неизменяемую иерархию, вместо требования, чтобы владелец метода DEX совпадал с непосредственным родителем. Он эмитирует super.method(...) и сохраняет исходную сигнатуру DEX в метаданных навигации. Получатель по-прежнему должен быть текущим экземпляром. Интерфейсные значения по умолчанию, вызовы qualified-super внешнего класса и неполное/неоднозначное наследование остаются неподдерживаемыми. Различия диспетчеризации классов/интерфейсов определяются документацией AOSP об invoke-kind.

Читаемое размещение выделений

Зафиксированный JADX ConstructorVisitor.processInvoke удаляет исходный NEW_INSTANCE и заменяет вызов конструктора на месте; затем InsnGen эмитирует new Class(arguments). Соответствующие вышестоящие источники:

  • ConstructorVisitor строки 84–110
  • Вывод конструктора InsnGen
  • Классификация переупорядочивания InsnNode

Нативный allocation.rs RDX сначала сохраняет свою более строгую реконструкцию выражений. Только для плоских окон он может размещать упорядоченные объявления захвата и помещать new в позицию конструктора, соответствуя вышестоящему подходу читаемой реконструкции. В отличие от более широких вышестоящих классификаций переупорядочивания, RDX по-прежнему проверяет все записанные события cast/call/read/string в их исходном порядке. Намеренное перемещение выделения может изменить время инициализации класса, связывания и отказа выделения; охват выходных данных не устанавливает полную семантическую эквивалентность.

Реконструкция синхронизированных регионов

src/native_java/synchronized.rs адаптирует подход реконструкции вход/тело/monitor-exit из зафиксированного jadx-core/src/main/java/jadx/core/dex/visitors/regions/maker/SynchronizedRegionMaker.java. Реализация на Rust добавляет ограниченный обход CFG, проверки декодированных записей в регистры и охвата исключений, точную валидацию очистки и консервативное отклонение вложенных/множественных освобождений/смешанных форм исключений. Это частичная реализация, а не полный порт вышестоящего создателя регионов. Исходные условия SPDX/лицензии и уведомления по-прежнему покрываются приведёнными выше файлами.

Отображаемые псевдонимы классов и пакетов

native_java/names.rs следует разделению исходной идентичности и допустимых псевдонимов исходного кода в зафиксированном JADX RenameVisitor.java, в частности checkClassName и checkPackage. RDX использует свою существующую инъективную схему псевдонимов в hex UTF-8 вместо настраиваемого провайдера псевдонимов JADX и глобального прохода разрешения коллизий. Заголовки, конструкторы, операнды типов и импорты используют псевдонимы; ссылки на исходный код сохраняют исходные имена DEX. Это не полный порт RenameVisitor.

Подмножество синхронизированных регионов дополнительно обрабатывает негенерирующую исключений защёлку цикла вне защищённого интервала DEX и эмитирует циклы полностью внутри доказанного региона монитора. Он сохраняет разделение региона монитора зафиксированного создателя, требуя при этом охвата для каждой генерирующей исключения инструкции тела, кроме доказанного освобождения.

Реконструкция вложенной дублированной очистки

native_java/finally_regions.rs использует подход распознавания дублированной очистки из зафиксированного JADX MarkFinallyVisitor.java. Это ограниченное подмножество на Rust, а не полный порт visitor: один вызов очистки void со стабильным входом, одна нормальная копия, catch-all rethrow и охватывающий типизированный catch с терминальными путями. Он проверяет исходную диспетчеризацию исключений для каждой инструкции, границы потока управления, операнды очистки и ссылки на исходный код перед эмиссией. Неподдерживаемые вложенные структуры по-прежнему откатываются.

Точные метаданные исключений Android framework основаны на декларациях платформы: ActivityNotFoundException, RemoteException, и IBinder.transact.

Действие Frida для буфера обмена

UI фрагмента метода и формат логирования в src/frida_snippet.rs следуют JADX FridaAction. Генератор на Rust читает точные дескрипторы символов DEX, всегда выбирает точную перегрузку, использует позиционные имена аргументов и вызывает эту захваченную перегрузку. Каждый фрагмент ограничен областью внутри Java.perform, поэтому вставленные фрагменты не могут перезаписать дескрипторы методов друг друга. Фрагменты для всего класса и полей не реализованы.

Скачать инструмент