Mr.KTO blog

Отслеживание пользователя, скачавшего .exe

Уж не помню зачем это нужно.
Но суть в том, чтобы пользователь (зарегистрированный или анонимный), скачивающий триал вашей программы с сайта как-то учитывался. Чтобы программа "знала" откуда он пришёл (affid, referer, контекст/adsense/тизеры, seo/запрос в поисковике, др. рекламная компания).

Для этого нужно при скачивании как-то передать, скажем PHPSESSID установщику вашего софта, фактически .exe-файлу.
Вот варианты:

  1. Отслеживать как-то по ip-адресу, лазить в кукисы браузеров на локальном компе... Ненадёжно и малореально.
  2. Добавить sessid в имя скачиваемого файла, – и при установке проверить Application->ExeName | GetModuleFileName.
    (Вообще, это неплохой приём, например, для портативных версий софта).

    <?php
    header("Cache-Control: private");
    header("Content-Length: 123456");
    header("Content-Type: application/octet-stream");
    header("Expires: Sun, 23 Oct 2011 22:15:21 GMT");
    header("Content-Disposition: attachment;filename=bs_637653-jnFT6TYu.exe");
  3. И вот, собственно, моя идея:
    Как правило, даже после компиляции программы, в её бинарном виде всё-равно остаются строки с названием контролов: Label-ов/Edit-ов. Можно создать скрытый (аттрибут hiden) Edit1 и вписать туда что-то вроде: "MYPROGSESSID=_____=ENDOFSESSID" (если используете инсталлятор - то найти способ оставить метку там).
    Теперь скомпилировать исполняемый файл, проверить что текст нашей строки не изменился, открыв в любом hex-редакторе (UltraEdit напр.)
    Дальше идёт PHP-скрипт скачки, кот. до стандартных хидеров ещё и модифицирует .exe-файл:

    str_replace("MYPROGSESSID=_____=ENDOFSESSID", $_REQUEST['PHPSESSID']);
  4. (Для ускорения процесса можно кешировать позицию этой строки в файле ($pos = stripos()), проверив дату модификации файла (filemtime(), после чего fopen(, "wb"); fseek(, $pos); fwrite();)
    Собственно, этот способ не ограничивается Edit1-контролом. Вы можете попробовать добавить файл с определённой строкой-токеном в ресурсы (не представляю как это делается :lol:), добавить определённый файл картинки в инсталлятор (попросив «установить» его в %programfiles%), после чего прочитать его из уже установленной программы.

____________
Подписка на рубрику C++/Шаровара - теперь БЕСПЛАТНО! Да, купон на скидку 99.7% без НДС.

Понравился пост? – Поделитесь ссылкой:

Комментарии (7) на “Отслеживание пользователя, скачавшего .exe”

  1. RST пишет:

    Не всегда.
    Компилятор в хидер пишет чексам. Если ты поменяешь байты, то ехе уже будет не настолько кошерный ибо чексам будет неверный. После замены байтов, рекомендуется использовать editbin /release а после этого еще upx можно юниксовую версию. Тогда будет очень кошерно - как буд-то так и надо.

  2. RST пишет:

    Добавить в ресурс строку %MY_AFFILIATE_ID% и потом str_replace
    Добавить в код, если на C++ : static const szAffiliate="%MY_AFFILIATE_ID%";
    И потом точно так же str_replace

  3. RST пишет:

    Самый-самый дзеновский метод : RegHacker запускать в рантайме из пыха под wine-средой.

  4. mrkto пишет:

    Может правильней использовать манифесты, вроде они остаются неизменными:
    1. создать файл my.rc

    1 24 "my.manifest"

    2. файл my.manifest (для WinXP напр.)

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
            version="1.0.0.0"
            processorArchitecture="X86"
            name="Microsoft.Windows.MyApp.__QWERTY__"
            type="win32"
    />
    <description>__QWERTY__</description>
    <dependency>
            <dependentAssembly>
                    <assemblyIdentity
                            type="win32"
                            name="Microsoft.Windows.Common-Controls"
                            version="6.0.0.0"
                            processorArchitecture="X86"
                            publicKeyToken="6595b64144ccf1df"
                            language="*"
                    />
            </dependentAssembly>
    </dependency>
    </assembly>

    3. Добавить ресурс my.rc в проект – Add file to project (Shift+F11)
    4. И примерно так получить данные:

    TResourceStream *Res = new TResourceStream((int)HInstance, "#1", "#24");
    
    unsigned char *sXML = new unsigned char[Res->Size];
    memcpy(sXML, Res->Memory, Res->Size);
    
    ShowMessage((char*)sXML);
    
    delete sXML;
    delete Res;

    Можно внедрять манифест и с помощью спец. программы мелкомягких: http://msdn.microsoft.com/en-us/library/ms235591(v=vs.80).aspx

    Правда подписывать приложение (или инсталлятор) всё-равно придётся каждый раз снова...

  5. RST пишет:

    Манифест это гуд, но чем он отличается от обычного ресурса?
    Кроме того, что тут есть завязка на XML который нужно парсить :)

  6. mrkto пишет:

    Манифесты не должны никак меняться, сжиматься, т.к. так их читает Windows (вроде).
    Ничего парсить не нужно:

    ShowMessage( sXML.SubString(sXML.Pos("<description>")+13, sXML.Pos("</description>")-sXML.Pos("<description>")-13) );
  7. Макс пишет:

    понятно теперь стало

Оставить комментарий