Android: StateFlow, SharedFlow и BroadcastChannel
Сегодня в выпуске: обнаружение динамически загружаемого приложением кода, реверс приложения для шифрования файлов, рассказ об истории создания StateFlow, SharedFlow и BroadcastChannel в Kotlin, статья с подборкой инструментов для серверной разработки на Kotlin, объяснение сути контрактов Kotlin, заметка о функции Surround With в IDEA и Android Studio. А также подборка свежих библиотек для разработчиков.
Почитать
Обнаружение динамически загружаемого кода
Detecting Dynamic Loading in Android Applications With /proc/maps — статья о том, как определить, загружает ли приложение дополнительный исполняемый код уже после своего старта. Так часто делают зловреды, чтобы избежать обнаружения зловредного кода.
Метод крайне простой. Достаточно иметь рутованный смартфон с установленным приложением и кабель для подключения к ПК. Далее выполняем команду adb
, чтобы открыть консоль устройства, получаем права root с помощью команды su
, узнаем имя PID (идентификатор процесса) нужного нам приложения:
$ ps -A | grep имя.пакета.приложения
PID будет во второй колонке. Теперь выполняем следующую команду, подставляя полученный PID:
cat /proc/PID/maps | grep '/data/data'
Файл /
синтетический. Он содержит таблицу всех отображенных в памяти процесса файлов. Первая часть приведенной команды читает этот файл. Вторая часть команды (grep /
) оставляет в выводе только файлы из приватного каталога приложения (/
). Именно оттуда зловреды обычно загружают дополнительный код.
Дешифровка зашифрованных приложением файлов
Decrypting images hidden with Calculator+ — разбор способа реверса и последующей расшифровки файлов приложения Calculator+ — Photo Vault & Video Vault hide photos. Пример крайне простой и поэтому хорошо подходит для демонстрации основ реверса приложений для Android.
Итак, есть приложение Calculator+, которое имеет неожиданную функцию секретного хранилища зашифрованных фотографий и видеороликов. Задача: вытащить эти фотографии, не используя само приложение.
1. Извлекаем приложение из смартфона:
$ adb shell pm list packages|grep calc
$ adb shell pm path eztools.calculator.photo.vault
$ adb pull /data/app/eztools.calculator.photo.vault-OP_MBoGMZN-LZ5wr50dNWA==/base.apk
2. Используем JADX-GUI для декомпиляции приложения обратно в исходный код Java.
3. С помощью встроенной функции поиска ищем все строки, имеющие отношение к шифрованию: encrypt, decrypt, AES и так далее. Автору удалось найти следующий фрагмент кода:
FileInputStream fileInputStream = new FileInputStream(this.f6363e.f6361a);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
EncryptUtils.m10791a("12345678", fileInputStream, byteArrayOutputStream);
byteArrayOutputStream.flush();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
this.f6362d = byteArrayInputStream;
aVar.mo2601d(byteArrayInputStream);
Метод EncryptUtils.
оказался искомым методом шифрования.

Как видно из кода, метод шифрует файл алгоритмом DES и ключом, переданным ему в качестве аргумента. А в аргументе всегда передается строка 12345678.
4. Расшифровать файлы не составит труда, но сначала необходимо найти, где они хранятся. Для этого надо проследить за методами, вызывающими метод шифрования. В итоге нашелся такой код:
public static final File m18904s(Context context) {
C3655i.m20371c(context, "context");
File externalFilesDir = context.getExternalFilesDir("photo_encrypt");
if (externalFilesDir != null) {
return externalFilesDir;
}
C3655i.m20376h();
throw null;
}
Это код создания объекта класса File во внешнем приватном каталоге приложения (context.getExternalFilesDir): /
.
5. Теперь файлы можно извлечь и расшифровать. Автор написал для этого скрипт на Python, приводить его здесь я не буду.
Читать новость в источнике Xakep