- PVSM.RU - https://www.pvsm.ru -

Для начала краткий ликбез:
Last.fm — интернет-проект музыкальной тематики, основным сервисом которого является сбор информации о музыке, которую слушает пользователь, и её каталогизация в индивидуальных и общих чартах. (с) Wikipedia
Давным-давно, когда трава была зеленее, а заинтересованные индивиды IT-сообщества ещё не знали, что такое Instagram — проект Last.FM [1] был в целом бесплатным и давал возможность слушать «радио», составленное из композиций любимых и похожих на них исполнителей без каких-либо ограничений. Затем коммерческая составляющая начала брать свое, бесплатное радио оставили только для некоторых стран, что заставило жителей стран СНГ заниматься поиском прокси либо платить 3$ в месяц за возможность использования сервиса.
Заморачиваться с прокси, понятное дело, никому не хотелось, и пользователи начали искать способы слушать радио бесплатно. Как оказалось, Last.FM фактически не закрыл доступ к возможности бесплатного прослушивания, однако официальным клиентом последней версии это было невыполнимо. Итог: часть аудитории перешла на альтернативные клиенты, часть прекратила обновлять свой старый клиент, а прочие либо заплатили, либо ушли на другие сервисы.
Так в чем же состояло изменение, которое привело к невозможности бесплатного прослушивания радио в новых версиях клиента? Попробуем в этом разобраться.
Для начала нам понадобится новый и старый клиенты. Новый можно скачать с официального сайта [2], а старый взять, например, с рутрекера [3]. Поставим новый и старый клиент на разные виртуальные машины и пойдем в лоб: посмотрим, что показывает снифер при попытке запуска проигрывания радиостанции.
Как мы видим, используется HTTP-протокол [5], что существенно облегчит нам дальнейший разбор (бинарные недокументированные протоколы разбирать, естественно, сложнее).
Теперь сравним запросы из старого и нового клиентов:
Единственное отличие, которое бросается в глаза — это дополнительный параметр api_key в GET-запросе [7]. Попробуем понять, влияет ли он на поведение клиента. Запустим клиент под каким-нибудь отладчиком (я буду использовать OllyDbg [8]), дадим ему загрузиться (F9), откроем память процесса (Alt+M) и поищем в ней интересующий нас параметр (Ctrl+B).
В памяти нашлось 4 места, которые содержали искомый параметр, причем все они расположены в библиотеке LastFmTools1. Посмотрим, как этот параметр используется в коде. Для этого выделим байт, содержащий символ &, который находится непосредственно перед текстом api_key.
Почему его? GET-запрос строится из фрагментов вида key=value, которые разделены амперсандом. В данном случае разработчики не стали формировать ассоциативный массив с параметрами запроса, а затем объединять пары из него чем-нибудь вроде функции implode [11] из PHP, а просто захардкодили запрос в виде готовых кусков.
Мы видим, что перед нами, по сути, классическая C-строка [13], которая состоит из ASCII [14] символов и завершается нулл-байтом. Таким образом, мы можем провести манипуляции с данными в памяти и урезать строку до безобидного амперсанда, который не испортит запрос и позволит нам посмотреть как будет вести себя последний клиент в этом случае. Заменяем символ, идущий после &, нулл-байтом везде, где встречается строка api_key, и снова пытаемся запустить проигрывание радио.
О чудо! Радио проигрывается как ни в чем не бывало! Но ведь нам не хочется каждый раз запускать программу под отладчиком, чтобы послушать бесплатное радио. Тогда возьмем любой hex-редактор [16], откроем в нем файл LastFmTools1.dll (он находится в директории Last.FM), найдем места, где встречается строка &api_key, и, как я описывал выше, заменим байт после амперсанда на нулл-байт.
Вуаля, мы получили готовый к употреблению клиент последней версии с бесплатным радио.
Интересующиеся также могут почитать про то, как создать add-on для Last.FM, позволяющий стримить радио по сети [17] и способ добавления управления клиентом Last.FM через панель задач [18].
Автор: kaimi_ru
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/informatsionnaya-bezopasnost/9037
Ссылки в тексте:
[1] Last.FM: http://www.last.fm
[2] официального сайта: http://http://last.fm/
[3] рутрекера: http://rutracker.org/forum/viewtopic.php?t=3737124
[4] Image: http://kaimi.ru/wp-content/uploads/2012/06/wireshark1.jpg
[5] HTTP-протокол: http://ru.wikipedia.org/wiki/Http
[6] Image: http://kaimi.ru/wp-content/uploads/2012/06/wireshark2.jpg
[7] GET-запросе: http://ru.wikipedia.org/wiki/Http#GET
[8] OllyDbg: http://www.ollydbg.de/
[9] Image: http://kaimi.ru/wp-content/uploads/2012/06/olly_dbg1.jpg
[10] Image: http://kaimi.ru/wp-content/uploads/2012/06/olly_dbg2.jpg
[11] implode: http://php.net/manual/en/function.implode.php
[12] Image: http://kaimi.ru/wp-content/uploads/2012/06/olly_dbg_2.1.jpg
[13] C-строка: http://ru.wikipedia.org/wiki/C-строка
[14] ASCII: http://ru.wikipedia.org/wiki/ASCII
[15] Image: http://kaimi.ru/wp-content/uploads/2012/06/olly_dbg3.jpg
[16] hex-редактор: http://ru.wikipedia.org/wiki/Hex-редактор
[17] add-on для Last.FM, позволяющий стримить радио по сети: http://kaimi.ru/2010/09/lastfm-broadcast-addon/
[18] добавления управления клиентом Last.FM через панель задач: http://kaimi.ru/2011/08/lastfm-taskbar-controls/
Нажмите здесь для печати.