Содержание статьи
Почитать
Обнаружение динамически загружаемого кода
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+, которое имеет неожиданную функцию секретного хранилища зашифрованных фотографий и видеороликов. Задача: вытащить эти фотографии, не используя само приложение.
-
Извлекаем приложение из смартфона:
$ 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 Используем JADX-GUI для декомпиляции приложения обратно в исходный код Java.
-
С помощью встроенной функции поиска ищем все строки, имеющие отношение к шифрованию: 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.
оказался искомым методом шифрования.m10791a( ) Как видно из кода, метод шифрует файл алгоритмом DES и ключом, переданным ему в качестве аргумента. А в аргументе всегда передается строка 12345678.
-
Расшифровать файлы не составит труда, но сначала необходимо найти, где они хранятся. Для этого надо проследить за методами, вызывающими метод шифрования. В итоге нашелся такой код:
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):
/sdcard/Android/data/eztools.calculator.photo.vault/files Теперь файлы можно извлечь и расшифровать. Автор написал для этого скрипт на Python, приводить его здесь я не буду.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»