Выше мы объяснили принципы и практические операции общей упаковки Android. Теперь мы объясним текущие основные инструменты и процессы распаковки. Из-за ограниченных возможностей автора мы постараемся описать их подробно. Целый обстрел снаряда Процесс и принцип, если в этой статье есть ошибки, поправьте меня, спасибо~
Инструментальный обстрел подразумевает использование существующих инструментов для обстрела. Многие большие парни разработали множество практических инструментов, которые мы можем использовать напрямую (хи-хи-хи)~.
Благодаря Frida очень удобно искать и сбрасывать память на компьютере. Вам больше не придется перебирать громоздкий код Xposed для получения соответствующих классов и методов в Dex. Вам нужно только сосредоточиться на том, как искать нужные вам функции. Вот и все. Чтобы найти полный dex, используйте поиск методом перебора dex035. Что касается декса, протирающего голову, мы можем найти его, сопоставив некоторые функции~
Адрес проекта: https://github.com/hluwa/FRIDA-DEXDump
Способ использования также стал намного проще. С помощью экспертной схемы использования вы можете быстро распаковать информацию.
Давайте проведем краткую демонстрацию его использования вместе с объектом.
Потом снова откройте тот декс, который вы сняли, и всё~
ps: После получения dex рекомендуется использовать Jadx для декомпиляции. dex2jar немного устарел...
Также прилагается подробное введение: идти глубже FRIDA-DEXDump копье и щит в
Процесс производства Fart немного громоздкий. Основная причина заключается в том, что код FART формируется путем изменения небольшого количества файлов исходного кода Android. Модифицированный исходный код Android компилируется в образ системы и прошивается в мобильный телефон. После запуска такого мобильного телефона Apk можно распаковать~. Исходя из этого, я предпочитаю называть его курицей в скорлупе, потому что модифицированный исходный код Android компилируется в образ системы и прошивается в телефон~
Официальное введение: Решение для автоматизированного обстрела на основе активных вызовов в среде ART, реализованное на базе Android 6.0 и теоретически может быть пересажено в любую систему~
Адрес проекта:https://github.com/hanbinglengyue/FART
Конкретные принципы и шаги реализации описаны в Kanxue:
Процесс обстрела:
1. Установить apk, который нужно распаковать и в настройках предоставить права на чтение и запись на sd карту (иначе файлы под дампом не смогут быть записаны на sdcard)
2. Щелкните значок приложения, чтобы начать процесс распаковки.
Затем вы можете отфильтровать журналы с тегом ActivityThread в logcat и дождаться появления «пердежного запуска» в процессе приложения для распаковки. В это время процесс активного вызова завершается. Расчищен
Файл dex и файл bin тела функции находятся в каталоге с именем пакета /sdcard/fart/app~
На скриншоте ниже показан запущенный процесс и результаты распаковки Fart.
Официальные Ps: Добавьте две разные реализации версии Fart для Frida, каждая со своими характеристиками. Его можно реализовать для дампа всех функций определенного класса или даже CodeItem определенной функции. Если вам это нужно, вы можете испытать его мощные обстреливающие способности. (Обратите внимание, что тестовая среда — Pixel Android8.0, frida-server 12.8.0)
Активная артиллерийская машина Youpk на основе ART в основном предназначена для общего усиления ловкости и различных усилений для извлечения ловкости. Однако в настоящее время Youpk поддерживает только поколение пикселей 1. Поэтому вам понадобится мобильный телефон Pixel 1 поколения и прошить соответствующую систему~
Основной процесс заключается в следующем:
Адрес проекта:https://github.com/youlor/unpacker
В этом адресе больше процессов, методов, вопросов внимания и т. д. Если нужно, можете посмотреть.
Выше мы писали, что пока функция содержит объект DexFile, вы действительно можете получить объект через Hook, а затем получить начало и размер для выполнения обстрела. В настоящее время наиболее часто используемые фреймворки Hook — это Xpose и frida. Похоже на Frida. используется многими людьми и удобен. Здесь мы используем frida для демонстрации ~.
Сначала используйте GDA, чтобы идентифицировать упаковщика~
Вроде очевидно, что запаковано целиком. Не знаю, есть ли другие упаковщики. Давайте сначала распакуем.
Сначала найди точку обстрела~
Открываем libart.so через IDA и ищем DexFile. Можем найти большое количество точек обстрела.
Затем мы пишем скрипт-крючок
Причина, по которой мы начинаем и добавляем здесь указатель, заключается в том, что ранее мы упоминали, что dexfile содержит адрес виртуальной функции, поэтому мы добавляем смещение указателя.
Затем запустите frida_server на своем телефоне.
Прикрепите процесс для выполнения дампа. Здесь мы сохраняем его под sdcard, поэтому нам нужно заранее предоставить права на чтение и запись файла.
Как видно на фото, обстрел на данный момент прошел успешно~
Затем используйте jadx, чтобы открыть соответствующий dex и просмотреть его.
На данный момент это означает, что мы успешно распаковали все приложение, но приложение все еще кажется извлеченным из оболочки. После извлечения оболочки откроется отдельная статья для записи~.
Метод инструментирования и оболочки заключается в том, чтобы найти соответствующую точку оболочки в исходном коде Android, затем вставить соответствующий код, перекомпилировать исходный код для создания образа системы и, наконец, использовать настроенную систему для оболочки ~
Принцип похож на youpk. Как скомпилировать исходный код, подробно описываться не будет. Друзья, нуждающиеся в помощи, могут прочитать эту статью~. Компиляция исходного кода (1) — подробное объяснение компиляции исходного кода Android6.0.
Тогда давайте объясним это с помощью картинок, которые нарисовал босс. Таким же образом мы еще находим точку обстрела. Мы можем просто найти точку обстрела LoadMethod и затем выполнить инструментирование.
//add
char dexfilepath[100]=0;
memset(dexfilepath,0,100);
sprintf(dexfilepath,"%d_%zu_LoadMethod.dex",getpid(),dex_file.Size());
int dexfd = open(dexfilepathm,O_CREAT|O_RDWR,666);
if(dexfd>0){
int result = write(dexfd,dex_file.Begin(),dex_file.Size());
if(result>0){
close(dexfd);
LOG(WARNING)<<"LoadMethod"<<dexfilepath;
}
}
//add
Таким же образом мы также вставляем этот код в выполнение и, наконец, компилируем его, и компиляция проходит успешно.
Затем предоставьте программе разрешение на SD-карту, запустите приложение еще раз, и вы увидите, что извлеченный файл dex сохранен в каталоге sdcard.
Затем используйте jadx и откройте dex, и вы получите тот же результат, что и выше~
Ps: Поскольку этот метод требует модификации и компиляции исходного кода Android, автор этой статьи не реализовал его. Если у вас есть вопросы, не стесняйтесь сообщать (я скомпилирую, если возникнут вопросы).
Мое собственное понимание распаковки отражений заключается в использовании отражения для получения серии загрузчиков классов.,Наконец получите структуру DexFile,Затем получите переменнуюmCookie&mFileNameПосле этих двух атрибутов,Получить указатель памяти dexFile,Этот указатель затем преобразуется в dexfile,Затем используйте findClassDef, чтобы соответствовать искомому dex.,наконецdumpзаписать файл~ С помощью предыдущих резюме процесс выглядит следующим образом:
Тогда давайте проведем демонстрацию~ mCookie — это указатель на dex-файл на собственном уровне. Затем мы используем принцип отражения для получения mCookie, а затем можем его распаковать. Здесь мы по-прежнему используем frida для демонстрации кода.
Написание кода ловушки
Распечатайте соответствующие значения
Вы можете увидеть декс того же размера
Затем используйте jadx, чтобы открыть его и обнаружить, что тот же интерфейс появляется снова!
Основной принцип метода динамической отладки заключается в получении начального адреса и размера DexFile, но все методы различны. Если вышеописанное заключается в изменении кода для получения некоторых значений, то следующим шагом будет использование инструмента IDA для получения. соответствующий начальный адрес и размер, а затем выгрузите его с помощью скрипта~.
Пожалуйста, наслаждайтесь! Сначала выбираем точку обстрела, мы по-прежнему выбираем DexFile::DexFile
Затем запустите android_servcer на телефоне, не забудьте запустить его как root.
Затем используйте IDA для процесса подключения.
Тогда Ида начала вмешиваться
Затем мы открываем libart.so и находим DexFile::DexFile.
Затем поставьте точку останова в функции, а затем нажмите F9, чтобы подойти и посмотреть.
Здесь хорошо видно, что X1 — это начальный адрес DexFile, а X4 — значение смещения.
Тогда используй Фриду, чтобы сбросить~
Просто беги, беги прямо
Затем используйте gda для просмотра локального файла dump.dex.
Выяснилось, что это прокси-класс. Размер сравнения не тот, который нам нужен. Нажмите F9 еще раз, и вы увидите, что адрес снова изменился. Вычислите его снова, исходя из длины. После нескольких попыток он все равно. не выходит. Это больше не происходит, но ощущение можно получить в качестве демонстрации, это не требует слишком много усилий ~
Специальная отладка API означает получение Dex с помощью методов API, предоставляемых системой Android. Системы Android 7.0 и ниже предоставляют два API: getDex и getBytes, поэтому, если мы хотим получить объект, мы можем напрямую вызвать эти два API ~.
Однако в ходе реального тестирования было обнаружено, что метод getBytes класса Dex все еще существует в более поздних версиях Android, но метод getDex в базовом классе класса исчез~
Напишите код хука:
Процесс работы:
Затем мы проверяем объект класса программы и выгружаем объект класса по своему желанию.
После получения dex мы используем инструмент jadx, чтобы открыть его снова~
Вы сможете успешно сбросить его, как только найдете его ~
В этой статье обобщаются некоторые часто используемые решения по распаковке общей упаковки dex и воспроизводятся их, но она используется только в качестве эксперимента для углубления вашего понимания (в настоящее время получить исходный код Dex не так-то просто), но есть заинтересованные друзья, которые могут пойти на протяжении всего процесса, как я, чтобы углубить их понимание~
https://bbs.kanxue.com/thread-273293.htm#msg_header_h2_6
Фотографии, упомянутые в статье, частично взяты из статьи Шуан Цю~