![]() |
При заходе в приложение нас встречает нелицеприятная, но вполне знакомая картина: https://forum.antichat.xyz/attachmen...3670290925.png Что радует - из приложения нас моментально не выкидывает, как в L2. Можно было бы, как я и раньше делал, воспользоваться модулем DenyListи надеяться, что приложение не задетектит рут... Но сегодня мы пожалеем тех, у кого этого модуля нет, и поступим по другому: пы пропатчим само приложение! Для начала откроем его в JADX-GUI (сразу MainActivity): https://forum.antichat.xyz/attachmen...3670415788.png Сразу с самого начала бросается в глаза xorkey- это нам может пригодиться, запоминаем. https://forum.antichat.xyz/attachmen...3670524176.png А здесь можно видеть один из методов защиты от патчеров - проверка библиотек и classes.dex на CRC-хэш. Запоминаем потенциальное место для патчинга и смотрим дальше. https://forum.antichat.xyz/attachmen...3670689921.png Здесь идёт проверка на дебаггинг и наличие рута. Методы checkRoot1, 2, и3 остались с прошлых крякми, там всё то же самое. Если посмотреть на этот же код в smali, можно увидеть следующее: https://forum.antichat.xyz/attachmen...3670960819.png Каждая проверка if-nez ведёт на метку cond_0041, куда нам точно не нужно попасть. В таком случае, можно было бы просто удалить эти строчки, а последнюю - if-eqz v0, :cond_0046 - просто заменить на goto. А можно просто из метки cond_0041сделать пустышку, удалив вызов метода showDialog(). Это куда проще - этим и воспользуемся. И заодно, раз уж мы тут, можно и предоставить себе возможность спокойно дебажить приложение! Для этого понадобится убрать ещё 2 строчки: https://forum.antichat.xyz/attachmen...3671753530.png Но не забывайте - в таком случае в собранном из отредактированных smali-файлов classes.dex изменитсяCRC-хэш, а значит, нам нужно пропатчить ещё и тот кусок кода. Если хорошенько туда присмотреться, то можно понять, что самое опасное для нас - это последний System.exit(): https://forum.antichat.xyz/attachmen...3671897265.png Можно было бы удалить этот вызов - пускай программа высчитывает хэши и логирует об ошибках на здоровье. А можно просто добавить return-void сразу после объявления метода - и на выходе verifyLibs() окажется просто функцией, которая ничего не делает. Как вы захотите это обойти и захотите ли - дело ваше. А нам для нашего грядущего патчинга JADXнедостаточно (без плагинов). Для этого нужно самим распаковать приложение в smali через apktool(я буду пользоваться удобной GUI-версией). Декомпилируем наш apk: https://forum.antichat.xyz/attachmen...3672312909.png После этого рядом с ним у вас должна появиться папка со smali-кодом, ресурсами приложения и прочим. Так как JADXпод капотом использует apktool, то имена классов и методов, что там, что там, совпадают. Поэтому нам нужен тот самый MainActivityпо пути Код:
smali/sg/vantagepoint/uncrackable3/Когда вы будете пытаться собрать приложение обратно, не забудьте проверить, что в пути к папке с кодом нет символов кириллицы - иначе такая вот петрушка вылезет: https://forum.antichat.xyz/attachmen...3673478693.png Переместите папку в другое место и соберите всё, как полагается: https://forum.antichat.xyz/attachmen...3673647837.png Установим приложение на устройство и попробуем зайти в него: https://forum.antichat.xyz/attachmen...3673755028.png Получилось! Мы успешно пропатчили приложение, обойдя его защиту. Чем не повод для гордости? Но не стоит забывать о главной цели - нам нужно достать подходящую под формочку строку. В этот раз разнообразим нашу методологию и попробуем frida. Не буду вещать сейчас, как она устанавливается, скажу лишь, что мне помог этот гайд. Подключаем отладку через adb, запускаем на смартфоне frida-server и проверяем его работоспособность с помощью Код:
frida-ps -Uahttps://forum.antichat.xyz/attachmen...3674395646.png Если же нет - гугл в помощь, товарищи. Из наблюдаемых нами ивентов, которые могут помочь нам с решением, присутствует только кнопка Verify, с соответствующим метод onClick. Попробуем с помощью frida-trace просмотреть, какой класс отвечает за эту кнопку. Конечная команда будет выглядеть так: Код:
frida-trace -U -F -i "*!onClick"https://forum.antichat.xyz/attachmen...3680807160.png И получаем такую хренотень. Гугл на такую ошибку ничего дельного не выдаёт, что же делать? После получаса активного поиска причины этой ошибки и листинга логов ( Код:
logcat | grep -i "uncrackable"https://forum.antichat.xyz/attachmen...3675992528.png Всё-таки фридуприложение видит и защищается от неё. И если в самом приложении мы уже все виды защиты нейтрализовали, остаются только подключаемые библиотеки - не зря же их на CRCпроверяли? Сначала глянем libfoo.so (x86_64) в IDA, для начала откроем строки: https://forum.antichat.xyz/attachmen...3676446162.png А вот и то, что мы видели в логах! Посмотрим, где эта строка используется: https://forum.antichat.xyz/attachmen...3676504659.png А вот и ещё одна мешающая нам защита - уже от fridaи xposed. Её логика проста: она постоянно читает данные из Код:
/proc/self/mapshttps://forum.antichat.xyz/attachmen...3677259261.png https://forum.antichat.xyz/attachmen...3677278778.png Если вы всё сделали правильно, то у вас должен смениться код: https://forum.antichat.xyz/attachmen...3677324059.png После этого не забудьте применить ваш патч к исходному файлу: https://forum.antichat.xyz/attachmen...3677477667.png . Ну и, конечно, с помощью apktoolсоберите заново приложение с новой библиотекой - думаю, с этим у вас проблем не возникнет, только закройде IDAи удалите все остаточные файлы её базы данных, а то будет ошибка при сборке. И, наконец, попробуем с пропатченным приложением и его пропатченной библиотекой запустить всё ту же frida-trace: https://forum.antichat.xyz/attachmen...3680944196.png Опять то же самое... Чекаем логи: https://forum.antichat.xyz/attachmen...3677949237.png А помните, что у нас не одна библиотека, а целых 4? Кажется, нам придётся патчить именно ту библиотеку, архитектура которой совпадает с архитектурой вашего устройства, об этом я сразу как-то не подумал... Чтобы узнать, какая именно архитектура вам нужна, пропишите следующее: Bash: Код:
adb shell getprop ro.product.cpu.abiКод:
arm64-v8aКод:
C0 03 5F D6 (RET)Код:
armeabi-v7aКод:
70 47Код:
BX LRИ теперь, пропатчив всё что только движется, снова собираем этот треклятый apk, устанавливаем, запускаем - и: https://forum.antichat.xyz/attachmen...3681103741.png И наши старания оправдались!!! Отозвались 40функций - фрида работает! Давайте ещё раз глянем, что нам нужно сделать: https://forum.antichat.xyz/attachmen...3682388666.png https://forum.antichat.xyz/attachmen...3682402229.png Судя по всему, check_code() загружается как нативная функция из библиотеки libfoo.so. Узреем её логику работы: https://forum.antichat.xyz/attachmen...3682577440.png В 26-й строчке наглядно видно, что байты одного массива соответствующе ксорятся с другим. Напоминает xorkeyиз начала? Причём v4- судя по всему наш xorkey - мы получаем в 22строчке, а вот второй массив (v9) мелькает только в функции sub_FA0, куда передаётся его адрес. Можно предположить, что там - то, что там будет то, что при XORс xorkeyдаст правильный ответ. И всё было бы хорошо - можно было бы изучить sub_FA0и узнать, как геренируется этот секрет, но ревёрсить эту функцию... Ну... https://forum.antichat.xyz/attachmen...3683437210.png ...не самая лучшая идея. Мы настроили нашу программу под свободный дебаггинг/тамперинг, так что у нас есть 2 пути: либо можно решить через frida(находим базовый адрес libfoo.so, добавляем оффсет функции, и через функции onEnter/onLeave вытаскиваем готовый массив), либо можно отладить это дело через gdb. Признаюсь - этот райтап я писал долгое время, в процессе решения. Изначально я планировал решить крякми черезFrida, но почему-то она отчаянно не хотела находить нужную функцию (мистика =] ), поэтому я представлю своё решение через отладку... Прямо в IDA! Чтобы вы не искали по всему интернету gdbserverпод arm64, вIDA PRO () в папке dbgsrvлежит любезно предоставленный HexRays android_server64. Его достаточно будет запустить из-под рута, через adbнастроить форвард порта - и можно спокойно дебажить библиотеку android-приложения! Bash: Код:
adb push android_server64 /data/local/tmpBash: Код:
suЗатем настройте форвардинг используемого порта: Bash: Код:
adb forward tcp:23946 tcp:23946https://forum.antichat.xyz/attachmen...3889433839.png В качестве дебаггера выберите Код:
"Remote ARM Linux/Android debugger"https://forum.antichat.xyz/attachmen...3889538101.png И дальше в Код:
Debugger -> Debugger OptionsКод:
127.0.0.1https://forum.antichat.xyz/attachmen...3889640626.png Теперь запускайте приложение на смартфоне, и в Код:
Debugger -> Attach to processКод:
owasp.mstg.uncrackable3https://forum.antichat.xyz/attachmen...3889808570.png После этого Ида начнёт судорожно качать библиотеки и скажет: "Я нашла точно такую же библиотеку, как у вас открыта, но она в папке с самим приложением. Хотите её отлаживать?" https://forum.antichat.xyz/attachmen...3889922785.png Мы, конечно же, хотим, поэтому нажимаем "Same". После этого вы остановитесь в непонятном месте - это лишь инициализация библиотеки, так что смело жмём "Continue Process" (F9). А уже после этого можно ввести что-нибудь в формочку и нажать verify- и вы остановитесь на нужной вам функции: https://forum.antichat.xyz/attachmen...3890415000.png Перешагните через эту функцию, не заходя внутрь (F8) и посмотрите, что в переменной v8: https://forum.antichat.xyz/attachmen...3890533549.png Эти 24 байта - и есть наш секретный массив, теперь мы его можем спокойно расшифровать, используя ранее упомянутый xorkey: Python: Код:
xor_keyhttps://forum.antichat.xyz/attachmen...3890677083.png Пробуем нашу строку: https://forum.antichat.xyz/attachmen...3890827909.png Получилось! Поздравляю, мы решили уже довольно сложный крякми, в отличие от первых двух. И декомпилили приложение, и патчили smali, и даже обходили антидебаггинг в библиотеках под разные архитектуры, и дебажили одну из них... Но наши старания окупились! Статья вышла немаленькой - я писал её три дня, в процессе решения самого крякми. Конечно, если бы получилось решить через Фриду, было бы чуточку полегче, но что есть, то есть - может, кто-то захочет решить по-своему =] Надеюсь, этот немаленький райтап помог вам в нашей нелёгкой стезе. Удачного ревёрса! made 4@rev_with_da_boys |
| Время: 12:35 |