Добрый день, не могу понять нормально ли поведение защищенных функций в DLL, когда функция вызывается из одного потока getserailstate возвращает 0 т.е. все ок.
Как только эту функцию вызываю из нескольких потоков одновременно то второй и последующие getserailstate возвращают что лицензия не верна!
Подскажите на что обратить внимание при изучении данной проблемы, какие рекомендации! Или её решить не получится?
Защита DLL
Re: Защита DLL
Присылайте тестовый проект (EXE+оригинал DLL+MAP файлы), на котором воспроизводится эта проблема.
Re: Защита DLL
исходники + защищенные EXE+DLL здесь(http://rusfolder.com/42596561)
пароль:2212
пароль:2212
Re: Защита DLL
Проблема заключается в том, что текущая реализация VMProtectSetSerialNumber не является потокобезопасной, поэтому вызов этого API нужно завернуть в общую критическую секцию, создаваемую в initialization DLL-ки. В версии 3.0 все API лицензирования будут потокобезопасными.
Re: Защита DLL
Для зарегистрированных пользователей обновление будет доступно по годовой подписке.
Re: Защита DLL
Критические секции сильно тормозят процесс. Получается что все вызовы API в том числе VMProtectGetSerialNumberState также необходимо заворачивать в критическую секцию, иначе не смог добиться стабильности!
Re: Защита DLL
Если честно, то мне совершенно непонятен вот такой подход:
Зачем потоки постоянно дергают VMProtectSetSerialNumber если можно было бы сделать вызов VMProtectSetSerialNumber всего один раз (я бы вообще это сделал в initialization)?
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;
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)