Guardant API + Автозащита - Приложение закрывается по ошибке

Добрый вечер!

Столкнулся с такой проблемой:

Есть сервис защищенный автозащитой, в котором с периодичностью в 2 минуты опрашивается ключ используя Guardant API.
Спустя некоторое время, сервис завершает свою работу как раз в момент очередного опроса ключа.
Пытался варьировать время опроса в программе, время опроса автозашиты. Ничего не помогает.

Логика работы приложения:
в момент запуска сервиса выполняю
if (GrdStartup(GrdFMR_Local) <> GrdE_OK) then exit;

В теле процедуры периодического опроса ключа делаю следующее:

  try
    try
      dwPub :=  0;//ключи доступа
      dwPriv := 0;
      hnd := GrdCreateHandle(@abyGrd, GrdCHM_MultiThread, nil);
      if (hnd = nil) then exit;
      if (GrdSetFindMode(hnd, GrdFMR_Local, GrdFM_NProg, ProgNum, dwID, 0, 0, 0, 0, GrdFMM_ALL, GrdFMI_ALL)  <> GrdE_OK) then exit;
      nRet := GrdFind(hnd, GrdF_First, @dwID, @GrdFindInfo);
      if nRet <> GrdE_OK then exit;
      while (nRet = GrdE_OK) do begin
        idsLen := Length(id_list);
        SetLength(id_list, idsLen + 1);
        id_list[idsLen] := dwID;
        nRet := GrdFind(hnd, GrdF_Next, @dwID, @GrdFindInfo);
      end;
      if (nRet <> GrdE_AllDonglesFound) then exit;
      if (GrdSetAccessCodes(hnd, dwPub, dwPriv, 0, 0) <> GrdE_OK) then exit;
      for id in id_list do
      try
        if (GrdSetFindMode(hnd, GrdFMR_Local, GrdFM_ID, 0, id, 0, 0, 0, 0, GrdFMM_Sign, GrdFMI_USB) <> GrdE_OK) then exit;
        ZeroMemory(@buf, SizeOf(buf));
        if (GrdLogin(hnd, $FFFFFFFF, GrdLM_PerHandle) <> GrdE_OK) then exit;
        //блокировку ключа добавил с надеждой на решение проблемы
        if (GrdLock(hnd, 2000, 10000, GrdLM_All) <> GrdE_OK) then exit;
        if (GrdHashEx(hnd, 3, 32, @buf[0], GrdSC_All, 32, @buf[0], 0, nil, 32767, nil, nil) <> GrdE_OK) then exit;
        if (GrdPI_Read(hnd, 3, 0, 32, @ownerBuf[0], 0, nil) <> GrdE_OK) then exit;
        SetString(bs, ownerBuf, 32);
        bs := LowerCase(Trim(bs));
        tLen := Length(table);
        SetLength(table, tLen + 1);
        table[tLen].Owner := bs;
        for i := 4 to 15 do begin
          if (GrdHashEx(hnd, i, 32, @buf[0], GrdSC_All, 32, @buf[0], 0, nil, 32767, nil, nil) <> GrdE_OK) then
            continue;
          if (GrdPI_Read(hnd, i, 0, 32, @buf[0], 0, nil) = GrdE_OK) then begin
             // другой код...
          end;
        end;
        GrdUnlock(hnd);
        GrdLogout(hnd, GrdLM_PerHandle);
      except
        on E:Exception do begin
          WriteLog('Ошибка! При опросе ключа возникла ошибка: '+E.Message);
        end;
      end;
      Result := table;
    except
      on E:Exception do begin
        WriteLog('Ошибка! При опросе ключа возникла ошибка: '+E.Message);
      end;
    end;
  finally
    if (hnd <> nil) then
      GrdCloseHandle(hnd);
  end;

В журнале Windows никаких подробностей нет. Просто "Служба неожиданно завершена...".

Ключ программирую вручную из своей программы.
Программу защищаю с такими параметрами:
/V /PACK /CPA /IMPLICIT_LINKING_SUPPORT /ATR=2 /UN=0x2A /USB_DONGLE_CONTROL /Q /IMPORT_HOOK=10:2 /T=5 /RIP_CODE=10 /SILENT


Подскажите, как решить проблему?

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

Здравствуйте, eugene_sm.

Укажите, пожалуйста:

  1. На чем написан сервис?

  2. Guardant SDK какой версии использовался для защиты?

  3. Какой модели электронный ключ (приложите скриншот отчета утилиты диагностики для него (Пуск/Панель управления/Драйверы Guardant/кнопка "Диагностика"/кнопка "Полный отчет"))?

  4. Как давно воспроизводится указанное поведение и на скольких компьютерах?

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

Доброе утро!
1. Дельфи Rad Studio 2007
2. SDK 7.0.286.0
3. https://forum.guardant.ru/uploads/legacy/0/3000/3240/thumb/p1ar0d5odk12363771onm54qdjg1.png
Но дело точно не в ключе. Использовал различные ключи Sign, Time, Sign micro и разного времени выпуска.

4. Проблема появилась сразу после написания кода и воспроизводится на любых компьютерах, которые использовал для тестирования.

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

А сколько памяти выделяется для @abyGrd ?

(2016-08-25 13:47:30 отредактировано eugene_sm)

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

Антон Тихиенко пишет:

А сколько памяти выделяется для @abyGrd ?

переменная объявлена так
abyGrd: array[0..GrdContainerSize] of Byte;

далее просто передаю указатель на неё

И кстати, программа валится примерно каждые 30 минут.

краткий лог последнего крэша

25.08.2016 15:24:53    GrdCreateHandle
25.08.2016 15:24:53    GrdSetFindMode
25.08.2016 15:24:54    GrdSetAccessCodes
25.08.2016 15:24:54    0
25.08.2016 15:24:54    GrdSetFindMode
25.08.2016 15:24:54    0
25.08.2016 15:24:54    GrdLogin
25.08.2016 15:24:55    0
25.08.2016 15:24:55    GrdLock
25.08.2016 15:24:55    0
25.08.2016 15:24:55    GrdHashEx
и тут уже вылетело

Вылетает чаще всего на функции GrdHashEx, реже на GrdPI_Read, и крайне редко на GrdLogin

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

Посмотрите какое значение установлено в grddelphi.pas для GrdContainerSize. Если $3000 то его надо заменить на $4000.

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

Подтверждаю. Начал замечать не частые крэшы после начала экспериментов с GardantAPI при закрытии приложения. Платформа - та же. В API использованы GrdCheck, GrdRead, выполняются через рандомные промежутки времени. GrdContainerSize= $4000; Похоже на то, что где-то портится память.

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

Антон Тихиенко пишет:

Посмотрите какое значение установлено в grddelphi.pas для GrdContainerSize. Если $3000 то его надо заменить на $4000.

было $3000, поменял, понаблюдаю за поведением

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

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

Олег Третьяков пишет:

Подтверждаю. Начал замечать не частые крэшы после начала экспериментов с GardantAPI при закрытии приложения.

На вызове какой функции Guardant API и какая возвращается ошибка?

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

Антон Тихиенко пишет:

На вызове какой функции Guardant API и какая возвращается ошибка?

Я не говорил о существе неверного кода возврата(возвращаемой ошибке) при работе с конкретной функцией. Я подтвердил существо периодических access violation при использовании API. Пару раз я это поймал при закрытии своего приложения, запущенного из-под дебаггера. Дебаггер указал на AV из недр RTL, что естественно - фейк. Такие баги я ловил в самом начале становления моего проекта, по недосмотру. Что-то типа

type
TItem = record //элемент буфера FIFO
  value1: integer;
  value2: Word;
end;
pItem = ^TItem;
....
function MyList.Add....
var
vItem : pItem;
begin
........
   GetMem(vItem, SizeOf(pItem));//д.б. SizeOf(TItem), т.е. выделил память размером с указатель. 

.....
end;

Тесты могли крутиться часами, но в один прекрасный непредсказуемый момент - краш. В т.ч. из непредсказуемых мест.
Отсюда и предположение о порче памяти.

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

Замена константы не помогла, ситуация с вылетами не изменилась.

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

eugene_sm пишет:

Замена константы не помогла, ситуация с вылетами не изменилась.

Вообще странно, если все компоненты Guardant API использовались из состава SDK последней версии, то значение константы должно было быть уже $4000. Скорее всего API используется "староватое".

Соберите приложение с объектными и заголовочными файлами строго из состава Guardant SDK 7 Update 2 и, не выполняя автозащиту, потестируйте сервис.

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

Сообщите результаты.

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

Антон Тихиенко пишет:
eugene_sm пишет:

Замена константы не помогла, ситуация с вылетами не изменилась.

Вообще странно, если все компоненты Guardant API использовались из состава SDK последней версии, то значение константы должно было быть уже $4000. Скорее всего API используется "староватое".

Соберите приложение с объектными и заголовочными файлами строго из состава Guardant SDK 7 Update 2 и, не выполняя автозащиту, потестируйте сервис.

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

Сообщите результаты.

Добрый день!

Заголовочные файлы действительно были от 6 версии.
Вчера все поменял до последней версии.

Без автоматической защиты сервис выполнялся всю ночь и работает до сих пор без ошибок.
А вот с автозашитой проблемы повторяются. Программа вылетает через некоторое время.

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

eugene_sm пишет:

А вот с автозашитой проблемы повторяются. Программа вылетает через некоторое время.

Это уже куда понятнее.

Пришлите на наш e-mail ( hotline@guardant.ru ) любое тестовое приложение-сервис, не защищенное автозащитой, которое после защиты с указанными параметрами "падает".
Также приложите *.nsd-файл маски, которая прошита в электронных ключах, участвующих в тестировании.

Будем отлавливать ошибку.

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

Отправил на хотлайн тестовый пример с исходниками, маску и прочее.

Проблема на мой взгляд кроется в файле GrdVkc32.dll. Выяснил с помощью ProcessExplorer от SysInternals.

Прилагаемый пример стабильно зависает(иногда вылетает) ровно через минуту.
Если после зависания открыть в Process Explorer мой процесс и посмотреть текущие потоки, можно увидеть что большинство потоков заморожены. Если в определенной последовательности (заморозив потоки от GrdVkc32.dll) их размораживать можно добиться восстановления работоспособности приложения или же получить вылет программы.

Кстати, несколько лет назад я уже писал Вам по этому поводу. Тогда автозащита в момент вытаскивания ключа не блокировала все потоки приложения и через все тот же Process Explorer можно было продолжать пользоваться приложением неограниченное время. С тех пор это Вы исправили :)

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

eugene_sm пишет:

Отправил на хотлайн тестовый пример с исходниками, маску и прочее.

Проблему подтверждаем.
Передана на исправление в отдел разработки.

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

Антон Тихиенко пишет:
eugene_sm пишет:

Отправил на хотлайн тестовый пример с исходниками, маску и прочее.

Проблему подтверждаем.
Передана на исправление в отдел разработки.

Добрый день!

Когда примерно ждать исправления?

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

eugene_sm пишет:

Когда примерно ждать исправления?

Прошу прощения, в данном случае это все же не столько проблема сколько "фича".
Дело в том, что используемая в примере функция GrdHashEx на время работы с аппаратным алгоритмом блокирует электронный ключ и автозащита не может работать с ним.
В данном случае пользоваться можно, например, программной реализацией вычисления хеш-суммы.

(2016-09-05 16:57:35 отредактировано eugene_sm)

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

Антон Тихиенко пишет:
eugene_sm пишет:

Когда примерно ждать исправления?

Прошу прощения, в данном случае это все же не столько проблема сколько "фича".
Дело в том, что используемая в примере функция GrdHashEx на время работы с аппаратным алгоритмом блокирует электронный ключ и автозащита не может работать с ним.
В данном случае пользоваться можно, например, программной реализацией вычисления хеш-суммы.

Хм. Странная фича, больше похожая все же на баг ;)
Кстати, не менее странная "фича" возникает (правда не всегда, но очень часто) при одновременном запуске нескольких копий одного защищенного автозащитой приложения, типо невозможно получить доступ к ключу.

И еще, до сих пор можно у защищенного приложения заморозить потоки GRDVKC32.dll* и спокойно продолжать работать без ключа :)

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

Уважаемые разработчики! Как скоро можно ожидать решения проблемы? Работа стоит...

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

eugene_sm пишет:

Уважаемые разработчики! Как скоро можно ожидать решения проблемы? Работа стоит...

Прошу прощения за задержку с ответом.
Кардинальных изменений можно ждать только с выходом следующего релиза SDK, где будет реализована альтернативная утилита автоматической защиты с поддержкой x64 для native-приложений и возможностью защиты *.dll. Но это не раньше конца текущего года.
Защита большего числа импортируемых функций, а также извлечение большего количества инструкций (лучше это делать по списку, при помощи профайлера) выправят ситуацию в лучшую сторону.

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

Антон Тихиенко пишет:

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

Я правильно Вас понял, что мне это как-то поможет?

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

eugene_sm пишет:
Антон Тихиенко пишет:

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

Я правильно Вас понял, что мне это как-то поможет?

Да, лучше выбрать как можно больше тех функций и инструкции, которые часто используются в приложении, что приведет к необходимости чаще обращаться к ключу.

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

Антон Тихиенко пишет:
eugene_sm пишет:
Антон Тихиенко пишет:

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

Я правильно Вас понял, что мне это как-то поможет?

Да, лучше выбрать как можно больше тех функций и инструкции, которые часто используются в приложении, что приведет к необходимости чаще обращаться к ключу.


Тогда получается совсем странная ситуация. Программа вылетает из-за того, что возникают ситуации с одновременным доступом ключу методами API и автозащитой. Соответственно, чем чаще автозащита будет проверять ключ, тем еще чаще будет вылетать программа.

Re: Guardant API + Автозащита - Приложение закрывается по ошибке

eugene_sm пишет:

Тогда получается совсем странная ситуация. Программа вылетает из-за того, что возникают ситуации с одновременным доступом ключу методами API и автозащитой. Соответственно, чем чаще автозащита будет проверять ключ, тем еще чаще будет вылетать программа.

Для представленных примеров это также следствие слишком избыточного применения функции блокировки GrdLock, которая в основном нужна для обеспечения "безопасности" во время работы функций обновления памяти ключа, чтобы предотвратить в момент обновления обращения к ключу от любых других функций.

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