Page 1 of 1

Защита DLL

Posted: Tue Dec 09, 2014 1:28 pm
by rktn
Добрый день, не могу понять нормально ли поведение защищенных функций в DLL, когда функция вызывается из одного потока getserailstate возвращает 0 т.е. все ок.
Как только эту функцию вызываю из нескольких потоков одновременно то второй и последующие getserailstate возвращают что лицензия не верна!
Подскажите на что обратить внимание при изучении данной проблемы, какие рекомендации! Или её решить не получится?

Re: Защита DLL

Posted: Tue Dec 09, 2014 4:56 pm
by Admin
Присылайте тестовый проект (EXE+оригинал DLL+MAP файлы), на котором воспроизводится эта проблема.

Re: Защита DLL

Posted: Mon Dec 22, 2014 3:34 pm
by rktn
исходники + защищенные EXE+DLL здесь(http://rusfolder.com/42596561)
пароль:2212

Re: Защита DLL

Posted: Mon Dec 22, 2014 7:13 pm
by Admin
Проблема заключается в том, что текущая реализация VMProtectSetSerialNumber не является потокобезопасной, поэтому вызов этого API нужно завернуть в общую критическую секцию, создаваемую в initialization DLL-ки. В версии 3.0 все API лицензирования будут потокобезопасными.

Re: Защита DLL

Posted: Mon Dec 22, 2014 9:25 pm
by rktn
3 версия приобретается отдельно?

Re: Защита DLL

Posted: Tue Dec 23, 2014 4:56 am
by Admin
Для зарегистрированных пользователей обновление будет доступно по годовой подписке.

Re: Защита DLL

Posted: Tue Dec 23, 2014 12:49 pm
by rktn
Критические секции сильно тормозят процесс. Получается что все вызовы API в том числе VMProtectGetSerialNumberState также необходимо заворачивать в критическую секцию, иначе не смог добиться стабильности!

Re: Защита DLL

Posted: Wed Dec 24, 2014 6:18 pm
by Admin
Если честно, то мне совершенно непонятен вот такой подход:

Code: Select all

function  DllFunc(li:PAnsiChar): Integer; stdcall;
begin
  Result := 0;
  with TDllClass.Create do
  begin
    try

      VMProtectSetSerialNumber(li);
      Result:=GetResult;

    finally
      Free;
    end;
  end;
end;
Зачем потоки постоянно дергают VMProtectSetSerialNumber если можно было бы сделать вызов VMProtectSetSerialNumber всего один раз (я бы вообще это сделал в initialization)?

Code: Select all

function  DllFunc(li:PAnsiChar): Integer; stdcall;
begin
  Result := 0;
  with TDllClass.Create do
  begin
    try

      Result:=GetResult;

    finally
      Free;
    end;
  end;
end;

initialization
// здесь читаем ключ из файла, имя EXE-ника можно получить через GetModuleFileName(0, ...)
VMProtectSetSerialNumber(lic)