Главная страница

IAppsdrm 0 взломана неактуально (upd) iAppsdrm 0 взломана неактуально (upd)


Скачать 1.04 Mb.
НазваниеIAppsdrm 0 взломана неактуально (upd) iAppsdrm 0 взломана неактуально (upd)
Дата27.10.2022
Размер1.04 Mb.
Формат файлаdocx
Имя файлаReverse side of the iAppsDRM .docx
ТипАнализ
#757643

версия DRM - статус:

iAppsDRM v1.0 - взломана - неактуально (upd)

iAppsDRM v2.0 - взломана - неактуально (upd)

iAppsDRM v3.0 - взломана + fix - неактуально

(upd)

iAppsDRM v3.1 - взломана + fix - актуально

iAppsDRM v1.0



Подготовка


Сам файл DRM-защиты распространяется в виде .dylib файла + .bundle (.bundle - отвечает за ресурсы библиотеки). Далее мы будем рассматривать именно .dylib файл, так как весь исходный код содержится именно в нем.
Для обхода была использована программа IDA Pro (7.6), более ничего не нужно.


Анализ кода


Во-первых, следует сказать, что библиотека не обфусцирована, что намного упрощает исследование исходного кода.

Этап 1. Знакомство со структурой защиты


При открытии библиотеки мы видим огромное количество строк, методов, классов и функций. Первое что приходит в голову - это найти что-то, связанное со строкой “premium”, “check_premium” и подобное. Например:


На фото выделены красным светом важные для нас объекты.

  • В первом случае это функция (void*)checkPremium(). Название функции говорит само за себя.

  • Во втором случае это переменная типа boolean, вероятно содержащая информацию о том, является пользователь premium-ом, или же нет.


Кажется, вот, вот оно, то, что нужно! Берем, возвращаем функции True, и все, готово! Эх, было бы все так просто :(
Но, исследовав функцию checkPremium() дальше, становится ясно, что она точно не возвращает true/false. (Было выяснено в результате тестов) По моим наблюдениям, функция лишь участвует в цепочке целого ряда функций, отвечающих не только за проверку премиума, но и также отвечающих за работоспособность всей защиты в целом:

Этап 2. Как это работает?


Продолжив анализ кода дальше, мы выяснили, что управление функции checkPremium() передается из другой функции - actionAuth(). Она, в свою очередь, вызывается при нажатии на кнопку “Авторизация”, и запускает процесс проверки премиума.
Функция actionAuth() состоит из следующих этапов:

  • Редирект на сервер iapps.rejail.ru. Там пользователь должен авторизоваться через свой телеграмм.

  • По возвращению в приложение управление программой передается функции checkPremium(). О ней будет написано ниже. (после обновления до v3.0 функция вызывается по возвращению в приложение, только если до этого была исполнена функция actionAuth() )


Функция checkPremium() вызывается всякий раз, когда вы возвращаетсь в приложение и состоит из следующих этапов:

  • Обработка и получение данных с ответа сервера iapps.rejail.ru. Здесь остановимся поподробнее.




Ответ от сервера имеет следующую структуру:

“success” - тело обьекта

“user_id” - ваш id, используемый при авторизации в телеграме.

“premium” - состояние вашего премиума

“hash” - хэш, судя по всему, необходим для проверки целостности запроса, в случае его изменения изменится хэш, а следовательно защиту таким образом, увы, не обойти.
На данном этапе делать что-либо бесполезно, это не принесет ничего хорошего.


  • Далее приложение показывает нам alert, мол, идет проверка полученных данных.


А это уже, очень, и очень интересно. Значит где то в этом месте и происходит нужный нам процесс, именно тут и надо действовать.

Этап 3. Первая попытка обойти защиту



После подробного исследования природы возникновения данного алерта, я выделил один важный момент. В случае, если пользователь не состоит в канале iApps Premium, программа возвращает Internal Error. Следовательно, нужно найти функцию, отвечающую за обработку ошибок. И так, такая функция действительно существует - sub_6568. Ниже я приложил блок схему для понимания ее работы.


*цифрами обозначены блоки обработки ошибок

** красной линией обозначен “путь”, необходимый для успешного прохода данной функции.


Действуя по данной схеме, мы можем понять, что после авторизации нас кидает на Internal Error, следовательно, нам нужно сделать безусловный переход на следующий блок, обойдя ошибку. (см. ниже)


*на фото выделена нужная нам для патча инструкция

** loc_685C адрес функции, на который мы должны перейти

Здесь необходимо с помощью функций IDA Pro поменять инструкцию CBZ X0, loc_685C (условный переход) на BL loc_685C (безусловный переход)
Сохранив изменения, я принялся проверять это на практике. Открыв приложение, я прошел авторизацию, и о чудо!!, окно авторизации пропало, что свидетельствует об успешной авторизации. Однако, при попытке нажать что-либо в самом приложении мы получаем неожиданный результат - невозможно нажать что-либо. Это действительно поставило меня в ступор, в чем же могло быть дело?
Подумав все вместе, мы пришли к таким вариантам:

  • Это особенность DRM-защиты

  • Баг в самой DRM-защите (iAppsDRM.dylib)


После всех обсуждений и тестов, выяснилось, что, вероятнее всего, это была ошибка библиотеки. Окно авторизации закрывалось, но криво, из-за чего происходила такая ситуация.
Это “остаточное” окно можно было убрать с помощью FlexLoader, однако такой вариант не очень. В качестве решения необходимо было вырезать это окно.

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

Этап 4. Вторая попытка обойти защиту



Поковырявшись в коде дальше (пропустим подробности, так как заняло много времени), я нашел функцию, отвечающую за отрисовку окон самой DRM. Это функция sub_8154.



*Красным цветом выделен класс UiWindow, находящийся в блоке инициализации окон DRM.

**Рядом находится функция loc_81BC, куда нам и нужно перейти.
Следуя своей логике, я понял, что обойдя инициализацию класса, мы обойдем и саму защиту, ведь ее окна попросту не загрузятся, позволяя нам взаимодействовать с приложением :)
Для этого, необходимо заменить инструкции CBZ X20, loc_81BC на BL loc_81BC.
После патча я сохранил изменения и пошел тестировать. И наконец-то, защита была повержена. Окна DRM защиты не были загружены, однако сама библиотека успешно загрузилась и работала (выяснилось по логам). Теперь мы могли пользоваться приложением в полную силу.

Доп. информация





  1. После функции checkPremium() выполняется переход к объектам Keychain. Данные авторизации сохраняются в зашифрованную базу данных, используя технологию Apple Keychain API. Достать данные из этой базы невозможно.

  2. Возможно, в следующих версиях DRM будет реализована проверка сертификатов (допускаю вариант, что для прохода DRM необходим будет сертификат от iApps), об этом свидетельствуют логи, а также код программы:

Код:



*Красным цветом выделены объекты, относящиеся к проверке сертификата.
Логи:

1)

Здесь содержится полная информация о сертификате, которым вы подписывали приложение.

2)
Здесь все также: информация о вашем сертификате.

Таким способом можно обойти DRM в любых приложениях от iApps, в которых используется разновидность iAppsDRM v1.0


iAppsDRM v2.0




Изменения


Во-первых, сама идея и система реализации DRM-защиты была изменена. Ранее, сама библиотека распространялась отдельным .dylib файлом. Однако в полученной версии Instagram Plus защита была вшита в сам взлом. (как оказалось потом - защита не вшита в взлом, файл-обманка) Если в первой версии DRM эту защиту можно было убрать вообще (удалить .dylib файл), то здесь, удаляя файл, мы удаляем и сам взлом Instagram Plus.


Анализ кода


В сравнении с iAppsDRM v1.0, код был изменен. В основном это мелкие изменения, однако есть и такие изменения, которые меняют подход ко взлому.


  • были удалены какие-либо упоминания о сообщениях об ошибках (см. статью про iAppsDRM v1.0)

  • мелкие изменения, оптимизация


И тут возникает вопрос, а что же тогда делать? Обойти ошибку простым путем, как в первой версии не получится, что делать? И поизучав код я нашел решение, идентичное первой версии - убрать инициализацию окон DRM.


Патч программы


В сравнении с v1.0 функция инициализации окон DRM была изменена. Для исследования кода была использована все та же версия IDA Pro. Название функции было изменено: sub_8154 -> sub_64E8 (в зависимости от программы).

На фото вы можете увидеть пропатченные инструкции arm64 (выделены в красный прямоугольник). В отличие от v1.0, здесь было необходимо пропатчить две инструкции:

обойти переход на блок инициализации окон DRM + поменять значение регистра X21 на true (зачем, я сам не знаю, но без этого программа крашится)
Тем самым мы обошли инициализацию окон DRM защиты, что позволяет нам пользоваться программой в полной мере :)

Доп. информация



Таким способом можно обойти DRM в любых приложениях от iApps, в которых используется разновидность iAppsDRM v2.0.

iAppsDRM v3.0

Изменения



В отличие от первых двух версий DRM-защиты, v3.0 претерпела серьезные изменения. (к сожалению, не в плюс нам)


  • основной код DRM функций обфусцирован собственным обфускатором (ориг. - LLVM, на 90% переписан разработчиком)

  • DRM полностью вшита в взлом, удаление защиты файлом удалит сам взлом

  • В ходе экспериментов было выяснено, что любое изменение инструкций arm64 проверяется на уровне программы путем вычисления и проверки хэша. (в случае несовпадения - ошибка при входе в аккаунт.)


ВНИМАНИЕ: защита iAppsDRM v3.0 взломана (спустя 2 дня). Файл опубликован в общий доступ не будет, однако вся информация и подробности будут написаны здесь.


Анализ кода



Код был довольно хорошо обфусцирован. Разработчик защиты использовал обфускатор LLVM (работает на уровне компилятора). Однако есть важная особенность - этот обфускатор был серьезно переписан самим разработчиком DRM-защиты. Следовательно, использовать готовые инструменты для деобфускации не получится.
Исходный код, по моей информации, не претерпел никаких изменений. Обфускация сделала его исследование практически невозможным.
Особенности взлома:

  • использовать предыдущие методы обхода не представлялось возможным. (любые изменения/манипуляции с классами UIKit приводили к намеренному крашу приложения)

  • обойти проверку хэш-суммы невозможно, функция находится в обфусцированной части кода.

  • патчинг программы с помощью твика (.dylib) не даст ничего хорошего, программа заметит изменения

  • при запуске программы идет восстановление блоков функции (механизм обфускатора LLVM), вследствие чего программа на пару секунд зависает



Описание уязвимости



Ядро обфускатора (подтверждено)
Спустя какое-то время анализа кода я понял, что победить защиту как в других версиях не получится. Соответственно, нужно было копать в других направлениях. Нижняя часть кода не была обфусцирована, однако, спустя долгое время, я там ничего не нашел. Зная о существовании уязвимости, я решил посмотреть в главный блок всей DRM-защиты. Функция sub_55D4. Там происходят какие то интересные (нет) процессы, однако есть важная вещь - ядро обфускатора:

В самом ядре ничего интересного для нас нет. Однако, хорошенько подумав, я понял, что не дав запуска ядру обфускатора, основные функции DRM-защиты не будут запущены, и взлом нужной программы останется, ведь функция взлома не обфусцирована и находится в нижней части кода. В этом и заключалась потенциальная уязвимость защиты iAppsDRM v3.0. Технически, исправить ее невозможно.
ИСПРАВЛЕНО: краш приложения спустя 1 минуту после запуска. Подробнее будет написано ниже.

Патч программы


Для взлома защиты необходимо было убрать вызов функции _iadrm_core_setup (см. скрин выше). Для этого, используя функции IDA Pro изменяем выделенную инструкцию на инструкцию MOV X0, X21. (при этом не нарушаем логики исполнения программы).
Запустив программу, я увидел, что DRM-защита не запустилась, однако сам взлом был активирован (отключена реклама + премиум подписка). Защита взломана.

Исправление вылета



После патча DRM-защиты выяснилось, что спустя ровно 1 минуту приложение с пропатченной DRM вылетает. Было много разных версий, вплоть до механизма защиты. Однако все оказалось куда легче: разработчик использовал в своей программе библиотеку tokio-runtime-worker. В свою очередь, методы этой библиотеки обращались к незагруженным функциям (вследствие патча защиты). После чего происходил вылет, так как нужной функции просто не существовало.
Долгое время я пытался найти вызовы функций этой библиотеки в коде. Но безуспешно. Однако, мне удалось получить крашлог:


*Красным цветом выделена “проблемная” функция

**Оранжевым цветом обозначен блок запуска потока tokio-runtime-worker

***Синим цветом выделен блок ошибки и закрытие программы.
В результате анализа я выяснил, что переход к обфусцированным функциям tokio-tuntime-worker происходит после func_1130AC func_1133FC. Необходимо было убрать вызов второй функции, что я и сделал. (замена инструкции вызова функции на предыдущую инструкцию).
В результате программа успешно запустилась и работала без нареканий.
Актуально для всех программ с iAppsDRM v3.0
P.S Crash-fix написан на примере программы 365Score. Существуют также другие программы с этой версией DRM и с такими же вылетами. Основная проблема - поиск нужной для патча функции. Ориентир поиска - поиск по тексту “_pthread_setname_np”. Примерная схема функции:




Доп. информация



Таким способом можно обойти DRM в любых приложениях от iApps, в которых используется разновидность iAppsDRM v3.0 (3.1)

Взломанные приложения:


  • Instagram Rocket | 251.0

  • 365Scores (рассмотрено в статье) | 5.6.7

  • FatSecret | 9.14

  • Photomath Plus | 8.11.0

  • Instagram Plus | 2.50

  • TikTok LRD | 2.1


Стало известно, что при каждом входе в приложения iApps собирает ваш UDID устройства. В любой момент iApps может заблокировать доступ к приложениям по вашему UDID. Подробная информация будет позже.
written by @retr0dev with ❤️
credits:

@retr0dev - main bypass/fixes all versions

@haxonate - additional information (crashlogs, comments on the code)

@leeksov - tips and suggestions


написать администратору сайта