Получаем бесплатные купоны к разным иностранным магазинам Среда, 26. Июнь 2013 автор: dx http://kaimi.ru/2013/06/получаем-бесплатные-купоны-к-разным-и/ http://kaimi.ru/ Пожалуй, пришло время разбавить хардкорные статьи более веселыми Давным-давно я рылся в AppStore со своего iPod'а, и попалась мне на глаза забавная на первый взгляд игра Stop Those Fish, смысл которой сводился к тому, что вы, играя компанией медведей-рыбаков, должны глушить рыбу, которая атакует ваши лодки. Был и второй режим игры, доступный после окончания первого, но это уже неважно. Самым интересным оказалось то, что после прохождения каждого уровня на мой личный счет на неизвестном мне на тот момент сайте p4rc.com начислялись очки, если на iPod был включен Wi-Fi, разумеется. Я зарегистрировался на этом сайте и понял, что на эти самые очки можно покупать купоны по 25$ для самых разных американских интернет-магазинов, в том числе Amazon и Ebay (позже стали добавляться и купоны для британских магазинов, затем - билеты на премьеры в кинотеатрах США и т.д.). Один такой купон стоил 1500 очков (причем эти 1500 должны быть набраны в день, когда купон появился), и их набор честным игровым путем занимал больше часа. Новые акции на сайте появляются 1-2 раза в сутки, и во время каждой акции, как правило, доступно три двадцатипятидолларовых купона. Кто успел, тот и съел. Кроме того, за 500 очков можно было купить небольшие скидки и бонусы, доступные всегда. Сейчас на сайте доступно гораздо большее количество разнообразных наград меньших номиналов, но и стоят они дороже, например, карта iTunes на 10$ стоит аж 10000 очков, емана. Итак, смысл сайта в том, что он предоставляет разработчикам игр некий интерфейс, который они могут встроить в свою игру для того, чтобы она научилась начислять пользователю p4rc-очки. Разработчики платят создателям сайта деньги, популярность игры растет, юзеры получают свои купоны, соревнуясь друг с другом, много играют, и все довольны. Кроме меня. У меня отсутствовало желание по несколько часов просиживать за уже надоевшей игрой (на тот момент в сервисе была зарегистрирована всего одна, да и сейчас выбор не особо велик), но купоны для некоторых магазинов иногда получать хотелось. Я решил понять, каким образом организовано общение игры и сайта p4rc. Для начала я посмотрел, что находится в папке с игрой, почитал конфиги (джейлбрейк - наше все), но ничего интересного найдено не было. Признаться, я не особо и старался разобраться в куче файлов, так как меня в этот момент посетила другая идея - просто поснифать запросы, отсылаемые игрушкой. Я не имел понятия, какой протокол используется сервисом, поэтому решил установить на iPod какой-нибудь сниффер пакетов, чтобы перехватить всё. В этом мне помог консольный сниффер Pirni (GUI-вариант, Pirni Pro, увы, не работал, выключаясь при сворачивании, да и консольный так просто не запустился, требуя при установке еще гору deb-пакетов, которые пришлось искать на просторах интернета), и через десять минут я уже рассматривал в WireShark'е содержимое полученного pcap-файла. Однако, с тех пор прошло много времени, поэтому я напишу подробнее, как устанавливать debian-пакеты на iOS, на тот случай, если вы сами пожелаете посмотреть на эти запросы. Разумеется, можете пропустить этот абзац, если у вас нет джейлбрейкнутого iOS-девайса. Для начала качаем пакет Pirni_1.1.1.deb (это бесплатная версия, которую я смог найти на просторах интернета; возможно, есть уже более поздние релизы, но эта версия работает на старых и новых iOS-девайсах и iOS от 4.3 до 6.2 точно). Я ставил deb-пакеты методом их помещения в папку /var/root/Media/Cydia/AutoInstall и последующей перезагрузки устройства. В этом случае после ребута всплывет окно Cydia, где вы увидите лог установки. Копировать файлы на i-девайсы (в любой каталог) можно, например, с помощью программы iPhone Browser. Для ее корректной работы потребуется iTunes и QuickTime. Есть еще программы DiskAid и iTools с аналогичным функционалом, но их я не использовал. Однако, вернемся к deb-пакетам. Есть более годный метод их установки, не требующий многочисленных перезагрузок. Для начала устанавливаем программу MobileTerminal через Cydia (не забудьте выставить настройку Manage -> Settings -> Developer). Далее так же через Cydia устанавливаем пакет adv-cmds (содержащий потребующуюся позднее утилиту ps). Запускаем MobileTerminal, переходим в директорию с deb-пакетом. Я, например, закинул Pirni_1.1.1.deb в /tmp: img http://kaimi.ru/wp-content/uploads/2013/06/1.png Я последовательно ввел команды: Code: cd /tmp su #после этого введя root-пароль, по умолчанию он alpine ls #чтобы вывести листинг директории /tmp Далее я ввел команду Code: dpkg -i pirni_1.1.1.deb и увидел, что она не сработала: img http://kaimi.ru/wp-content/uploads/2013/06/2.png Стало понятно, что этот пакет требует еще двух: libnet и libpcap. Что ж, найти их было непросто, но эту работу я уже сделал для вас. Скачаем и их, а затем установим аналогичным образом с помощью команды dpkg. После этого можно еще раз выполнить команду установки Pirni и запустить его: img http://kaimi.ru/wp-content/uploads/2013/06/3.png Сниффер выведет небольшой хелп, после чего мы сможем его запустить следующей командой и заставить работать: Code: pirni -s [ip-адрес вашего роутера или gateway'а] -o log.pcap Pirni начнет прослушивание и логирование пакетов: img http://kaimi.ru/wp-content/uploads/2013/06/4.png Далее, запускаем игру, которая использует сервисы p4rc (список игр можно найти на сайте сервиса, кстати). Терминал при этом закроется, но это неважно, потому что сниффер останется в рабочем состоянии. Логинимся в p4rc (предварительно создав аккаунт), игра сама запросит это, далее начинаем играть. Я прошел простенький уровень в игре и заработал аж 3 очка (хех, представьте себе, сколько нужно играть, чтобы заработать 10000). Опять открываем терминал, заходим под root (команда su), выполняем ps -ax, в выводе находим процесс pirni, смотрим его PID, после чего выполняем команду kill -9 [PID], чтобы убить сниффер. Можно еще выполнить следующие команды для удаления ненужных нам теперь пакетов: Code: dpkg -r com.axeldoesstockholm.pirni dpkg -r libpcap dpkg -r libnet Теперь мы имеем pcap-лог, который копируем на компьютер и открываем в WireShark'е. Возможно, Wireshark пожалуется на то, что лог оканчивается непредсказуемо или поврежден, но это ничего, так как наши запросы где-то в середине лога и целы. Каково же было мое удивление, когда я увидел, что игра общается с сайтом посредством обычного HTTP без всякого шифрования или ЭЦП, данные передает в формате JSON! Найти нужные запросы можно с помощью такого фильтра: http.request and http contains "p4rc" img http://kaimi.ru/wp-content/uploads/2013/06/5.png Пакет от игры с информацией о пройденном уровне выглядел примерно так: Code: PUT /services/v1/gamepoints/convertPoints HTTP/1.1 Host: www.p4rc.com User-Agent: stopthosefish/1.1 CFNetwork/548.0.4 Darwin/11.0.0 Content-Length: 84 Accept: application/json Content-Type: application/json Accept-Encoding: gzip Accept-Language: ru Cookie: //потерто// Connection: keep-alive {"payload":{"gameRefId":"stf001","gamePoints":"22","minutesPlayed":"0","level":"1"}} Затем слался такой пакет: Code: PUT /services/v1/userpoints/checkinPoints HTTP/1.1 Host: www.p4rc.com User-Agent: stopthosefish/1.1 CFNetwork/548.0.4 Darwin/11.0.0 Content-Length: 154 Accept: application/json Content-Type: application/json Accept-Encoding: gzip Accept-Language: ru Cookie: //потерто// Connection: close {"securityObject":{"sessionId":"//потерто//"},"payload":{"gameRefId":"stf001","gamePoints":22,"minutesPlayed":0,"level":1}} В Cookie содержались печенья, которые можно было получить, залогинившись на сайте p4rc, параметр gameRefId - идентификатор игры, gamePoints - количество набранных игровых очков за текущий уровень, minutesPlayed - сколько минут было затрачено на прохождение уровня игры, level - текущий уровень, sessionId - параметр p4rcSessionId из Cookies. Словом, тривиальнее некуда - никакой защиты. Два запроса слались всегда один за другим, я пробовал позже слать только последний, но он без предыдущего не работал почему-то. Через 10 минут я наваял на php простейший скрипт, который слал оба запроса, затем пришлось потратить час-другой на то, чтобы просчитать среднее количество очков, набираемое за каждый из 30 уровней игры, а также время, затрачиваемое на их прохождение. Вот результаты моего труда: Code: 1, 22, 0 2, 97, 0 3, 227, 0 4, 405, 0 5, 604, 0-1 7, 788, 0 8, 1045, 0 9, 1561, 1 10, 2702, 1 11, 3412, 1 12, 4130, 1 13, 4841, 1 14, 5820, 2 15, 6840, 2 16, 7352, 1 17, 8670, 2-3 18, 9557, 2 19, 10598, 2-3 20, 11895, 3 21, 13359, 3 22, 14670, 3 23, 16180, 3 24, 17915, 3 25, 19727, 2 26, 21447, 2 27, 23192, 1-2 28, 24795, 1-2 29, 26202, 1-2 30, 27729, 1-2 Первый столбец - это номер уровня, второй - суммарное количество очков к концу прохождения уровня (помните, отсылать надо не суммарное количество, а количество за уровень), третий - количество минут, затрачиваемых на прохождение. Впрочем, это очень старая информация и может быть уже неактуальной, лучше самим всё просчитать для выбранной игры (игр). Сам скрипт выкладывать не буду, ибо желающие и так смогут его написать на чем угодно - все данные я предоставил, как и методику перехвата запросов. Сразу оговорюсь: если вы набрали необходимое количество очков на желаемый купон и купили его, получите вы его на e-mail только спустя пару дней. Если жестко накручивать себе очки, не выдерживая должные интервалы времени между парами запросов (например, между 20 и 21 уровнем должно пройти как минимум 3 - 4 минуты), то сервис пришлет вам письмо о том, что заподозрил подозрительную активность с вашей стороны, и купон вы вовсе не получите. Кстати, еще раз я проверил протокол p4rc прямо перед написанием статьи на игре Ski On Neon. Кое-что там поменялось, а именно, второй запрос. Авторы сервиса усовершенствовали протокол (нет-нет, не пугайтесь, шифрования или подписи по-прежнему нет), и теперь запрос выглядит так: Code: PUT /services/v2/userpoints/checkinPoints HTTP/1.1 Host: www.p4rc.com Accept-Encoding: gzip Content-Type: application/json Accept-Language: ru Cookie: p4rcSessionId=//потерто// X-P4RC-ApiKey: //api-key, видимо, уникальный для каждой игры// Accept: application/json Content-Length: 247 Connection: keep-alive User-Agent: Ski-On-Neon/5.1 CFNetwork/609.1.4 Darwin/13.0.0 {"securityObject":{"sessionId":"//потерто//"},"payload":{"endTimeInGMT":"02/10/2013 10:02:35.172","gameRefId":"Ski050612","gamePoints":456,"minutesPlayed":0,"startTimeInGMT":"02/10/2013 10:02:00.362","level":75}} В заключение скажу, что самым идеальным сценарием получения купонов будет следующий: скрипт, который раз в 10 минут заходит на сайт p4rc, проверяет, не появились ли там купоны, которые вас интересуют, и, если появились, начинает постепенно автоматически накручивать очки. Когда набирается полторы тысячи (ну или десять тысяч, сколько они там сейчас стоят), скрипт покупает купон. Можно зарегистрировать пару-тройку аккаунтов и делать это параллельно, но в этом случае без прокси не обойтись. Хотя на момент написания статьи, кажется, всех купонов на сайте вдоволь, поэтому такой совет малоактуален. Однако, в любом случае, не жадничайте и будьте осторожны