Reverse engineering. Урок 2. Разбор приложения

Reverse engineering. Урок 2. Разбор приложения

Jolly Joy

Дисклеймер

Я негативно отношусь к взломам различных приложений и предпочитаю поощрять разработчиков, т.к считаю их работу действительно тяжелой. Так же я не призываю Вас к взлому приложений, я лишь показываю, как с помощью определенных знаний можно изменить ту или иную вещь в приложении, а так же делюсь опытом по какому-либо вопросу
Помимо этого данный урок представляет собой не курс по Java, Kotlin, Scala и прочему, а показывает лишь возможности и особенности реверс-инжиниринга

Вступление

На прошло и года, как вышла вторая часть моего урока по реверс-инжинирингу. Так как разбирать особо нечего - сразу покажу небольшой взлом одной программы из Play Market и объясню что к чему.

В 1 уроке мы разобрали приложение примерно до такого состояния:

Здесь будем работать с папкой smali (основной код приложения (байт-код) (пойдем от более сложного к более простому)) и res (ресурсы).

Немного теории

Для начала надо найти место, в котором у нас просят денег. Находим место примерно по следующей схеме:
Пишем на русском или английском - название пункта -> находим его в папке res -> values (либо ищем по всему проекту). Зачастую это будет файл string.xml. Далее ищем это в самих ресурсах, то есть разметке: так же проходимся поиском по всем папкам проекта и находим что-то на подобие такого:

Используется редактор Sublime Text 3

Что это такое?

Preference - тип пункта в настройках, в данном случае это простой пункт по нажатию на который происходит какое-либо действие. Так же это может быть SwitchPreference, PreferenceCategory и т.д

title - заголовок пункта. Здесь может стоять либо само значение (то есть сразу готовый текст), а может быть ссылка на ресурсы (например, @string/name), то есть эту строку в дальнейшем можно будет перевести на другие языки

summary - описание пункта. Тоже самое, что и title

key - как можно было понять из названия - ключ. В переводе на более человеческий - идентификатор. Вы же не можете работать в коде с тем, чего нет, правильно? Для этого есть идентификаторы key/id (key - в основном, настройки, id - основная разметка (layout)). Ключ как бы связывает пункт в разметке с кодом

P.S. Summary и Title можно задать программно, то есть можно подставить какое либо вычисление, значение метода и прочего, поэтому этих атрибутов может и не быть, т.к иногда требуется нечто большее, чем статичный текст

Переходим к практике

Будем искать по ключу - в данном случае это "keyBackup". Из прошлого урока мы уже узнали, что весь основной код находится в папках smali, следовательно, там и будем искать это значение. Снова проходимся поиском и находим наше место:

Почему тут 2 одинаковых файла?

Это связано с особенностями компилятора и виртуальной машины Dalvik. Не будем сильно вдаваться в подробности. Достаточно запомнить, что простой файл Setting.smali - основной код, а файл Setting$2.smali - как бы дополнительный, но все же обязательный, в нем находятся обработчики событий (кнопок и прочего), вложенные классы и т.д (при реальном написании кода все это будет в одном файле). В данном случае нам понадобится всего лишь 1 файл (Setting$2.smali). Открываем его и видим следующую картину:

Чтобы полностью понять то, что тут написано, необходимо хотя бы примерно знать и понимать Java. Вкратце: метод/функция находит ключи (идентификаторы) и по нажатию на один из них выполняет заданное действие (switch/case в Java).

Листаем чуть ниже и находим похожие места

Что же тут такое?

Постараюсь объяснить максимально подробно и ясно. Начнем:

Первым делом мы должны как-то проверить, что у вас есть премиум доступ - делаем это так - ЕСЛИ premium равен true (на true в данном случае указывает eqz, для false будет nez), то запускаем действие, в нашем случае это активность (вообще тут класс, но мне понятнее так), на что указывает строка:

const-class v3, Lapp/Xeasec/writer/Modules/Backup;

Полное действие (выделено на скриншоте снизу):

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

Строка

goto :goto_2

означает ИНАЧЕ, то есть если наше условие не прошло проверку (и премиума у Вас нет), то выполняем другое действие, в нашем случае это запуск класса Premiuim - строка:

const-class v3, Lapp/Xeasec/writer/Premium/Premium;

Полный код следующий:

Мысленно можете разделить данный код на блоки


Тут главное понять саму логику "покупки" платной версии. Взломать на про (зачастую) - значит изменить логику программы таким образом, чтобы она думала, что платная версия активна.

На русском языке это выглядит примерно так: ЕСЛИ что то там true (то есть истина), то позволяем пользователю переключить эту настройку, ИНАЧЕ, выводим предложение купить подписку или что-то в этом роде. Реализация может быть разной, но логика всегда примерно одна и та же. В коде (в частности в Java) это выглядит следующим образом:

Запись if (premium == true) эквивалентна записи if (premiuim).
Запись if (premium == false) эквивалентна записи if (!premiuim).

Не обязательно писать == true или else, можно вполне обойтись без них, но это уже немного другая тема.

После того, как мы поняли, с чем имеем дело, приступим к открытию нашей настройки, то есть изменим немного логику нашей программы таким образом, чтобы заветная настройка стала доступна нам без вложения материальных средств
Ранее я говорил, что eqz = true, а nez = false. Поставив nez вместо eqz мы сказали программе:"Если у нас НЕТ премиума, то открой мне этот пункт". Это лишь один из способов. На деле же их гораздо больше - создать отдельный метод, который бы возвращал нам true, поменять местами вызовы премиума и настройки, удалить проверку и т.д и т.п. Тут уже зависит от воображения и способностей.

Собственно, результат:

В данной программе автор действовал немного "извращенским" путем и проверял наш премиум "отдельно" в каждом классе, из-за чего менять eqz на nez придется так же в других местах, но мне было лень, да и саму логику я объяснил, осталось лишь сделать тоже самое в других местах.

Пример посложнее

Рассмотрим еще одну программу - VK Customize. У этой программы будем "ломать" не на premium, а на работоспособность - убирать блокировку на iMod.
Проделываем рутинные действия - разбираем приложение. Данная программа устроена немного хитро и так просто по ключевым словам найти не получится, ибо она обфуцирована, то есть код ее изменен таким образом, чтобы он был не читаем для программиста, но сам код работал. Более простыми словами это называется "запутывание кода".

Разбираем и идем по пути

smali/ua/itaysonlab/vkcustomize3/SubstratumLauncher

Т.к проверка находится именно там, то и убирать будем ее там (что логично). рассмотрим логику проверки:

По аналогии с прошлым примером - удаляем проверку или меняем ее логику. Т.к пример с логикой мы уже рассмотрели, рассмотрим пример удаления проверки:

Либо, если действовать методом изменения логики, то можно поступить так:

Результат:

Т.к имя приложения у iMod такое же, то и название тут соответствующее

Выводы

Сегодня мы немного разобрались в логике работы различных проверок в приложениях и программах. Я специально не стал подробно объяснять про регистры, константы и прочее, т.к урок затянулся бы на несколько часов, а место, как и время, к сожалению, ограничено :).
В будущих уроках (если они будут), разберем разметку приложений и экранов, попробуем самостоятельно изменить в приложении что либо.

Ссылки

• Подробнее про регистры, константы и т.д - https://4pda.ru/forum/index.php?showtopic=540887&view=findpost&p=49712775

• Профильная тема по модификации приложений на форуме 4PDA - https://4pda.ru/forum/index.php?showtopic=461675

• VK Customize без проверки - https://drive.google.com/open?id=183z06LGAy0mYelPHFKEQn8f1m5gd25RY

• Приложение, которое разбирали - https://play.google.com/store/apps/details?id=app.Xeasec.writer

Report Page