В поиске бесплатных билетов, исследование игры Аэрофлота

    Началось все с того, что я получил ссылку на промо-сайт компании Аэрофлот. Акция заключается в прохождении небольшой flash игры и получении бонусных миль. Главный приз в 150 000 миль получает игрок, занявший первую строчку в рейтинге. Собственно, принцип формирования рейтинга и вызвал мой интерес к этой акции.



    Как всем хорошо известно, код flash приложений выполняется на стороне клиента, поэтому защита от нечестной игры представляет весьма сложную задачу. По сути, единственным верным решением является перенос всей игровой механики на сторону сервера, а flash приложение выполняет роль клиента к API.

    Посмотрим, как с этой задачей справляются в Аэрофлот.

    Для начала запускаем игру с открытой консолью разработчика в Google Chrome. И… видимо, все будет скучно. Как оказалось, запрос на сервер отправляется всего один раз в конце игры.



    Данные в запросе подозрительно похожи на base64, но преобразование из этой кодировки приводит лишь к набору бинарных данных. Значит, запрос шифруется где-то в глубине клиента. К сожалению, или к счастью, swf файлы никогда не являлись стойкими к декомпиляции.

    Буквально через 10 секунд после просмотра ActionScript кода обнаруживается вот такой фрагмент:

    public static function prepareForSend(param1:Object, param2:String) : String {
        return Xor64.encode(JSON.stringify(param1), "aef-game" + param2);
    }
    


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

    // main.as
    this._token = stage.loaderInfo.parameters["token"];
    
    // http://aeroflotbonus15.ru/media/js/aef.js
    start : function( token, authState, connector, autoStart ){
        . . .
        this._token = token;
        . . .
    },
    . . . 
    AEF.flashController.buildFlash({ token: this._token, connector: this._connector }, this._lang );
    . . . 
    
    // http://aeroflotbonus15.ru/
    AEF.start('c958c089505d321994578a12fabbe73d', true, "http://aeroflotbonus15.ru/api/", false, 'ru');


    То есть полный ключ – aef-gamec958c089505d321994578a12fabbe73d почти весь лежит у всех на виду, прямо в коде страницы.
    Кстати, судя по всему, разработчики даже поленились самостоятельно реализовывать алгоритм шифрования и воспользовались готовым решением.

    Результат дешифровки с озвученным ключом:

    {  
       "result":{  
          "cities":11,
          "miles":749.9018522566122,
          "time":58356,
          "bonuses":2,
          "wins":6
       },
       "version":0.98,
       "bytes":7205605,
       "system":{  
          "cpuArchitecture":"x86",
          "screenDPI":72,
          "playerType":"PlugIn",
          "isDebugger":false,
          "version":"MAC 15,0,0,152",
          "manufacturer":"Google Pepper"
       },
       "url":"http://aeroflotbonus15.ru/media/swf/game.swf?68"
    }


    Форматирование добавлено для удобства чтения.

    В результате кто угодно может отправить какой угодно рейтинг. Не знаю, как организаторы планируют отделять честных участников от читеров, но лично у меня отпало всякое желание участвовать в этой акции.

    P.S.



    У меня нет карточки «Аэрофлот Бонус», поэтому результаты никак не повлияют на общий рейтинг.
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 71

      +26
      Большинство разработок промо, имхо, отдаются обезьянам в зоопарке. Какой идиот выполняет данные на клиенте?
      Еще один минус использования флеша — прожорливость. Год-два назад у билайна была промо где нужно было ловить зверушек, шустро кликая по ним — за них давали смс/траффик.
      Так вот если запустить всё это дело на каком-нибудь целероне, игра из быстрой аркады превращается в пошаговую стратегию. Можно одной рукой жонглировать, а второй накликать себе счастье
        0
        Всего-то нужно синхронизировать анимацию не по кадрам, а по таймеру и зверушки снова засуетятся и забегают, не требуя от процессора больше, чем он реально может. Будет некрасиво, но динамично.
          0
          раньше в контекстном меню можно было выбирать качество ролика и надо сказать что всякие масяни с удовольствием шли в середине двухтысячных на третьих пнях и 4-х селеронах, а к концу десятилетия перестали
            +1
            Я смотрел Масяню до того как это стало мейнстримом на разогнанном до 100 MHz 486, а вы говорите третий пень
              +1
              попробуйте повторить с современным flash player
                0
                У меня нет flash player и проблем связанным с ним тоже нет.
                Хотя признаюсь честно, я переключался в некоторую систему с флешем чтобы файрбагом пощупать, что там такое предлагают
          +4
          Если предположить что «априори выиграет знакомый директора», то все становится на свои места:
          1. Акция проходит удачно в любом случае
          2. Выигрыш распределяется правильно в любом случае
          3. Даже дополнительный пиар на хабре приносит только пользу и никак не влияет на результаты.
            0
            А можно просто за 5-минутное кофе набить себе 1500 «лишних» бонусных баллов и быть спокойным:)
          • UFO just landed and posted this here
              +2
              После этого поста заказчик вылюбит исполнителя. Еще будет лучше если кто-то из «выше заказчика» узнает. Лояльность от таких вот косяков вряд ли вырастет
                +22
                да нифига не изменится! ни лояльность, ни жопа исполнителя/заказчика/посредника/100500-людей. вообще ничего. Вы наивно думаете что цель реально что-то разыграть и найти победителя?
                  +3
                  Просто подобные вещи отдаются на аутсорс, причем маленьким-маленьким компаниям, у которых подобных заказов за раз идёт штук эдак 6 — наблюдал сей процесс с достаточно близкого расстояния. Требование ключевое — «сделать вчера», а бюджет вас неприятно удивит. На безопасность и прочее всем пофиг, потому что обычно на каждый заказ берётся другая фирма и на «лояльность» всем плевать — крупных фирм для таких заказов много, мелких фирм-исполнителей тоже.
                    +2
                    Почти все правда, кроме «наплевать на лояльность». Я работаю в похожей компании, только делаем мы оффлайновые инсталляции (мультитач столы, кинекты, мэппинги и все в таком духе).

                    Вся эта тусовка маркетологов (считай заказчиков) на нормальном уровне уже не очень большая. Скосячишь с одним, об этом обязательно узнают остальные.
                    В первую очередь ценится стабильность результата — сроки как всегда действительно «вчера» и важно, чтобы к сроку что-то работало. Оно может быть не самым красивым, но оно должно выглядеть как что-то законченное и по возможности не валиться каждые 5 минут с exception'ом :)

                    Тут скорее все-таки недостаток квалификации программиста. Большая часть флешеров это всегда были аниматоры, которые как-то научились чуть-чуть кодить. Порой они не знают, что такое Linked List или зачем нужна эта вертикальная палочка | и чем она отличается от ||, как недавно проскакивало на hacker news.
                +24
                Как только я получил письмо об этой акции от Аэрофлота и чуть-чуть покопался в содержимом страницы, то сразу понял — скоро на Хабре будет такая статья :).
                  +1
                  У кого-то понедельник будет тяжелый, пострадают многие))
                  А такой подход в реализации очень не серьезен и он должен был быть предусмотрен((
                    +53
                    Правила акции:
                    6.1. Главный приз в размере 150 000 миль получает Участник, первым набравший максимальное количество баллов за одну игру.
                    6.4. Если Участники Акции набирают одинаковое количество баллов, победителем признается Участник, набравший их первым.

                    Ну, все просто — победитель тот, кто первым «получит» (unsigned)-1 баллов :)
                      +2
                      Вот ржака если signed =)
                      –8
                      Они ещё и пароль в открытом виде на почту пересылают после регистрации =\ Может и хранятся в открытом виде? Жесть.
                        +17
                        Это есть в 100500 системах, когда пароль высылают при регистрации, но в БД хранится только хэш. По тому факту, что при регистрации вам выслали пароль ничего доподлинно нельзя сказать. Понятно, что если в топике кого-то пинают, так и тянет присоединиться с криками «а ещё он котиков не любит!», но всё-таки. Человечнее как-то надо быть. Думать, прежде чем критиковать.
                          +5
                          А я ничего не констатировал — что они хранят в открытом виде. Но сам факт, что высылают на почту мне мой пароль в открытом виде, не нравится. Никогда не любил, когда так делают. Кроме случаев, когда пароль генерируется при регистрации.

                          В моей памяти не помню, чтоб 100500 сервисов так делали. Помню 1 точно, и ещё один, не точно. Итого, теперь их в списке 3. А вы, видимо, считаете это хорошей практикой?
                            +3
                            ага, человечнее. вы восстановить пароль после регистрации попробуйте — придет в открытом виде.
                            думать, прежде чем… ой, а кто это сказал?
                              +1
                              а должна прийти ссылка, и сразу запрос ввода нового пароля
                          –3
                          А результат +100500 случаен или дань эстетике? :)
                            +2
                            Руками набил.
                            +3
                            Еще один фейл Канделаки — маркетинговый партнер в интернете у Аэрофлота — компания «Апостол», основанная Канделаки.
                            Предыдущий фейл — легко найти по ключевому слову «канделайки»
                              +4
                              Кому фейл, а кому так успешное «освоение средств».
                              +9
                              Сдается мне, что Аэрофлот все же своего добился. Главное для них — РЕКЛАМА. Критика — это тоже реклама. В данном случае автор сыграл им на руку, распространяя рекламу среди еще большего числа людей. Так что не стоит спешить с выводами, кто же тут дурак…
                                –4
                                Главное, чтобы они не сделали игру «Управляй настоящим самолетом» (где команды подавались бы, после «фитрации» флешкой на стороне клиента, на системы «живого» лайнера) — и с такой же «защитой», как здесь. Хотя, может после команд «набрать скорость 100500 км/час и подняться на высоту 100500 км», не разрешенных во флеш-интерфейсе, но подаваемых в виде руками сформированных JSON, кто-то и обратит внимание, что «что-то тут не так»?

                                А пока такого не будет — какие проблемы? Вряд ли маркетологи в технологиях разбираются, отчет об акции уже написал (и, возможно, получатель «миль» уже известен), так что кого волнуют проблемы игроков?
                                  0
                                  Аэрофлоту реклама не нужна, а вот лояльность клиентов ооочень нужна, а таким способом они ее точно не увеличат.
                                  +4
                                  Или фулл-Вайп, или мы всей гильдой уходим из проекта!

                                  А по факту, акцию надо бы приостановить, а клиент-серверную логику в плане передачи результатов переписать. Но, как известно, проблемы негров…
                                    0
                                    Не так все просто, акция зарегистрирована со сроками проведения. Переписать, протестить и выкатить новую логику не успеют.
                                      0
                                      Значит, ухожу всей гильдой из этого прогнившего проекта
                                        0
                                        Проекту не нужны хардкорщики, в отличие от донатеров.
                                          0
                                          вы тоже играли в ArcheAge?
                                            0
                                            Нет, мне хватило линейки.
                                            Просто это не только в ArchAge, а во всех таких проектах.
                                            Во имя доната и именем его (С)
                                    +1
                                    Все раскритиковали, но никто не написал как сделать правильно. Ну и как?
                                      +9
                                      Правило номер один: не доверять данным, пришедшим от клиента.
                                        +8
                                        Правило номер два: никогда не доверять данным, пришедшим от клиента.
                                          0
                                          А если бы данные передавались через HTTPS, сертификат бы проверялся на сервере и т.п., то все равно удалось бы как-то сертификат извлечь и свои данные отправить?
                                            0
                                            Даже не пришлось бы сертификат извлекать — достаточно декомпилировать и собрать обратно флеш-приложение. Я не специалист по безопасности, но даже для меня очевидно, что если мы отправили данные пользователю в «черную дыру» (ключ во флеш-приложение), то они могут вернуться абсолютно любыми. Тем не менее, писатели игр на флеш это удачно обходят. Я бы для начала почитал, как это делают те, кто этим занимается профессионально.
                                              +2
                                              HTTPS тут не причем, он даже никак не изменит ход подделывания результата. Грубо говоря он просто скроет от Васи Пупкина, который прослушивает ваш трафик, факт того, что вы играете в эту игру.
                                            +11
                                            А не исполнитель ли вы часом? :)
                                              +1
                                              Очевидно же. Посылать на сервер не готовые результаты игры, а информацию о действиях пользователя, по которым вычислять эти результаты и отправлять обратно.
                                                +10
                                                У них уже сервер тормозит и выдает 502.
                                                Обработку логики на сервере в реалтайме они не выдержат.
                                                А ферму серверов под это дело они запускать не станут.
                                                Хотя могли бы запустить в амазоне и охренеть от счетов.
                                                +2
                                                Все [клиенты] лгут! Так что два варианта:
                                                1) делать всё в реалтайме на сервере
                                                2) отправлять на сервер полный лог игры и валидировать его там

                                                Думается, вариант «2а» — выборочная валидация логов — был бы самым правильным. Скажем, если человек набрал всего лишь жалкую 1000 баллов, можно его и не проверять :)

                                                * самым правильным — потому что реализовать проще всего и на это уйдёт совсем немного времени. И немного процессорного времени.
                                                  0
                                                  Логи тоже можно подделать так, что все будет выглядеть хорошо.
                                                  Вы же, я надеюсь, не предлагаете ручную валидацию?
                                                    +3
                                                    Конечно, можно подделать. Но для этого надо уже постараться побольше.
                                                    Например, у каждого подбираемого объекта есть координаты. Надо проверить, что самолёт летал по правильным траектории и долетал до этих координат.
                                                    Надо сначала извлечь эти координаты, потом проложить маршрут… Получить список всех вопросов, дать на эти вопросы ответы.
                                                    Большинство «хакеров» отсеется автоматической фильтрацией.

                                                    Вряд ли более 1% от числа пользователей аэрофлота — «хакеры».
                                                    Вряд ли более 1% «хакеров» пройдёт автоматическую валидацию. Остальных можно и вручную отсеять. А можно и не отсеивать, а приз дать. Выложить потом демо-ролик, как он летел и набрал эти очки, красиво будет :-). А уж летел он сам, или бот, какая разница — никто не узнает. Главное, это будет выглядеть как нормальный полёт.

                                                    Валидацию, само собой, автоматическую. Код на AS3 уже написан, если не придумали ещё консольный интерпретатор, то можно по-быстрому сделать валидатор на JS, на основе существующего AS3 кода.
                                                    0
                                                    Не так все просто.

                                                    1) Нужен мощный сервак и надежный инет у пользователя. Итого у части юзеров останется негативный осадок, и «Аэрофлот» потратит много больший бюджет на серваки и оптимизацию кода.
                                                    2) На хабре всё равно появилась бы статья «как подделать лог в игре аэрофлота», более длинная и интересная. А «Аэрофлот» потратил бы чуток больше денег на разработку.

                                                    Мой вариант:
                                                    3) Отсылать в real time кучу логов, но не обрабатывать их на сервере, а просто сохранять. Причём можно сюда включить всякие эвристики типа траектории курсора мышки. Затем верифицировать этот лог только у победителя, можно даже полуавтоматически. Применить data mining для анализа аномалии. Но опять — бюджет акции…

                                                    Но если посчитать бюджет, то может оказаться, что проще сделать как сейчас: не тратится на разработку, 99% пользователей всё равно ничего не заметят, а кому достанется приз — дело десятое, и на успешность рекламы никак не влияет :) А такие статьи на хабре лишь увеличивают внимание к «Аэрофлоту» и его программе (вы ведь не сделаете вывод, что кривой подряд рекламной акции влияет на качество рейсов?).
                                                      0
                                                      Должно быть, вы не мне ответили? Вариант с реалтайм отправкой на сервер (comet?) — подходит для реалтайм онлайн игр, но не для рекламных приложений.

                                                      Я считаю, выборочной валидации (не реал-тайм, а после загрузки логов) вполне достаточно, чтобы отсеять самые простые и дерзкие попытки обойти систему.
                                                      Кроме того, это ничего не стоит — это не требует мощного сервера и надёжного интернета. Код валидации уже существует на AS3, надо всего лишь его выполнять его на сервере иногда. Собственно у нас схожие мысли, только 1) я бы полный лог слал один раз и 2) не использовал бы никакого дата майнинга, а просто проверял, действительно ли проходит траектория полёта через особые точки. Элементарно реализовать и отсеет всех, кроме самых настырных хакеров :).

                                                      Всё остальное — что выглядит как утка, плавает как утка и крякает как утка — ИМХО можно считать уткой.
                                                        0
                                                        P.S. На правах злостного оффтопика.

                                                        Если честно, я не думаю, что подобная акция может значительно повлиять на количество клиентов компании. Если кто-то уже является активным участником бонусной программы (напрямую или через кобрендинговые кредитки, если таковые имеются) — скорее всего, он таковым и останется. Если является участником акций другого альянса — ну… например, я бы хотел потратить и свои мили OneWorld тоже. А если не является — скорее всего, проще выбирать наиболее подходящего перевозчика через SkyScanner, тем более что некоторые рейсы у компаний, не входящих в альянсы — вроде европейских лоукостеров или, например, MIAT (с ними лечу в декабре впервые, — цена была ниже, чем у всех конкурентов, а до Берлина всего 2 часа лёта), могут быть очень привлекательными.

                                                        Ну а я лично с Аэрофлотом летал 1 раз. Этого мало, чтобы делать выводы, но по одному перелёту — вроде всё как у всех. Меня бы больше порадовало не какое-то улучшение качества рейсов, а их удешевление. Всё-таки Аэрофлот довольно-таки дорогой перевозчик. Если бы удалось привлечь новых клиентов таким образом (и увеличить загруженность рейсов), и это бы повлияло положительным образом на цену, я был бы очень-очень рад :).
                                                      0
                                                      Ну и время игры проверять, тут оно жёстко задано, а значит, если результаты пришли слишком быстро, то они, очевидно, не должны приниматься.
                                                      +1
                                                      Правильно я понимаю, что на сервер они передают лишь результаты (кол-во правильных ответов, кол-во выигранных игр и т.п.), а сам результат (кол-во очков) считается на сервере? Т.е. вы разобрались с логикой расчета (которая не описана в статье), чтобы сделать результат 100500?

                                                      И, у них еще есть возможность убрать такие результаты, если у них есть некое представление, что, например, нельзя заработать такое кол-во очков за такое время, т.е. и эти параметры надо грамотно подобрать (хотя особо сложного в этом ничего нет).
                                                        0
                                                        Знаком с механикой игры весьма смутно (летай к красным маркерам, собирай дополнительные секунды, отвечай на вопросы, но вроде серверного расчета там нет), так как сейчас сайт выдает 502 bad gateway. Да, вы правильно поняли, все данные, которые влияют на результат — можно подставить самому изменив запрос к серверу.

                                                        Накрутки разного рода не редкость в подобных промо играх/офферах, все решают разными способами. Кто-то обнуляет всех подряд, кого заподозрили в накрутке, другим вообще на это все плевать и приз получит тот, кто в топе.
                                                        +1
                                                        Очевидно, у честных игроков нечетное количество очков.
                                                          0
                                                          Аудит не примет отчёт, который заканчивается на 5 и 0.
                                                          0
                                                          Будет веселее: если бучу не разводить, то будет тихо. Если пойдет волна, трандюлей получит автор исследования. Мол, «он занимался декомпиляцией», и «вносил изменения на сервера компании без разрешения». То, что эти изменения — суть запись в лог веб-сервера и в таблицу результатов, а не модификация /etc/hosts или /etc/passwd, никого не волнует, и меньше всего — правоохранителей.

                                                          Так что надо еще накатать статью в газету, лучше в крупную, чтобы буча стала громкой, и автора упекать «по всей строгости» было бы чревато для имиджа компании.
                                                            0
                                                            А можно какие-нибудь два примера?
                                                            1) когда кого-то засудили за невинные шалости с leaderboard
                                                            2) когда публикация в газету спасла кого-то от тюрьмы за шалости с leaderboard?
                                                              +2
                                                              Претензии хилые, декомпиляция в России, насколько мне известно, не запрещена, и на сервер никто изменения не вносил, была лишь отправка результатов.
                                                                0
                                                                Все бы хорошо, но, насколько мне известно, такого рода натяжки (модификация данных на сервере) применялись и выносились обвинительные приговоры.

                                                                А что модификации не было — а как данные на сервере сохранились без записи результата в тот, условно говоря, «файл», где уже хранилось старое состояние таблицы рекордов? А раз сохранялись, то вот файл модифицировался.

                                                                Еще раз повторюсь, это, конечно, дело адвоката объяснить суду, что и как на сервере хранится, но это как судья решит — будет случать или нет.,.
                                                                  0
                                                                  Понятно, что в нашем суде может произойти что угодно, но тут тогда наиболее надёжный способ под его не попасть — не жить в стране (при условии несовершения реальных преступлений, чтоб не выдал не интерпол). Но это всё лирика. Юридически претензии не обоснованы.
                                                                    0
                                                                    Разве под 274 УК РФ это нельзя подвести?
                                                                      0
                                                                      Кажется, это вообще закон для телекомов и дата-центров. Ну и чтобы нарушить правила они должны быть. В данном случае их попросту нет. (В правилах акции нет на данный момент ничего подходящего.)
                                                              –6
                                                              А где описание «как надо было сделать»?
                                                              В том смысле, что в принципе даже промежуточные данные — это тоже данные от клиента и их тоже можно подделать в соответствии с логикой приложения, просто сложнее и дольше, но тут всё от цены за победу зависит.
                                                                +5
                                                                По сути, единственным верным решением является перенос всей игровой механики на сторону сервера, а flash приложение выполняет роль клиента к API.
                                                                  0
                                                                  А вот фиг. Спидхаки, воллхаки, подмена времени и еще 1000 вариантов можно придумать что-бы обойти защиту и получить преимущество в игре. С этим практически невозможно бороться. Считаю что то, что разработчик хотя-бы использовал XOR шифрование это уже успех для такого проекта.
                                                                +2
                                                                «Ага! Вот эти ребята!» Вчера на одной местной конференции хвастались этим промо.
                                                                  0
                                                                  Нет никакой разницы кто и как победит, это не лотерея, это не банковский продукт, это чистой воды промо. Главное привлечь клиентов к продукту, и выдать гарантированный подарок Вот такие же проблемы в самой программе лояльности найдутся — тогда есть смысл обсуждать это.
                                                                    0
                                                                    А результат-то они уже подтерли
                                                                      +4
                                                                      «Кстати, судя по всему, разработчики даже поленились самостоятельно реализовывать алгоритм шифрования и воспользовались готовым решением» — крайне удивляет эта фраза. Казалось бы, в вопросах реализации алгоритма шифрования наиболее разумно как раз использовать готовые решения, потому что без существенного опыта в области шифрования при реализации собственного алгоритма очень легко допустить ошибку, что будет критично для безопасности.
                                                                        +2
                                                                        Алгоритм шифрования там должен был быть в кавычках, xor за серьезный шифр никто не воспринимает. Кроме того в данном случае использовали именно «велосипед» просто чужого производства.
                                                                        0
                                                                        я когда-то так htc конкурс обходил, надо будет написать об этом.

                                                                        Only users with full accounts can post comments. Log in, please.