6 июня 2012 в 12:16

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

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
карма
40,0
рейтинг 0,0
Пользователь
Похожие публикации
Самое читаемое Разработка

Комментарии (78)

  • +5
  • 0
    Поправьте ссылку в предлежении «Новый можно скачать с официального сайта» пары точек после http не хватает.
    • +2
      Спасибо, поправил
  • +6
    Хм, а зачем нужно было дебажить клиент, он же Open Source?
    • +8
      Это быстрее и забавнее. Вряд ли в коде есть комментарии, что благодаря указанной строчке не удастся слушать радио бесплатно.
      Плюс с точки зрения распространения солюшена, вышеуказанный способ вызывает больше доверия, чем установка собранных непойми кем решений.
      • +2
        А собрать самому?
  • –6
    Имейте совесть!1 Заплатите артистам!
    • +20
      Никита Сергеевич, перелогиньтесь!

      А вообще, мож быть жадным, а можно честным. Можно заплатить три бакса и успокоить совесть, а можно не плать и оставить в покое кошелек.
      • +4
        Ирония же, не?
        • 0
          Не надо, не перебивайте их )
  • +6
    Модифицированный файл для ленивых не расшарите?
  • –1
    а нет ли подобного решения для Mac-клиента? Спасибо!
    • +6
      есть, схема таже. HEX-редактор: www.suavetech.com/0xed/0xed.html

      Если хотите могу выложить libLastFmTools.1.dylib но там и правда делов на минуту.
      • 0
        Хотим, конечно. ;)
  • 0
    А любимых исполнителей в клиенте нельзя прослушать, как я понял?
    • 0
      Ну ето ж радио, во всех смыслах
      • 0
        А как его включить? Вижу только 10 последних понравившихся.
        • 0
          «Мои любимые композиции» ето на самом деле «радио моих любимых композиций». Т.е там самих етих треков не будет, а будут похожие на них.
          • 0
            Это понятно, просто в Q&A недавно спрашивали, как вытащить с ластфм всех своих любимых исполнителей. Плагин для хрома умеет это делать, но радио не воспроизводит, firefm же — наоборот, только любимых не может воспроизводить.
  • +13
    В некоторых альтернативных проигрывателях ласт.фм всегда пела бесплатно искаропки, только тссс ;) А вообще, $3 в месяц за пользование отличным сервисом — не такая уж неподъёмная цена, имхо.
    • +3
      Да корявый он, то подбирает всякую чушь, то просто не работает. Имхо 3х баксов не стоит.

      PS пользуюсь ластой с 2006года, на подписке почти два года просидел.
      • 0
        Да какая разница, что там на радио, зато рамка черная вокруг юзерпика. :)
  • +2
    Мне для Ubuntu надо.
    • +1
      Хекс редактор же есть вроде в Ubuntu?
    • +1
      ставите bless и патчите /usr/lib/lastfm/libLastFmTools.so.1.0.0
    • –2
      За что интересно минусуют?
  • –6
    Благодарю за статью — это отличный и интересный реверс инжиниринг!

    p.s: а для андройда приложение не изучали случаем?
    p.p.s: знаю, что лентяйничаю и наглею ^_^''
    • +6
      андроИда.
      • +3
        да.
      • –1
        Андроид — человекоподобный робод.
        Вы уж если поправляете, то поправляйте на Android.
        • +12
          робод, ага.
          • –12
            *Робот. Граммар нацизм — это всё на что ты способен?
        • +1
          Вы удивитесь, но android — это тоже человекоподобный робот. Не стоит слепо поклоняться англицизмам.
  • 0
    Почти год ходил со старым клиентом на iPhone, не обновляя, а потом все пофиксили
  • 0
    Такое отрубается элементарно. Достаточно лишь запретить запросы без api_key.
  • 0
    Вроде прикрыли малину.
    • 0
      пардон, вру-наверное это был хабраэффект)
  • +4
    Модифицированный файл для Mac OS X:
    dl.dropbox.com/u/286758/libLastFmTools.1.dylib
  • 0
    А я на habrahabr.ru/post/134807/ подсел, к тому же скробблинг LastFM был изначально.
  • +9
    > платить 3$ в месяц за возможность использования сервиса.

    Непосильная сумма.
    • –1
      некоторым странам то бесплатно предоставляется.
      • +2
        И мы тоже сделаем себя такой страной! 8)
        • 0
          Никита Сергеевич сделает ласту бесплатной!
          • 0
            С ним ластфм ещё и доплачивать будет!
            • 0
              Ему?
              • 0
                И всему РАО в придачу!
  • –2
    А автор-то именитый.
  • 0
    К несчастью в новом клиенте (бете) нет этой библиотеки.
    • +1
      скачайте старый с рутрекера и не обновляйте.
  • +1
    LastFM — один из моих любимых и уважаемых сервисов. Никаких глупых пиаров, свое дело исполняет, улучшается, прелесть.
  • +2
    В openSUSE Linux (и, возможно, других линуксах) искомый файл находится по адресу /usr/lib64/Last.fm/libLastFmTools.so.1.0.0
  • +7
    Вообще-то есть вполне законный способ пользоваться услугами LastFM бесплатно: достаточно принять участие в бета-тестировании нового клиента. Линк
    • +1
      Принять или принимать? В какой момент бета-тестирования пользователь будет награжден возможностью бесплатно пользоваться услугами Last.fm?
      • 0
        Пока версия нового клиента находится в стадии бета-тестирования — использование LastFM посредством него является бесплатным. Т.е. скачали и пользуетесь.
    • 0
      Самое верное решение.
  • 0
    Хм… Получается, что и самописанные клиенты могут также бесплатно качать? А то я писал в своё время прогу, которая их музыку не играет. а качает и делает плейлист, чтобы потом это псевдорадио на MP3 плеере слушать. И мне приходится платить по $3, чтобы ей пользоваться.
    • 0
      Не получилось… Ну и ладно, три бакса в месяц не жалко.
    • 0
      Проверял этот давнишний скрипт, вроде все качается без наличия активной подписки
  • 0
    А у меня почему-то трэки проигрываются не полностью. Обрываются в разное время и следующий начинает играть. Что это может быть? Версия 1.5.4.27091.
  • 0
    Даешь хак на pandora.com? :)
  • 0
    Хорошая статья. Те кто хотели бесплатно слушать радио, давно это уже делают вконтакте на Freelast Radio, а тут можно и няшный клиент почикать. Прекрасно же. Но в клиенте (хакнутом или нет) нету такой штуки, как «слушать радио всех друзей». А ведь фишка ластика не только в тэгах, а ещё и в социальных рекомендациях!

    Поэтому лично я плачу за подписку. И ничего, не обеднел :) И могу через веб слушать радио всех друзей. И многие другие прикольные выборки. Например делать суммарную выборку по двум тэгам.

    (сейчас минусов отхвачу) Давайте платить хорошим людям за хорошие штуки и делать мир лучше :)
  • +1
    Для Debian\Ubuntu:
    http://dl.dropbox.com/u/7728874/libLastFmTools.so.1.0.0

    Ложить в /usr/lib/lastfm
  • +1
    эм… разве $3 в месяц такая сумма, что нужно задумываться как бы и её не платить?
    • 0
      Где находится грань, которая определяет «значимость» суммы для любого индивида?
      Например, лицензионную игру Counter-Strike можно купить за ~8-10$ (причем это разовый платеж, а не ежемесячный), однако люди продолжают создавать и искать бесплатные non-steam сервера, скачивать пиратские копии. В сфере мобильных приложений та же ситуация.
      • +1
        эм… если хочется слушать радио по сети — интернет анлим. стоит явно дороже $3, а значит и эта сумма должна быть подъёмной. не можешь платить — ступай во вконтакт :)
        в любом случае речь о культуре потребления. если мне нравится сервис и меня устраивает цена — я плачу. это мой способ сказать «спасибо» разработчикам. а если мне нравится, но я пойду на любые ухищрения лишь бы получить это халявно — что-то не так пошло в моём воспитании.
        • 0
          Интернет анлим за 5$ купить можно. Никто не спорит, что если нравится, то можно и заплатить. А у кого-то нет средств, желания, возможности…
          Вконтакт — это плохой пример, учитывая то, что авторское право в области контента там представлено достаточно слабо. Тогда уж на youtube или яндекс.музыку.
          • +1
            очень это на воровство похоже. без возможности оплатить искать пути халявного пользования. но тут уж каждый сам для себя лимиты устанавливает — что воровство, а что нет
            • 0
              В самом начале Вы сделали акцент на стоимости услуги. Отсюда первый вопрос: если бы стоимость была выше, то это изменило бы Ваше отношение?
              Второй вопрос: у Вас весь цифровой контент лицензионный?
              И третий вопрос: Вы не употребляете пиратский цифровой контент через интернет? ВКонтакте, онлайн библиотеки с «бесплатными» книгами, игры и т.п. естественно считаются.
              • +1
                на счёт отношения — да, поменяло бы. есть сервис за который я готов платить $3, $5, $10. а вот $20 уже нет. потому что не пользуюсь им достаточно часто. мог бы слушать lastfm на работе — да, может и $20 платил бы.
                цифровой контент понятие растяжимое.
                софт — нет, не весь. если win7 я готов купить и покупаю, то нужный мне раз в месяц фотошоп пока нет. $700 лично для меня — дорого. но есть же и gimp и онлайн версия фш. в любом случае — $700 != $3.
                сервисы — оплачиваю. если есть возможность пользоваться софтом за абонплату — оплачиваю нужный мне период и всё.
                • 0
                  Я вот могу позволить себе заплатить за last.fm, но у меня нет возможности заплатить через paypal. Заюзать крякнутый клиент проще и менее трудозатратно, чем искать способ заплатить через неудобную и недоступную для меня систему оплаты. Сделают прием платежей напрямую с кредитки — заплачу. Палка — в лес. Суровые реалии.
  • 0
    Сейчас, спустя столько времени мне пришло письмо от Last.fm:
    Тема: Changes to Last.fm Radio

    Hello, %username%.

    We're writing you to let you know that there will soon be a change to Last.fm radio that may affect you. Our stats show that you've listened to radio through an application that uses our old streaming protocol. On 1 December we will deprecate this old protocol, so in some applications radio will no longer work.

    If you would like to continue enjoying Last.fm Radio, consider upgrading to a new application or using www.last.fm/listen

    Thanks,
    The Last.fm Team
    • 0
      Да, сегодня перестало работать
      • 0
        R.I.P., бесплатный ластэфэм! Огромное спасибо тебе, автор, за прекрасные пол года бесплатного удовольствия!… Ну и, конечно, пиши исчо, если будет новое решение! ;)

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