VMProtectGetCurrentHWID

Доброй ночи.

Пару вопросов.

  1. Собственно к чему будет идти привязка ? Насколько я понимаю, вызвав VMProtectGetCurrentHWID на одной машине сейчас, через месяц, год…я должен получить одно и тоже значение. И…насколько я понимаю идет привязка к сер.номерам моей периферии. Т.е. заменив что-то в моем ПК я получу уже другое значение в VMProtectGetCurrentHWID ?

  2. Каков максимальный размер этого идентификатора ?

  3. И, собственно, как его получать ? Примеры только на Сях (
    Я попытался получить на Delphi. Получилось, при условии изменения заголовочного файла VMProtectSDK.pas Но полученное значение меня смутило. Что это ? Я получаю &E

Код :

[b]function VMProtectGetCurrentHWID(Buffer:PChar; BufferLen: Cardinal): Integer; stdcall;[/b]
...


procedure TForm1.Button1Click(Sender: TObject);
  var pBuf:PChar;
  nSize:Integer;
begin
  nSize:=VMProtectGetCurrentHWID(nil,0);
  GetMem(pBuf,nSize);
  try
    VMProtectGetCurrentHWID(pBuf,0);
    Memo1.Lines.Add(pBuf);
  finally
    FreeMem(pBuf);
  end;
end;

Собственно к чему будет идти привязка ? Насколько я понимаю, вызвав VMProtectGetCurrentHWID на одной машине сейчас, через месяц, год…я должен получить одно и тоже значение. И…насколько я понимаю идет привязка к сер.номерам моей периферии. Т.е. заменив что-то в моем ПК я получу уже другое значение в VMProtectGetCurrentHWID ?

И еще одно уточнение. Предположим у меня будет 3 и более ПК с одинаковым железом. Правильно ли я понимаю, что вызвав сабж(VMProtectGetCurrentHWID) я получу разные значения для всех своих ПК ?

Собственно к чему будет идти привязка ?

В текущей версии привязка идет к CPU+MAC+имя компьютера. В версии 2.02 будет добавлен HDD.

Т.е. заменив что-то в моем ПК я получу уже другое значение в VMProtectGetCurrentHWID ?

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

Каков максимальный размер этого идентификатора ?

В бинарном виде это 4 DWORD-а, т.е. после преобразования HWID в base64 получится порядка 20-ти символов.

И, собственно, как его получать ? Примеры только на Сях (
Я попытался получить на Delphi.

Если вы используете Delphi2009 и выше - вместо PChar надо использовать PAnsiChar (как в VMProtectSDK.pas, так и в определении pBuf):

function VMProtectGetCurrentHWID(Buffer:PAnsiChar; BufferLen: Cardinal): Integer; stdcall;
...
var pBuf:PAnsiChar; 
...

Все остальное правильно.

И еще одно уточнение. Предположим у меня будет 3 и более ПК с одинаковым железом. Правильно ли я понимаю, что вызвав сабж(VMProtectGetCurrentHWID) я получу разные значения для всех своих ПК ?

Если все 3 ПК имеют абсолютно одинаковое железо (CPU+MAC+HDD+имя компьютера), то на всех этих компьютерах будет одинаковый HWID.

В текущей версии привязка идет к CPU+MAC+имя компьютера. В версии 2.02 будет добавлен HDD.



Если все 3 ПК имеют абсолютно одинаковое железо (CPU+MAC+HDD+имя компьютера), то на всех этих компьютерах будет одинаковый HWID.

ИМХО, это не правильно. Особенно с MAC+имя компьютера. При таких условиях нужно будет каждый месяц генерить новый пароль.
Ну что ж…спасибо и на этом.

ИМХО, это не правильно. Особенно с MAC+имя компьютера. При таких условиях нужно будет каждый месяц генерить новый пароль.
Ну что ж…спасибо и на этом.

Почему вы считаете что пользователь раз месяц меняет или имя компьютера или MAC у своей сетевой карты?

Почему вы считаете что пользователь раз месяц меняет или имя компьютера или MAC у своей сетевой карты?

Да потому, что так и есть. Естественно, 95% пользователей этого не делает, но что делать с 5% ?

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

А Вы предлагаете имя пользователя + мак )) Нет уж, спасибо ))

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

P.S. Для “надежной” привязки программы к железу (если уж очень хочется) я могу предложить вариант с использованием электронного ключа типа SenseLock. Тогда у пользователя не возникнет никаких проблем даже при замене компьютера целиком.

Для “надежной” привязки программы к железу (если уж очень хочется) я могу предложить вариант с использованием электронного ключа типа SenseLock. Тогда у пользователя не возникнет никаких проблем даже при замене компьютера целиком.

Да я в курсе…читал.
Минусы :

  • Мои клиенты удалены от меня. Я им буду высылать ключ до месяца;
  • Насколько я осведомлен, то работать с ключами прийдется в Сях(а я хочу в Delphi);
  • Вся эта затея с идентификаторами используется для моих партнеров. А они в свою очередь получают все и бесплатно. Тут я “попаду” крупно, если буду раздавать эл.ключи бесплатно )) Хотя…в принципе, этот пункт можно отбросить.
  • Насколько я осведомлен, то работать с ключами прийдется в Сях(а я хочу в Delphi);

Для работы с теме же SenseLock есть SDK на Delphi (http://www.senselock.ru/support.php)

  • Мои клиенты удалены от меня. Я им буду высылать ключ до месяца;

Если вы распространяете программу через партнеров - можно им высылать сразу готовую партию ключей, а конечной доставкой до пользователя уже будут заниматься они.

  • Вся эта затея с идентификаторами используется для моих партнеров. А они в свою очередь получают все и бесплатно. Тут я “попаду” крупно, если буду раздавать эл.ключи бесплатно )) Хотя…в принципе, этот пункт можно отбросить.

Тут конечно решать вам - если вы продаете программу за 50$, то стоимость самого ключа будет составлять существенную долю от стоимости программы. Ну если программа стоит от 1000$ и выше - то 20-ку можно и “подарить” конечному пользователю :slight_smile:)

Привязка к маку - это вообще отдельная тема. При включении, например, WiFi на ноуте, мак сменится. Я с этим нагемороился уже, так что никому не советую :slight_smile:. Процессор, кстати, берётся какой? Первый, все сразу (не какой попадётся же)?

Это все учитывается - в HWID записываются MAC адреса всех сетевых устройств и при проверке HWID ищется совпадение хотя бы одного MAC из списка.

Информация о процессоре получается через CPUID.

Понятное дело :slight_smile:
Но в многопроцессорных системах процессоры могут иметь, например, разные Stepping, разные серийные номера и т.п. (не знаю, что вы используете). И какой процессор попадётся в при выполнении CPUID (если не делать SetProcessAffinityMask) - неизвестно. Соответственно, 2 запуска программы могут выдать разные результаты.

Вообще, было бы хорошо, если бы сабжевой функции передавались параметры (в виде бит-маски, например) - привязку к какому железу делать:

  • к процессору
  • к биосу
  • к видеокарте
  • к винту
  • к маку
  • к имени компьютера или юзеру (sid’у)

Но в многопроцессорных системах процессоры могут иметь, например, разные Stepping, разные серийные номера и т.п. (не знаю, что вы используете). И какой процессор попадётся в при выполнении CPUID (если не делать SetProcessAffinityMask) - неизвестно. Соответственно, 2 запуска программы могут выдать разные результаты.

Мы учтем это в следующих версиях VMProtect.

Вообще, было бы хорошо, если бы сабжевой функции передавались параметры (в виде бит-маски, например) - привязку к какому железу делать:

  • к процессору
  • к биосу
  • к видеокарте
  • к винту
  • к маку
  • к имени компьютера или юзеру (sid’у)

Если вы максимально сузите количество собираемой информации о железе, тем выше вероятность что выданный ранее серийник не будет работать при смене тогоже HDD или материнской платы. В настоящее время в VMProtect разработан более универсальный метод, который позволяет частично менять “железо” и при этом сохранять валидность ранее выданных серийников. С вашим же подходом вы добъетесь совершенно противоположного эффекта. Вам это действительно нужно? :slight_smile:)

Есть разная привязка.
Например, привязка к железке, на которой хранится файл (к флешке или HDD) - это одно. Привязка к процессору, биосу, видеокарте и маку - это другое (причём обязательны здесь, ИМХО, только первые 2 пункта). Привязка к Windows (sid’у или имени компьютера) нужна тоже не всегда, т.к. создаёт лишний гемор при переустановке винды - это третье (но сюда не мешает включить cpu,bios,etc).

Это все учитывается - в HWID записываются MAC адреса всех сетевых устройств и при проверке HWID ищется совпадение хотя бы одного MAC из списка.

Кстати, я не совсем понимаю, как это работает. Ведь VMProtectGetCurrentHWID возвращает одно значение. Где же проверка?

Например, привязка к железке, на которой хранится файл (к флешке или HDD) - это одно.

Согласен, что это уже совсем другой тип привязки.

Привязка к процессору, биосу, видеокарте и маку - это другое (причём обязательны здесь, ИМХО, только первые 2 пункта).

Сейчас как раз так и сделано.

Кстати, я не совсем понимаю, как это работает. Ведь VMProtectGetCurrentHWID возвращает одно значение. Где же проверка?

VMProtectGetCurrentHWID возвращает список хешей идентификаторов оборудования в base64. При проверке серийника система лицензирования сверяет между собой 2 списка оборудования (один список это текущий HWID и второй - это HWID из серийника). Допускается замена некоторых “устройств” из общего списка.

не все, размер буфера у него равен 0, а должен быть nSize.
вот так правильно:

[b]function VMProtectGetCurrentHWID(Buffer:PAnsiChar; BufferLen: Cardinal): Integer; stdcall;[/b]
...
procedure TForm1.Button1Click(Sender: TObject);
  var pBuf:PAnsiChar;
  nSize:Integer;
begin
  nSize:=VMProtectGetCurrentHWID(nil,0);
  GetMem(pBuf,nSize);
  try
    VMProtectGetCurrentHWID(pBuf,nSize); //<<<<<<<<
    Memo1.Lines.Add(pBuf);
  finally
    FreeMem(pBuf);
  end;
end;

сорри что поднял старую тему :slight_smile:

не все, размер буфера у него равен 0, а должен быть nSize.

Просмотрел :slight_smile:)