Re[4]: Привязка программы к компьютеру
От: _AND Российская Империя За Русский мир! За Русь святую!
Дата: 02.11.11 07:39
Оценка:
Здравствуйте, CRT, Вы писали:

CRT>Здравствуйте, _AND, Вы писали:



CRT>>>а как ты будешь поступать когда пользователь поменяет железо и обратится к тебе c просьбой сделать так чтобы его ключ работал на новом железе?


_AN>>Сбросить его регистрацию и попросить перерегистрировать с тем же ключом?


CRT>тогда возникает еще один вопрос. А если он через неделю еще раз попросит, а потом через неделю еще раз, потом еще раз. Что будешь делать?


Недавно уже было обсуждение, я там подробно писал, что я делаю в таком случае.
Если коротко — попрошу объяснить причину и посмотрю, какие именно параметры привязки у него меняются.
По этой информации делаю вывод, позволить перерегистрацию или нет. Пока что в таких ситуациях (очень редких) всегда продлял.

Встречал такой вариант — это если много пользователей (не мой вариант — на каждый ключ есть несколько (3-5) попыток регистрации (при этом нигде явно это не говорится), если пользователю нужно больше — он пишет и объясняет.
Re[3]: Привязка программы к компьютеру
От: byterus Россия  
Дата: 02.11.11 08:11
Оценка:
Здравствуйте, _AND, Вы писали:

_AN>Что-то мне кажется что будут проблемы у 32-битного приложения на x64.


Нет проблем.
MySQL stored procedure debugging
Re[7]: Привязка программы к компьютеру
От: Nonmanual Worker  
Дата: 02.11.11 08:26
Оценка:
Здравствуйте, icezone, Вы писали:

I>Ваш аттач с ключевым файлом могут антивирусники порезать.

Почему мой? К тому же не припомню случая чтобы какие-нибудь вложения резались, если конечно это не exe или по 10 мегов.
З.Ы. Я не вижу приемуществ файлов перед короткими ключами. Много лет назад мы использовали файлы, но на то были причины, которые уже давно устранены.
Re[2]: Привязка программы к компьютеру
От: LupakovO  
Дата: 02.11.11 08:26
Оценка: +1
CRT>а как ты будешь поступать когда пользователь поменяет железо и обратится к тебе c просьбой сделать так чтобы его ключ работал на новом железе?

Мне кажется оптимальным решением будет давать пользователю возможность 2-3 раза сменить железо и соответственно серийный номер.
Указать это в лицензионном соглашении. При этом ключи выписывать автоматически на своем сайте. Всякие бывают ситуации, и всех можно
понять и иногда увеличить данное число регистраций.
Re[8]: Привязка программы к компьютеру
От: icezone  
Дата: 02.11.11 09:16
Оценка: -1
Здравствуйте, Nonmanual Worker, Вы писали:

NW>Почему мой? К тому же не припомню случая чтобы какие-нибудь вложения резались, если конечно это не exe или по 10 мегов.


Упс, это DarkMaster'у должно быть адресовано. Аттачи режутся у корпоративщиков, меня даже заранее перед покупкой об этом предупреждали.
Re[2]: Привязка программы к компьютеру
От: okman Беларусь https://searchinform.ru/
Дата: 02.11.11 09:55
Оценка:
Здравствуйте, byterus, Вы писали:

B>Я привязываюсь к виндовому идентификатору, у каждой инсталляции он свой.


B>
B>function GetMachineID: string;
B>var
B>  Reg: TRegistry;                    
B>begin
B>  Result := 'UNKNOWN_' + IntToStr(Random(100000));
B>  try
B>    Reg := TRegistry.Create(KEY_READ OR $0100);
B>    try
B>      Reg.RootKey := HKEY_LOCAL_MACHINE;
B>      if Reg.KeyExists('SOFTWARE\Microsoft\Cryptography') and Reg.OpenKey('SOFTWARE\Microsoft\Cryptography', False) and Reg.ValueExists('MachineGuid') then
B>        Result := AnsiUpperCase(Reg.ReadString('MachineGuid'));
B>    finally
B>      Reg.Free;
B>    end;
B>  except
B>  end;
B>end;
B>


На моем компе в соответствующем ключе под Wow6432Node запись MachineGuid отсутствует.
Re[2]: Привязка программы к компьютеру
От: okman Беларусь https://searchinform.ru/
Дата: 02.11.11 09:58
Оценка: -1
Здравствуйте, edton, Вы писали:

E>Еще 15 лет назад наши классики шаровары вроде Каталова писали что привязка к железу — плохая идея.


Плюсую.
У меня полно разнообразного софта, но ни один не привязывается к железу и не лезет ни на какие
серверы для всяких там своих проверок. А железо я обновляю периодически, гораздо чаще чем раз в
пять лет. И если бы каждая вторая прога при этом требовала перерегистрации, так ну в баню
такой софт — лучше найти альтернативные программы и не мучиться.
Re[3]: Привязка программы к компьютеру
От: byterus Россия  
Дата: 02.11.11 10:32
Оценка:
Здравствуйте, okman, Вы писали:

O>На моем компе в соответствующем ключе под Wow6432Node запись MachineGuid отсутствует.


Вы код запускали? У меня куча пользователей на 64 бит системах.
MySQL stored procedure debugging
Re[4]: Привязка программы к компьютеру
От: _AND Российская Империя За Русский мир! За Русь святую!
Дата: 02.11.11 10:49
Оценка:
Здравствуйте, byterus, Вы писали:

B>Здравствуйте, okman, Вы писали:


O>>На моем компе в соответствующем ключе под Wow6432Node запись MachineGuid отсутствует.


B>Вы код запускали? У меня куча пользователей на 64 бит системах.


А вы сами подебажте и посмотрите.
На 7ке 64битной, при условии что приложение 32х битное, записи MachineGuid не увидите.
Может быть у вас при невозможности чтения какое-нибудь дефолтное значение используется?
Re[5]: Привязка программы к компьютеру
От: byterus Россия  
Дата: 02.11.11 10:53
Оценка:
Здравствуйте, _AND, Вы писали:

_AN>А вы сами подебажте и посмотрите.

_AN>На 7ке 64битной, при условии что приложение 32х битное, записи MachineGuid не увидите.
_AN>Может быть у вас при невозможности чтения какое-нибудь дефолтное значение используется?

Ребята, кончайте пугать блин! Все работает, и у пользователей и на виртуалке. По умолчанию используется UNKNOWN_(рандом набор цифр), если бы не работало то пользователям пришлось бы активацию делать каждый раз при запуске.
MySQL stored procedure debugging
Re[4]: Привязка программы к компьютеру
От: okman Беларусь https://searchinform.ru/
Дата: 02.11.11 10:57
Оценка:
Здравствуйте, byterus, Вы писали:

B>Здравствуйте, okman, Вы писали:


O>>На моем компе в соответствующем ключе под Wow6432Node запись MachineGuid отсутствует.


B>Вы код запускали? У меня куча пользователей на 64 бит системах.


#include <iostream>
#include <Windows.h>



int main()
{
    using namespace std;

    HKEY hKey;

    if (ERROR_SUCCESS != RegOpenKeyExW(HKEY_LOCAL_MACHINE,
        L"SOFTWARE\\Microsoft\\Cryptography",
        0,
        KEY_READ,
        &hKey))
    {
        cout << "RegOpenKeyExW failed." << endl;
        return EXIT_FAILURE;
    }

    wchar_t Buffer[50];
    DWORD cbBuffer = 50 * sizeof (wchar_t);

    if (ERROR_SUCCESS != RegQueryValueExW(hKey,
        L"MachineGuid",
        NULL,
        NULL,
        (BYTE *)&Buffer[0],
        &cbBuffer))
    {
        RegCloseKey(hKey);
        cout << "RegQueryValueExW failed." << endl;
        return EXIT_FAILURE;
    }

    RegCloseKey(hKey);
    wcout << L"Succeeded (" << &Buffer[0] << L")" << endl;
    return EXIT_SUCCESS;
}

Компилируем в двух конфигурациях — Win32 и x64.
Запускаем на 64-битной Windows Vista или Windows 7.

64-bit exe:

>Succeeded (78d40214-f8fc-4769-b03c-1a2eea2d6fbb)


32-bit exe:

>RegQueryValueExW failed.

Re[2]: Привязка программы к компьютеру
От: veroni  
Дата: 02.11.11 16:33
Оценка: 1 (1)
Здравствуйте, DarkMaster, Вы писали:

DM>Здравствуйте, LupakovO, Вы писали:



LO>>Написал программу на Delphi. Хочу сделать привязку к конкретному компьютеру, подскажите, как лучше реализовать? К чему привязываться?

LO>>Я вроде слышал 3 года назад, что теперь процессоры и материнские платы не содержат уникального ID. Это правда?
LO>>Кто-то советует к жесткому диску, но вроде жесткие диски содержат движущиеся части и ломаются чаще. Поэтому прошу совета у специалистов.

DM>Тебе лучше к шароварщикам обратится. Основные места привязки: материнские платы, винты, система. Винты — не всегда можно точно привязаться — информация, доставаемая через GetVolumeInformation() может быть легко изменена. То же самое относится к системе (Windows ID) — переставили систему — все уехало. Доступ к ID материнки — отдельная песня. Я бы не заморачивался и сделал бы шифрованный ключевой файл. Файл есть и его содержимое корректно — работаем, если нет — прошу на регистрацию, работаем в демо режиме.


DM>P.S. Можно использовать и навесную защиту и комбинацию разных защит — все зависит от того, что программа делает.


Тяжелое детство было у советских шароварщиков. Возьмите любой популярный продует — нет там никакой привязки к железу!
Re[5]: Привязка программы к компьютеру
От: Disker  
Дата: 02.11.11 18:50
Оценка: 2 (1)
Здравствуйте, okman, Вы писали:

O>>>На моем компе в соответствующем ключе под Wow6432Node запись MachineGuid отсутствует.


Странно, сейчас откомпилировал Delphi-вариант (разумеется, результат 32-битный), он работает корректно в Windows 7 SP1 64-bit, и с привилегиями, и без них.
Больше того :) Проверил в Windows 8 Developer Preview 64-bit (правда, в виртуальной машине), там тоже всё работает.
Re[6]: Привязка программы к компьютеру
От: okman Беларусь https://searchinform.ru/
Дата: 02.11.11 21:48
Оценка:
Здравствуйте, Disker, Вы писали:

D>Странно, сейчас откомпилировал Delphi-вариант (разумеется, результат 32-битный), он работает корректно в Windows 7 SP1 64-bit, и с привилегиями, и без них.


Вот она — обратная сторона велосипедостроения в области защиты.
На одной машине работает, на другой — нет.
Re[7]: Привязка программы к компьютеру
От: byterus Россия  
Дата: 03.11.11 05:46
Оценка:
Здравствуйте, okman, Вы писали:

O>Вот она — обратная сторона велосипедостроения в области защиты.

O>На одной машине работает, на другой — нет.

Обратите внимание на это:
Reg := TRegistry.Create(KEY_READ OR $0100);
MySQL stored procedure debugging
Re: Привязка программы к компьютеру
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 03.11.11 05:56
Оценка:
Здравствуйте, LupakovO, Вы писали:

LO>Здравствуйте.


LO>Написал программу на Delphi. Хочу сделать привязку к конкретному компьютеру, подскажите, как лучше реализовать? К чему привязываться?

LO>Я вроде слышал 3 года назад, что теперь процессоры и материнские платы не содержат уникального ID. Это правда?
LO>Кто-то советует к жесткому диску, но вроде жесткие диски содержат движущиеся части и ломаются чаще. Поэтому прошу совета у специалистов.

Я вот так сделал, через WMI. Сначала дергаю серийник мамки, если не получилось (на моем компе и не получилось, выдает " " строку), то серийник процессора. А потом по этому считаю crc32.
Сейчас проверил — у нескольких пользователей действительно ключ одинаковый — надо наверно еще способ добавить.

Потом по номеру лицензии, hwid и прочей инфе генерю ключевой файл в xml, и отсылаю пользователю. Он его просто драг-энд-дропает в окошко ввода лицензии и все. Ну и в письме дублирую даннные, для ручного ввода.

inline
RCODE getHardwareId( ::std::string &serial )
   {
    ::std::string tmp;
    RCODE res = getWmiValueHelper( tmp, "Win32_BaseBoard", L"SerialNumber" );
    if (res) return res;
    ::marty::util::trim( tmp , ::marty::util::CIsSpace<char>() );
    if (!tmp.empty())
       {
        serial = crc32ToString( ::crctools::crc32( tmp ) );
        return EC_OK;
       }

    res = getWmiValueHelper( tmp, "Win32_Processor", L"ProcessorId" );
    if (res) return res;
    ::marty::util::trim( tmp , ::marty::util::CIsSpace<char>() );
    if (!tmp.empty())
       {
        serial = crc32ToString( ::crctools::crc32( tmp ) );
        return EC_OK;
       }

    serial = crc32ToString( ::crctools::crc32( ::std::string("1234567890") ) );
    return EC_OK;
    //EC_UNKNOWN
   }

inline
RCODE getWmiValueHelper( ::std::string &serial, const ::std::string &category, const ::std::wstring &valueName )
   {

    // Step 1: --------------------------------------------------
    // Initialize COM. ------------------------------------------

    //HRESULT hres =  CoInitializeEx(0, COINIT_MULTITHREADED); 
    HRESULT hres =  CoInitialize(0);
    if (FAILED(hres))
       {
        return HR2RC(hres);
       }

    // Step 2: --------------------------------------------------
    // Set general COM security levels --------------------------
    // Note: If you are using Windows 2000, you need to specify -
    // the default authentication credentials for a user by using
    // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
    // parameter of CoInitializeSecurity ------------------------

    hres =  CoInitializeSecurity(
        NULL, 
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
        NULL,                        // Authentication info
        0, // EOAC_NONE,                   // Additional capabilities 
        NULL                         // Reserved
        );

    if (FAILED(hres) && hres!=RPC_E_TOO_LATE)
       {
        CoUninitialize();
        return HR2RC(hres);
       }

    // Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------

    IWbemLocator *pLoc = NULL;

    hres = CoCreateInstance(
        CLSID_WbemLocator,             
        0, 
        CLSCTX_INPROC_SERVER, 
        IID_IWbemLocator, (LPVOID *) &pLoc);

    if (FAILED(hres))
       {
        CoUninitialize();
        return HR2RC(hres);
       }

    // Step 4: -----------------------------------------------------
    // Connect to WMI through the IWbemLocator::ConnectServer method

    IWbemServices *pSvc = NULL;
    
    // Connect to the root\cimv2 namespace with
    // the current user and obtain pointer pSvc
    // to make IWbemServices calls.
    hres = pLoc->ConnectServer(
         _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
         NULL,                    // User name. NULL = current user
         NULL,                    // User password. NULL = current
         0,                       // Locale. NULL indicates current
         NULL,                    // Security flags.
         0,                       // Authority (e.g. Kerberos)
         0,                       // Context object 
         &pSvc                    // pointer to IWbemServices proxy
         );

    if (FAILED(hres))
       {
        pLoc->Release();
        CoUninitialize();
        return HR2RC(hres);
       }

    // Step 5: --------------------------------------------------
    // Set security levels on the proxy -------------------------

    hres = CoSetProxyBlanket(
       pSvc,                        // Indicates the proxy to set
       RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
       RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
       NULL,                        // Server principal name 
       RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
       RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
       NULL,                        // client identity
       0 // EOAC_NONE                    // proxy capabilities 
    );

    if (FAILED(hres))
       {
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return HR2RC(hres);
       }

    // Step 6: --------------------------------------------------
    // Use the IWbemServices pointer to make requests of WMI ----

    // For example, get the name of the operating system
    IEnumWbemClassObject* pEnumerator = NULL;

    ::std::string selectQuery = ::std::string("SELECT * FROM ") + category;
    hres = pSvc->ExecQuery(
        bstr_t("WQL"), 
        bstr_t(selectQuery.c_str()), // Win32_Processor, Win32_BaseBoard
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
        NULL,
        &pEnumerator);

    if (FAILED(hres))
       {
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return HR2RC(hres);
       }

    // Step 7: -------------------------------------------------
    // Get the data from the query in step 6 -------------------
 
    IWbemClassObject *pclsObj;
    ULONG uReturn = 0;
   
    while (pEnumerator)
    {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, 
            &pclsObj, &uReturn);

        if(0 == uReturn)
        {
            break;
        }

        VARIANT vtProp;

        // Get the value of the SerialNumber property
        //hr = pclsObj->Get(L"ProcessorId", 0, &vtProp, 0, 0); // ProcessorId, SerialNumber
        hr = pclsObj->Get(valueName.c_str(), 0, &vtProp, 0, 0); // ProcessorId, SerialNumber
        
        //wcout << " OS Name : " << vtProp.bstrVal << endl;
        ::std::wstring serialW = vtProp.bstrVal;
        serial = MARTY_UTF::toUtf8(serialW);

        VariantClear(&vtProp);

        pclsObj->Release();
        pclsObj = 0;
    }

    // Cleanup
    // ========
    
    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
    if (pclsObj) pclsObj->Release();
    CoUninitialize();

    return EC_OK;

    // marty::winapi
    //getWinVer() // 0x0400;
    //isWinNt()
   }
Маньяк Робокряк колесит по городу
Re[4]: Привязка программы к компьютеру
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 03.11.11 06:07
Оценка:
Здравствуйте, CRT, Вы писали:

CRT>тогда возникает еще один вопрос. А если он через неделю еще раз попросит, а потом через неделю еще раз, потом еще раз. Что будешь делать?


Я над этой ситуацией размышлял, и пришел к выводу, что можно разрешить несколько регистраций (2-3) по одной покупке для разных HWID. Может он на дестоп и на ноут поставить хочет, или приятелю дать — пусть, я не жадный. Но файл активации все равно будет ему на емайл отсылаться, заданный при покупке — т.е. просто так раздавать ключик он не сможет, ему придется в этом участвовать каждый раз. Думаю, его задолбает быстро. Думаю также сделать страничку отмены регистрации с пересылкой подтверждения на его мыло — пусть сам отменяет регистрацию при смене железа. В принципе, отмену регистрации можно лимитировать, но это думаю не слишком актуально.
Маньяк Робокряк колесит по городу
Re[8]: Привязка программы к компьютеру
От: okman Беларусь https://searchinform.ru/
Дата: 03.11.11 09:10
Оценка:
Здравствуйте, byterus, Вы писали:

B>Обратите внимание на это:

B>Reg := TRegistry.Create(KEY_READ OR $0100);

Верно, был невнимателен.
Но MachineGuid все равно меняется после переустановки Windows, так что
привязкой к компьютеру это назвать нельзя.
Re[9]: Привязка программы к компьютеру
От: byterus Россия  
Дата: 03.11.11 09:21
Оценка:
Здравствуйте, okman, Вы писали:

O>Но MachineGuid все равно меняется после переустановки Windows, так что

O>привязкой к компьютеру это назвать нельзя.

Да, меняется, но мне кажется что для пользователя это более естественно чем изменение ID от воткнутой флешки.
А если процедура смены ID происходит без участия службы поддержки так это вообще не проблема.
MySQL stored procedure debugging
Re[3]: Привязка программы к компьютеру
От: Matrix_Failure http://matrixfailure.wordpress.com/
Дата: 03.11.11 10:59
Оценка:
Здравствуйте, okman, Вы писали:

O>У меня полно разнообразного софта, но ни один не привязывается к железу и не лезет ни на какие

O>серверы для всяких там своих проверок. И если бы каждая вторая прога при этом требовала перерегистрации, так ну в баню
O>такой софт — лучше найти альтернативные программы и не мучиться.

У меня вроде бы три программы привязаны к железу:
1. Windows
2. Delphi
3. Отечественный протектор

Больше всего волнуюсь за протектор — если перестанет работать сервер активации — не смогу его переустановить в случае переустановки винды.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.