Фиксим клиент Last.FM или как получить бесплатное радио

в 8:16, , рубрики: last.fm, ollydbg, информационная безопасность, онлайн радио, реверс-инжиниринг, метки: , , ,

image
Для начала краткий ликбез:

Last.fm — интернет-проект музыкальной тематики, основным сервисом которого является сбор информации о музыке, которую слушает пользователь, и её каталогизация в индивидуальных и общих чартах. (с) Wikipedia

Давным-давно, когда трава была зеленее, а заинтересованные индивиды IT-сообщества ещё не знали, что такое Instagram — проект Last.FM был в целом бесплатным и давал возможность слушать «радио», составленное из композиций любимых и похожих на них исполнителей без каких-либо ограничений. Затем коммерческая составляющая начала брать свое, бесплатное радио оставили только для некоторых стран, что заставило жителей стран СНГ заниматься поиском прокси либо платить 3$ в месяц за возможность использования сервиса.

Заморачиваться с прокси, понятное дело, никому не хотелось, и пользователи начали искать способы слушать радио бесплатно. Как оказалось, Last.FM фактически не закрыл доступ к возможности бесплатного прослушивания, однако официальным клиентом последней версии это было невыполнимо. Итог: часть аудитории перешла на альтернативные клиенты, часть прекратила обновлять свой старый клиент, а прочие либо заплатили, либо ушли на другие сервисы.

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

Для начала нам понадобится новый и старый клиенты. Новый можно скачать с официального сайта, а старый взять, например, с рутрекера. Поставим новый и старый клиент на разные виртуальные машины и пойдем в лоб: посмотрим, что показывает снифер при попытке запуска проигрывания радиостанции.

image

Как мы видим, используется HTTP-протокол, что существенно облегчит нам дальнейший разбор (бинарные недокументированные протоколы разбирать, естественно, сложнее).
Теперь сравним запросы из старого и нового клиентов:

image image

Единственное отличие, которое бросается в глаза — это дополнительный параметр api_key в GET-запросе. Попробуем понять, влияет ли он на поведение клиента. Запустим клиент под каким-нибудь отладчиком (я буду использовать OllyDbg), дадим ему загрузиться (F9), откроем память процесса (Alt+M) и поищем в ней интересующий нас параметр (Ctrl+B).

image

В памяти нашлось 4 места, которые содержали искомый параметр, причем все они расположены в библиотеке LastFmTools1. Посмотрим, как этот параметр используется в коде. Для этого выделим байт, содержащий символ &, который находится непосредственно перед текстом api_key.

image

Почему его? GET-запрос строится из фрагментов вида key=value, которые разделены амперсандом. В данном случае разработчики не стали формировать ассоциативный массив с параметрами запроса, а затем объединять пары из него чем-нибудь вроде функции implode из PHP, а просто захардкодили запрос в виде готовых кусков.

image

Мы видим, что перед нами, по сути, классическая C-строка, которая состоит из ASCII символов и завершается нулл-байтом. Таким образом, мы можем провести манипуляции с данными в памяти и урезать строку до безобидного амперсанда, который не испортит запрос и позволит нам посмотреть как будет вести себя последний клиент в этом случае. Заменяем символ, идущий после &, нулл-байтом везде, где встречается строка api_key, и снова пытаемся запустить проигрывание радио.

image

О чудо! Радио проигрывается как ни в чем не бывало! Но ведь нам не хочется каждый раз запускать программу под отладчиком, чтобы послушать бесплатное радио. Тогда возьмем любой hex-редактор, откроем в нем файл LastFmTools1.dll (он находится в директории Last.FM), найдем места, где встречается строка &api_key, и, как я описывал выше, заменим байт после амперсанда на нулл-байт.

Вуаля, мы получили готовый к употреблению клиент последней версии с бесплатным радио.

Интересующиеся также могут почитать про то, как создать add-on для Last.FM, позволяющий стримить радио по сети и способ добавления управления клиентом Last.FM через панель задач.

Автор: kaimi_ru

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js