Се­год­ня в выпус­ке: обна­руже­ние динами­чес­ки заг­ружа­емо­го при­ложе­нием кода, реверс при­ложе­ния для шиф­рования фай­лов, рас­сказ об исто­рии соз­дания StateFlow, SharedFlow и BroadcastChannel в Kotlin, статья с под­боркой инс­тру­мен­тов для сер­верной раз­работ­ки на Kotlin, объ­ясне­ние сути кон­трак­тов Kotlin, замет­ка о фун­кции Surround With в IDEA и Android Studio. А так­же под­борка све­жих биб­лиотек для раз­работ­чиков.
 

Почитать

 

Обнаружение динамически загружаемого кода

Detecting Dynamic Loading in Android Applications With /proc/maps — статья о том, как опре­делить, заг­ружа­ет ли при­ложе­ние допол­нитель­ный исполня­емый код уже пос­ле сво­его стар­та. Так час­то дела­ют злов­реды, что­бы избе­жать обна­руже­ния злов­редно­го кода.

Ме­тод край­не прос­той. Дос­таточ­но иметь рутован­ный смар­тфон с уста­нов­ленным при­ложе­нием и кабель для под­клю­чения к ПК. Далее выпол­няем коман­ду adb shell, что­бы открыть кон­соль устрой­ства, получа­ем пра­ва root с помощью коман­ды su, узна­ем имя PID (иден­тифика­тор про­цес­са) нуж­ного нам при­ложе­ния:

$ ps -A | grep имя.пакета.приложения

PID будет во вто­рой колон­ке. Теперь выпол­няем сле­дующую коман­ду, под­став­ляя получен­ный PID:

cat /proc/PID/maps | grep '/data/data'

Файл /proc/PID/maps син­тетичес­кий. Он содер­жит таб­лицу всех отоб­ражен­ных в памяти про­цес­са фай­лов. Пер­вая часть при­веден­ной коман­ды чита­ет этот файл. Вто­рая часть коман­ды (grep /data/data) оставля­ет в выводе толь­ко фай­лы из при­ват­ного катало­га при­ложе­ния (/data/data/имя.пакета.приложения). Имен­но отту­да злов­реды обыч­но заг­ружа­ют допол­нитель­ный код.

 

Дешифровка зашифрованных приложением файлов

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.m10791a() ока­зал­ся иско­мым методом шиф­рования.

    Как вид­но из кода, метод шиф­рует файл алго­рит­мом 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):

    /sdcard/Android/data/eztools.calculator.photo.vault/files
  5. Те­перь фай­лы мож­но извлечь и рас­шифро­вать. Автор написал для это­го скрипт на Python, при­водить его здесь я не буду.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Оставить мнение