Найти в Дзене
vanbka9 blog

Приложение для динамической отладки Jadx

1. Предисловие Jadx поддерживает динамическую отладку приложения, но я никогда не пробовал это. Пора бы изучить это дело... 2. Сопутствующие знания 2.1 Принцип динамической отладки Принцип динамической отладки можно резюмировать как следующие шаги: Распространенным методом внедрения кода отладчика является использование библиотеки динамических ссылок (DLL) или механизма общих объектов (SO), предоставляемого операционной системой. В этом случае отладчик загружает определенную библиотеку DLL или SO через API операционной системы и внедряет ее в целевой процесс. Эта библиотека может содержать код отладчика или другие формы кода (например, перехватчики или прокси), позволяющие выполнять операции отладки во время выполнения процесса. Возобновить выполнение приложения: когда отладчик завершает отладку, отладочный код уведомляет приложение о продолжении выполнения и возобновляет выполнение приложения с точки останова. 2.2 Взаимодействие отладчика и целевого процесса Связь между отладчиком и
Оглавление

1. Предисловие

Jadx поддерживает динамическую отладку приложения, но я никогда не пробовал это. Пора бы изучить это дело...

2. Сопутствующие знания

2.1 Принцип динамической отладки

Принцип динамической отладки можно резюмировать как следующие шаги:

  • Запустите процесс приложения: используйте отладчик или другой инструмент, чтобы запустить процесс приложения и подключить его к отладчику.
  • Внедрение отладочного кода: внедрение отладочного кода в процесс приложения для сбора релевантной информации во время работы приложения. Как правило, отладочный код устанавливает точки останова в определенных критических точках приложения и приостанавливает выполнение приложения в точках останова.
Распространенным методом внедрения кода отладчика является использование библиотеки динамических ссылок (DLL) или механизма общих объектов (SO), предоставляемого операционной системой. В этом случае отладчик загружает определенную библиотеку DLL или SO через API операционной системы и внедряет ее в целевой процесс. Эта библиотека может содержать код отладчика или другие формы кода (например, перехватчики или прокси), позволяющие выполнять операции отладки во время выполнения процесса.

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

Возобновить выполнение приложения: когда отладчик завершает отладку, отладочный код уведомляет приложение о продолжении выполнения и возобновляет выполнение приложения с точки останова.

2.2 Взаимодействие отладчика и целевого процесса

Связь между отладчиком и целевым процессом может осуществляться несколькими способами:

  • Связь на основе сокетов: отладчик и целевой процесс могут взаимодействовать через сокеты локальной сети. В приложении отладчик может открывать локальный сокет и прослушивать запросы на подключение от целевого процесса. Как только целевой процесс подключен к сокету, отладчик может отправить процессу инструкции по отладке и получить состояние выполнения и результаты процесса.
  • Взаимодействие на основе общей памяти: отладчик и целевой процесс могут взаимодействовать через общую память. В приложении отладчик может создать область общей памяти и отобразить ее в адресное пространство целевого процесса. Как только общая память сопоставлена целевому процессу, отладчик может записывать инструкции по отладке в память и считывать состояние выполнения и результаты процесса из памяти.
  • Взаимодействие на основе межпроцессного взаимодействия: отладчик и целевой процесс могут взаимодействовать через механизм межпроцессного взаимодействия (IPC). В приложении отладчик может использовать механизмы IPC (такие как каналы, очереди сообщений, сигналы и т.д.) для отправки инструкций по отладке и получения состояния выполнения и результатов от целевого процесса.

2.3 debuggable

debuggable - это свойство приложения Android, которое указывает, позволяет ли приложение отладчику подключаться к процессу приложения. Когда свойству debuggable присвоено значение true, отладчик может подключаться к процессу приложения и может просматривать и изменять состояние и поведение приложения.

Присвоение свойству debuggable значения true часто полезно при разработке и тестировании приложений, поскольку это позволяет разработчикам использовать отладчик для быстрого обнаружения и устранения проблем. Например, разработчик может использовать отладчик для просмотра значений переменных, выполнения строк кода, установки точек останова и многого другого.

Однако для атрибута debuggable следует установить значение false перед выпуском приложения в рабочую среду, чтобы повысить безопасность приложения. Если для атрибута debuggable приложения установлено значение true, то хакеры могут использовать отладчик для просмотра конфиденциальных данных приложения, выполнения вредоносного кода и т.д., что будет представлять большую угрозу для безопасности приложения.

Следует отметить, что если приложение защищено или использует другие технологии защиты, может оказаться невозможным установить для свойства debuggable значение true. Кроме того, некоторые версии системы Android могут ограничивать отладочное свойство приложения, поэтому перед установкой отладочного свойства, пожалуйста, убедитесь, что вы понимаете среду и ограничения приложения.

В Android 4.2 и выше Google ограничивает отладочный атрибут, и только когда сигнатура приложения совпадает с сигнатурой системы, отладочному атрибуту разрешается присваивать значение true. Это делается для повышения безопасности приложения и предотвращения использования хакерами отладчика для кражи конфиденциальной информации приложения.
В Android 7.0 и выше Google еще больше усилил ограничения на атрибут debuggable. Только тогда, когда android:debuggable=”true” явно объявлено в AndroidManifest приложения.xml файл, разрешите только присвоить свойству debuggable значение true. Это делается для того, чтобы приложение случайно не включило отладку в рабочей среде, тем самым снижая безопасность приложения.

2.4 ro.debuggable

ro.debuggable - это системное свойство Android, которое указывает, находится ли вся система Android в режиме отладки. Если установлено значение 1, вся система может быть подключена и отлажена с помощью отладчика. При значении 0 отладчик не может подключить всю систему целиком, что может повысить безопасность системы.

Чтобы перевести всю систему в режим отладки, системное свойство ro.debuggable должно быть установлено значение 1. Этого можно достичь, выполнив следующую команду в интерфейсе командной строки устройства:

adb shell setprop ro.debuggable 1

Установив ro.значение debuggable равно 1, вся система Android может работать в режиме отладки и позволять отладчику подключаться ко всем приложениям в системе для отладки.

2.5 Режим разработчика – переключатель отладки

Включение опции debuggable в режиме разработчика просто позволяет приложению запускаться в режиме отладки и позволяет отлаживать приложение с помощью отладчика. На самом деле, если система работает нормально свойство ro.debuggable имеет значение 0, приложение не может быть отлажено в режиме системной отладки, даже если опция debuggable включена в режиме разработчика.

Начало динамической отладки

Основываясь на приведенных выше базовых знаниях, предлагаются две идеи отладки.

Инструкция по установке frida есть на сайте

Идея 1: Изменение значение атрибута debuggable при помощи frida Hook

rо.debuggable=0
debuggable=”false” через hook -> debuggable=”true”

Используйте Frida hook, чтобы установить для свойства debuggable приложения значение true .

// подключаемся к указанному приложению и выполняем указанную функцию
Java. perform(function () {<!-- -->
// название пакета
var packageName = 'com.example.myapp';

// модифицированное значение параметра
var debuggableValue = true;

// найти класс Application
var Application = Java. use('android. app. Application');

// изменить значение параметра
debuggable
Object.defineProperty(Application, 'debuggable', {<!-- -->
get: function () {<!-- -->
return debuggableValue;
},
set: function (value) {<!-- -->
debuggableValue = value;
}
});

// вывод отладочной информации
console.log(`Успешно установлено значение debuggable = ${<!-- -->debuggableValue}`);
});

Этот скрипт подключит android.app.Application приложения и установит для свойства debuggable значение true. Чтобы выполнить этот скрипт в приложении, введите следующую команду в консоли для выполнения при запуске:

frida -U -N com.example -l c:/1/script.js

Далее вы должны использовать jadx, чтобы выбрать процесс для отладки, но с моим устройством возникла проблема, и процесс моего приложения пуст. Я не знаю почему.

Идея 2: Изменить ro.debuggable значение

ro.debuggable=0 изменить -> ro.debuggable=1
debuggable=”false” через хук -> debuggable=”true”

Сначала посмотрим текущее значение ro.debuggable

adb shell getprop ro.debuggable

Так как сейчас большинство систем находится в ro предлагаю несколько вариантов развития событий:

2.1 Изменение с помощью magisk resetprop

adb shell magisk resetprop ro.debuggable 1

но учтите что после перезагрузки телефона значение сбросится

2.2 Изменение с помощью модуля magisk

создаём модуль для подмены props и устанавливаем в magisk (мб дополню позже как создать модуль)

в таком случае во время загрузки телефона будет автоматически устанавливаться ro.debuggable 1

Динамическая отладка jadx

Возвращаясь к исходному вопросу, первоначальный вопрос заключается в том, что процесс отладки jadx не существует. Когда мы изменим ro.debuggable системы, будет ли отличаться список процессов jadx?

-2

Ответ - да, мы уже можем выбрать процесс любого приложения
Сначала выберите количество строк для отладки, затем выберите код smali

-3

Нажмите клавишу F2, чтобы прервать точку, и нажмите клавишу F9, чтобы начать мониторинг. Когда логика программы достигнет точки останова, она будет заблокирована и начнется отладка. Стек вызовов и информацию о параметрах можно увидеть на рисунке.

Более подробную информацию по отладчику можно найти здесь

Итог:

Можно видеть, что когда мы устанавливаем значение 1 для ro.debuggable системы, даже если значение debuggable нашего приложения не равно true, оно может быть динамически отлажено.