Arhn - архитектура программирования

InitializeSecurityContext и Delphi

Я пытаюсь использовать аутентификацию SSPI для подключения к серверу Sql. Есть рабочий (надеюсь) пример C с FreeTds sspi.c, который использует InitializeSecurityContext.
Проблема в том, что он дважды вызывает InitializeSecurityContext. Сначала (tds_sspi_get_auth) вызывается функция, чтобы сделать авторизацию, чтобы поместить ее в пакет входа. Там имя участника службы (SPN), созданное как (используется проект JEDI JwaSspi)

FSPN := WideString(Format('MSSQLSvc/%s:%d', [FHostName, FPort]));

status := InitializeSecurityContext(@FCred, nil, PSecWChar(FSPN),
  ISC_REQ_CONFIDENTIALITY or ISC_REQ_REPLAY_DETECT or ISC_REQ_CONNECTION,
  0, SECURITY_NETWORK_DREP, nil, 0, @FCredCtx, @desc, attrs, @ts);

где FSPN: WideString;

Второй вызов (tds_sspi_handle_next) InitializeSecurityContext использует тот же FSPN и ответ от сервера.

status := InitializeSecurityContext(@FCred, @FCredCtx, PSecWChar(FSPN),
  ISC_REQ_CONFIDENTIALITY or ISC_REQ_REPLAY_DETECT or ISC_REQ_CONNECTION,
  0, SECURITY_NETWORK_DREP, @in_desc,   0, @FCredCtx, @out_desc, attrs, @ts);

Теперь сложная часть: на C SPN, созданном с asprintf, после первого вызова InitializeSecurityContext оно изменилось (было $4D $00 $53 $00 $53 $00 ... , после $08 $04 $01 $00 $4E ...) и, я думаю, заменено на Digest или подобное. При таком использовании у меня есть нарушение прав доступа где-то в oleaut32.dll.

11.11.2015

  • У меня есть это. Проблема заключается в том, что InitializeSecurityContext изменяет память вокруг FSPN (я предполагаю, что управление памятью в стиле C), поэтому у меня есть или нарушения доступа или поврежденный заголовок памяти с FastMM4, если я использую AllocMem и FSPN в качестве указателя вместо WideString. 11.11.2015
  • Ах хорошо, теперь я понял. Удаление комментариев. В любом случае, можете ли вы предоставить полный пример, чтобы мы могли его проверить? 11.11.2015
  • Обновление: это только 64-битная ошибка, она работает правильно под 32-битной (значение FSPN и указатель остаются прежними после InitializeSecurityContext, под 64-битной FSPN изменились, например, с $ 2A65E0 до $ 217B940). Пробовал даже HeapAlloc. 12.11.2015

Ответы:


1

Это ошибка "Проекта JEDI". SecHandle объявлен как

  _SecHandle = record
    dwLower: ULONG_PTR;
    dwUpper: ULONG_PTR;
  end;

куда

  INT_PTR = Integer;
  {$EXTERNALSYM INT_PTR}
  PINT_PTR = ^INT_PTR;
  {$EXTERNALSYM PINT_PTR}
  UINT_PTR = Longword;
  {$EXTERNALSYM UINT_PTR}
  PUINT_PTR = ^UINT_PTR;
  {$EXTERNALSYM PUINT_PTR}
  LONG_PTR = Longint;
  {$EXTERNALSYM LONG_PTR}
  PLONG_PTR = ^LONG_PTR;
  {$EXTERNALSYM PLONG_PTR}
  ULONG_PTR = Longword;
  {$EXTERNALSYM ULONG_PTR}
  PULONG_PTR = ^ULONG_PTR;
  {$EXTERNALSYM PULONG_PTR}

от Microsoft ULONG_PTR

typedef unsigned __int3264 ULONG_PTR;

а также

2.2.1 __int3264

Псевдоним, который разрешается либо в: __int32 в 32-разрядной среде преобразования и выполнения, либо в __int64 в 64-разрядной среде преобразования и выполнения. Для обратной совместимости он 32-битный на проводе. Старшие 4 байта ДОЛЖНЫ быть усечены на стороне отправителя во время маршалинга и ДОЛЖНЫ быть соответствующим образом расширены (со знаком или без знака), как указано в разделе 14.2.5 [C706], на принимающей стороне во время демаршалинга.

Итак, когда я объявил в своем классе

  private
    FCred: CredHandle;
    FCredCtx: CtxtHandle;
    FSPN: WideString;

InitializeSecurityContext с 64-битным исполняемым файлом разбил мои переменные класса, записав большую структуру в FCredCtx, разрушив FSPN. Исправлена ​​проблема с использованием NativeInt или NativeUInt вместо Integer/Longword и т. д.

12.11.2015
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..