Всем привет!
Сегодня мы научимя реверсить приложения с Paddle, разберемся в чем разница arm/x86 для нас, а также углубимся в реверс
- Разница x86/arm
- Ассемблер и функции, которые нужно знать
- Реверсим прилку с Paddle
Как говориться и года не прошло, а я уже пилю вам статью, где мы влетим с двух ног к солидным реверсерам. Как вы знаете (или нет), то сейчас самой главной архитектурой процессоров в компах является x86, а самой модной - ARM. X86 работает как слон, он большой, там много инструкций и он умеет складывать числа, а еще у него есть l1,l2,l3 кэш, который быстрее оперативки. X86 процы стучат в оперативку, считают и лишний раз ее не дергают, а ARM это как сын маминой подруги, умеет мало, кормят его с ложки, но все его боготворят. В ARM инструкций меньше, да и считать он не умеет, ему нужно сначала выгрузить, прибавить, вернуть в память. Зато процессоры на ARM меньше греются, мало потребляют, но код для них немного больше. Какая разница для нас? На как минимум x86 код может в одной строке, как наполеон, делать несколько дел одновременно, а ARM имеет фикс длину в 4 байта и у него 1 строка = 1 действие, да и ARM все делает внутри себя, а не бегает в оперативку что упрощается нам жизнь.
Ассемблер? Можно, а зачем?
Ассемблер это как последняя инстанция перед самой жутью - нулями и единицами. Ассемблер помогает нам перевести нули и единицы в читаемый код, пусть даже не очень понятный для вайб кодеров. Давайте посмотрим на самые основные функции, который 100 процентов вам пригодятся:
MOV - перемещает данные из точки А в точку Б
ADD/SUB - добавить/отнять, меняет флажки
XOR - исключающее ИЛИ
AND/OR - И/ИЛИ, тут нету смысла распинаться.
JMP - прыжок, переходит на указанный адрес
JZ - прыжок, если условие верно, т.е 0
JNZ - прыжок, если условие неверно, т.е не 0.
Это самые основные функции которые проходят в 7-8 классе на уроках информатики (прыжки может и не проходят, но XOR и AND/OR проходят точно :))
Сегодня мы как раз попрактикуемся в использовании функций ассемблера для убийства проверки лицензии.
Paddle? Мы тебя сломаем! Кто это и зачем он нужен?
Разработчики очень хитрые ребята. Кто-то продает свою приложуху через AppStore/Любой другой магазин приложений, а кто-то дает тебе скачать полную версию с триалом, которая потребует ключ. Сегодня мы разберем и реверсним прилку под названием "Clipsy", она как раз использует Paddle. Если коротко - Paddle система монетизации приложений, это готовый framework, который освобождает кодера от мук с лицензиями и дает готовое решение. Кодер может настроить какие ключи давать, насколько устройств, деактивировать их и тд и тп. Конечно существует несколько видов активации - оффлайн (проверка через математический алгоритм), послать ключ с HWID на сервер разраба, послать ключ с HWID на сервер разраба и проверить его легитимность, но это уже мелочь. Сегодня мы сломаем эту шайтан машину злых капиталистов. Начнем!
Открываем уже знакомый нам Binary Ninja и закидываем туда сам бинарь не приложения, а самого фреймворка. Почему? Потому что это отдельное приложение, которое и позволяет не мучаться с активацией кодеру. Нам это на руку, потому что там и лежит основная логика активации. На MacOS проваливаемся по пути /Applications/Clipsy.app/Contents/Frameworks/Paddle.framework/Versions/A
Берем сам бинарь Paddle и тянем его в Binary Ninja и ждем пока он все прочитает. Получаем такую картину:
Paddle прекрасен тем, что он не только облегчает разработку, но и светит своими классами в открытую, что нам в разы упрощает работу. Переходим в вкладку Symbols (вы же читали мою прошлую статью?) и вбиваем туда PADProduct activated:
Увидели такое? Вы на верном пути! Кликаем по строке и попадаем прямиком в функцию.
Выше мы можем наблюдать функции ExpirityDay, LicenseCode, но они нам не важны. Мы сделаем так, что любой, кто спросит Paddle об активации, будет получать всегда единицу (True). Жмем ПКМ по функции, Patch -> Assemble и прописывает заветный код:
mov al, 1
ret
MOV - перемещение значения
al - младший регистр основного, он имеет размер всего в 1 байт и является bool значением. В нем 1 - это TRUE, а 0 - FALSE
ret - return, вернуть значение. Говорит процу выйти из функции и вернуться к той, что вызвала нашу.
Жмем apply, Ctrl + S и переподписываем бинарник, без него ничего не пойдет:
sudo codesign -s - --entitlements debug.entitlements -f /Applications/Clipsy.app/Contents/Frameworks/Paddle.framework/Versions/A/Paddle
sudo xattr -r -c /Applications/Clipsy.app
sudo codesign --force --deep --sign - /Applications/Clipsy.app
Все работает! Теперь вы стали еще чуточку лучше и умнее в реверсе!
------ By adrenaline, special for LIMB.cc ------
------ By adrenaline, special for LIMB.cc ------
------ By adrenaline, special for LIMB.cc ------
LIMB