Пробрасываем данные с сайта в скачиваемое приложение (или не пробрасываем)

nocan

Все началось с того, что нам понадобилось трекать игроков, идущих в скачиваемый клиент по рекламе. Последовательность такая: игроки приходят на сайт, качают клиент и дальше логинятся в игру — но кто это, откуда и куда было неизвестно. К сожалению, передать простым способом в скачанный файл в скоро-уже-22-м-веке сейчас невозможно (есть ClickOnce, но это .NET, об этом ниже). В общем, нам надо было как-то отследить тех, кто пришел на сайт по определенной ссылке (рекламе), скачал файл и попал в игру, и чтобы эта цепочка нигде бы не рвалась.

Первая версия

Мы сделали так, что при отдаче файла пользователю, если он пришел по рекламе, файл получал имя вроде РоялФлэшПокер_установщик_(v39443).exe. И обертку на .NET 2.0, которая читает свое имя и пишет номер в из скобочек в реестр. Установочный файл весил 3мб. В момент, когда он запускался, он дергал писель у нас в статистике и мы знали — такой-то игрок, пришедший по такой-то рекламе, запутил клиент. Все прекрасно. В теории и на наших рабочих машинах.

Статистика получилась следующей: примерно 35% из всех, кто его скачал, его запускали. То есть по каким-то причинам 65% просто его не запустили.

Ради эксперимента, мы сделали файл-пустышку на .NET, и отдали его без переименования на сервере нескольким сотням игроков. Файл весил столько же, сколько и настоящий инсталлятор. При запуске он говорил о том, что эта версия устарела и что следует скачать новую с сайта (прощения просим). После того, как мы стали отдавать файл без переименования, количество запусков поднялось до 50%. Так не должно быть, но факт остается фактом. Ни я, ни кто-либо кого я об этом спрашивал с таким не сталкивались.

Эксперимент номер два — увеличили размер файла с трех до 50мб. На порценте запусков никак не отразилось, ни больше, ни меньше.

Следующим шагом мы сделали то же самое, но вместо .NET мы написали тестовый файлик на C++. Количество запусков поднялось до 65%. Думаю, в течене двух недель еще подтянулось бы где-то 5%. Кроме того файл, хоть и был подписан сертификатом, не был добавлен ни в какие белые листы и наверняка какой-то % его блокировал. В общем, поднять это значение до 80% или даже выше вполне можно.

В связи с этим стало понятно, что проблемы следующие:

  1. Обертка установщика написана на .NET и не у всех просто запускается, хота по идее у всех должен второй дотнет должен быть вместе с виндой. Но судя по всему это не так;
  2. По каким-то мистическим причинам переименоваие файла на сервере при отдаче примерно на 15% снижает оличество запусков (файл был успешно отдан и загрузка завершена).

Попытка номер два

Поэтому мы убрали обертку и хакнули InstallShield, добавив в него asm код, который писал в регистри AABBCCDD. После подписания сертификатом, файл успешно проходил все проверки и смартскрин его не блочил.

Однако, вполне ожидаемо тесты показали, что если изменить эти заветные AABBCCDD битики после подписания, чтобы в реестр попадала правильная маркетинговая информация, то это рушило сертификат. Причем, рушило его это только частично,  как ни странно — Смартскрин блочил нас не на всех машинах. Там, где он нас блочил, выглядело это так:

6bab70236ed140dba784a05e07845f9c

И если нажать на Подробнее, то так:

7b7a4f803203404a8623301a552466c2

Если заглянуть в сведения о файле, то с сертификатом там все в порядке:
crt


Думаю не надо долго думать, чтобы понять: на конверсии это скажется очень простым способом — а именно 99% тех, кто такое увидит, игру больше никогда не запустят.

Добавление в белый список Симантека ничего не дает. Если после добавления в вайтлист изменить битики снова, то подпись точно так же слетает. В .exe есть область в конце файла, которую вроде как можно трогать без нарушения сертификата, но из codecave, куда был зинжекчен наш .asm код, достать те данные похоже никак нельзя.

Поэтому вариант со встроенным нами asm кодом, пишущим в реестр, может работать только в одном случае: при отдаче игрокам битики AABBCCDD модифицируются на сервере и, затем, хакнутый .exe переподписывается сертификатом. При размере файла 5мб, это занимает около секунды, что допустимо. Если двруг случится неожиданный наплыв игроков, то несложно заготовить заранее 10-50к файлов, которые просто отдавать соответствюущим игрокам (хотя тут снова встает вопрос о переименовании файлов и риске снижения конверсии).

Более того, этот вариант не очень надежен так как в любой момент что-то может перестать работать. МС или Симантек могут посчитать, что мы делаем что-то не то (и вправду, как смеем мы маркетинг дату трекать!) и в каком-нибудь обновлении прикроет лавочку.

Альтернативы

Вариант номер 1: Переход на InnoSetup.

InstallShield стоит $3k и, судя по всему, нормально не умеет работать с http запросами, что делает операции по рбаоте с маркетинговой инфой непростыми и через одно известное место. Кроме того, после часового общения с представителем компании, я так и не понял, можно ли в IS куда-нибудь добавить область под маркетинговую дату, которую затем получать из IS и писать в реестр.

Ходят слухи, что в InnoSetup’е есть даже специальная область под кастомную информацию, изменение которой не портит подпись сертификата (даже не смотря на то, что чексумма не совпадает). Писать перед отдачей файла можно при помощи Backdoor Factory. Затем, уже из самого InnoSetup эту информацию можно доставать уже нормальным, «человеческим» способом, а не через хак на asm, у которого нет доступа куда надо. Кроме того, InnoSetup умеет нормально рабоать с http запросами, то есть можно дергать наши пиксели без проблем.

Вариант номер 2: перенос регистрации на сайт

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

Плюсов от реализации регистрации на сайте много. В группе Gamedeff кто-то аргментировал, «а как же игра без регистрации, все вас проклянут». Ответ на это — гостевой игре, без регистрации (точнее, с отложенной регистрацией) это никак не помешает. Просто она будет перенесена на сайт. Хорошо еще тут и то, что игровой сервер будет разгружен и регистрация на сайте будет своего рода прокси, снижающая нагрузку на игровой сервер.

Что еще хорошо в этом подходе — это то, что не дошедшие до скачивания/запуска/логина игроки уже будут нашими, и мы сможем конвертировать их догоняющими письмами со спецпредложениями, подарками, новостями и прочими плюшками.

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

Во-вторых, рано или поздно все равно придется пробрасывать маркетинговую информацию в отдаваемые .exe, чтобы мониторить события более детально. Ведь пока это не сделано, статистика по скачиваниям и запускам будет обезличена и оторвана от источников трафика, превратившись в обычные счетчики. По рекламной же статистие у меня будет очень большое расстояние между точками «пришел/зарегистрировался» и «авторизовался».

В общем, если у кого-то есть комментарии или кто-то уже прошел наш путь и собрал шишек/граблей, пишите. Обсудим. И отдельное спасибо MS и прочим за текущую реализацию .exe.



Мысли на тему “Пробрасываем данные с сайта в скачиваемое приложение (или не пробрасываем)” (4)

  1. Я лично трекаю по IP: при запуске игра сразу же запрашивает версию с сервера (мало ли, вдруг надо обновиться), и тем самым можно сопоставить IP с теми, кто качал. При этом, конечно, теряются ситуации типа «скачал на работе, принёс домой на флэшке и запустил дома» — в этом смысле, конечно, лучше писать данные в инсталлятор. Кстати, подпись 60Mb инсталляшки занимает полсекунды, т.е. ни разу не проблема.

    • Anti Danilevski on 25.08.2016 at 8:48 пп ответил:

      А как ты оттрекаешь пользователей, которые идут с какой-то конкретной ссылки с MyTarget, другие идут с какого-то объявления с ВК, какие-то с тизерок, другие — с контекста? ТЫ можешь получить IP на своей стороне, когда кто-то придет, сопоставить его с ссылкой, по которой он пришел. И да, он скачает приложение… а запустит его через неделю или две. За это время его домашний интернет десять раз сменит его динамический IP. У кого-то они будут совпадать (бывает, если нормально трафа идет), у кого-то через прокси/анонимайзер. В общем да, по IP можно, если тебе не особо важна точность.

  2. Можно сделать так:
    — генерирушье двадцать (сорок, сто) бинарников с разными айди;
    — на каждое новое скачивание выдаёшь следующий по списку бинарник, сохраняешь данные пользователя, айди бинарника и дату;
    — при первом запуске бинарника он отправляет на сервер свой айди, ты смотришь какому юзеру подходит и отмечаешь в базе.

    Чем больше бинарников тем больше точность подхода.
    Это если файл с игрой нельзя на лету генерировать с уникальным айди

    • Anti Danilevski on 02.09.2016 at 2:03 дп ответил:

      Слишком муторно и ненадежно. В .ехе есть области, куда можно писать без повреждений сертификата, что мы и будем делать, используя InnoSetup.

Добавить комментарий

Навигация