Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline DmitryB  
#1 Оставлено : 25 февраля 2016 г. 19:37:31(UTC)
DmitryB

Статус: Новичок

Группы: Участники
Зарегистрирован: 24.02.2016(UTC)
Сообщений: 9
Российская Федерация
Откуда: Санк-Петербург

Сказал(а) «Спасибо»: 1 раз
Функция.

DWORD CPCAPI CPCGetDefaultConfig(
LPCPC_CONFIG pConfig,
LPVOID pvReserved
);

По описанию.

Член CPC_CONFIG_
LPCPC_MEMORY_ARENA pArena

Описание
Не изменяется. Должен быть задан пользователем _до_ или _после_ вызова данной функции. Можно использовать простой менеджер памяти, предоставляемый функцией CPCInitMemoryLF.
.....

Фактически.
OS Windows 7 x64 EE. Если заполнить pArena перед вызовом функции, то верхняя часть указателя (4 байта из 8) будет обнулена. Дальнейший вызов CPCCreateProvider с передачей pConfig в параметре приводил к BSOD в cpdrvlib.sys из-за ошибки обращения по испорченному указателю pConfig->pArena->какой_то_элемент_структуры.

Workaround.
Инициализировать pConfig->pArena после вызова CPCGetDefaultConfig.

Offline DmitryB  
#2 Оставлено : 25 февраля 2016 г. 20:05:58(UTC)
DmitryB

Статус: Новичок

Группы: Участники
Зарегистрирован: 24.02.2016(UTC)
Сообщений: 9
Российская Федерация
Откуда: Санк-Петербург

Сказал(а) «Спасибо»: 1 раз
И еще вопрос по этой же функции.

В описании функции:
pConfig
[in, out] Указатель на созданную пользователем структуру CPC_CONFIG_. В этой структуре _обязательно_ должен быть задан член cbSize, остальные члены в результате выполнения функции _будут_заполнены_ значениями по умолчанию...

Есть 2 виртуальные машины VMWare 11 с Windows 7 x64 EE, на обоих установлен CryptoPro 4.0.9461 с драйвером режима ядра, триальная версия, срок лицензии еще не истек. Один и тот же драйвер пытается выполнить этот код:


Цитата:

typedef struct _prov_param
{
PFILE_OBJECT CPFile;
IO_STATUS_BLOCK IoStatusBlock;
CPCCreateProvider_t *CreateProvider;
CPCInitMemoryLF_t *InitMemoryLF;
CPCGetDefaultConfig_t *GetDefaultConfig;

} prov_param;

static prov_param param;

NTSTATUS csp_prov_init ()
{
........

CPC_CONFIG *CSPConfig = NULL;

........

NtStatus
= GetFuncAddress( CPDevice,
IOCTL_GETCPCGETDEFAULTCONFIG,
&param.GetDefaultConfig,
&param.IoStatusBlock );
........

// память под MemoryArena выделялась и через lfmm, и как предложено в этом треде
// http://www.cryptopro.ru/....aspx?g=posts&t=7036
kspInitMemory(&MemoryArena,NULL,0);

CSPConfig = ExAllocatePool(NonPagedPool,sizeof(CPC_CONFIG));

CSPConfig->cbSize = sizeof(CPC_CONFIG);

res = param.GetDefaultConfig(CSPConfig, NULL);



На одной машине все ОК. На другой – ошибка 0x80070057 (E_INVALIDARG). В обоих случаях естественно CSPConfig->cbSize=0x288.
Почему это может происходить (не так должно быть много мест с «return E_INVALIDARG;» в функции)?
Можно ли получить более детальную информацию где-то в логах, какой параметр, что это значит?
Однако параметр всего один и инициализировать его неправильно практически невозможно.

Отредактировано пользователем 25 февраля 2016 г. 20:07:26(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#3 Оставлено : 25 февраля 2016 г. 21:34:26(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,395
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 718 раз в 622 постах
Спасибо за информацию.
SDK используется от той же версии CSP?
Мы стараемся обеспечивать совместимость со старыми версиями, но возможны нюансы.

Отредактировано пользователем 25 февраля 2016 г. 22:32:48(UTC)  | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке
Offline Максим Коллегин  
#4 Оставлено : 25 февраля 2016 г. 21:52:07(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,395
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 718 раз в 622 постах
Хотя размер в наших модулях ядра тоже 0x288.
Нашел обнуление младшего DWORDа pArena. Исправим.
По второму вопросу:
Вот код, возвращающий ошибку.
Код:

DWORD CPCAPI CPCGetDefaultConfig(LPCPC_CONFIG pConfig, LPVOID pvReserved)
{
    if (pConfig->cbSize < sizeof(CPC_CONFIG) || pConfig->cbSize >= 0x4000 ||
	pvReserved != NULL)
	return (DWORD)E_INVALIDARG;

Больше упоминаний E_INVALIDARG в этой функции нет.

Отредактировано пользователем 25 февраля 2016 г. 22:37:16(UTC)  | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке
Offline DmitryB  
#5 Оставлено : 26 февраля 2016 г. 14:44:58(UTC)
DmitryB

Статус: Новичок

Группы: Участники
Зарегистрирован: 24.02.2016(UTC)
Сообщений: 9
Российская Федерация
Откуда: Санк-Петербург

Сказал(а) «Спасибо»: 1 раз
Однако, я вижу код

Код:

fffff880`01401424 4053            push    rbx
fffff880`01401426 4883ec20        sub     rsp,20h
fffff880`0140142a 813908030000    cmp     dword ptr [rcx],308h ds:002b:fffffa80`04c8c190=00000288
fffff880`01401430 488bd9          mov     rbx,rcx
fffff880`01401433 0f8247010000    jb      cpdrvlib+0x1580 (fffff880`01401580)
fffff880`01401439 813900400000    cmp     dword ptr [rcx],4000h
fffff880`0140143f 0f833b010000    jae     cpdrvlib+0x1580 (fffff880`01401580)
fffff880`01401445 4885d2          test    rdx,rdx
fffff880`01401448 0f8532010000    jne     cpdrvlib+0x1580 (fffff880`01401580)
fffff880`0140144e 448b01          mov     r8d,dword ptr [rcx]
fffff880`01401451 4883c10c        add     rcx,0Ch
fffff880`01401455 4983e80c        sub     r8,0Ch


Сравнивается 0x288<0x308 в 3-й инструкции и идет на выход. Изменилась структура CPC_CONFIG, добавились поля? А на другой машине стоит другой драйвер?
У нас используется заголовочник <wincspc.h> c определением CPC_CONFIG со следующим заголовком

Код:

/*
 * Copyright(C) 2000-2006 Проект ИОК
 *
 * Этот файл содержит информацию, являющуюся
 * собственностью компании Крипто Про.
 *
 * Любая часть этого файла не может быть скопирована,
 * исправлена, переведена на другие языки,
 * локализована или модифицирована любым способом,
 * откомпилирована, передана по сети с или на
 * любую компьютерную систему без предварительного
 * заключения соглашения с компанией Крипто Про.
 */

/*!
 * \file $RCSfile: wincspc.h,v $
 * \version $Revision: 1.50.2.5 $
 * \date $Date: 2009/04/18 16:25:55 $
 * \author $Author: lse $
 *
 * \brief XXX
 *
 * XXX
 */


И структура описана как

Код:

struct CPC_CONFIG_ {
  DWORD	cbSize;
  LPCPC_MEMORY_ARENA pArena;
  CPC_FAST_CODE	FuncStruct;
  CPC_LOG_CONFIG logConfig;
  CPC_HARDWARE_RNG hardwareRNG;
  CPC_INTERLOCKED_FUNCS interlockedFuncs;
  CPC_LOCK_FUNCS lockFuncs;
  CPC_TIME_FUNCS timeFuncs;
  CPC_ALG_PARAMS algParams;
  DWORD MaxHandles;
  DWORD dwTesterPeriod;
  DWORD dwTesterTimeout;
  BOOL fNonSMP;
  const TCHAR *license;
};


Как костыль, я могу вместо sizeof(CPC_CONFIG) вбить 0x308, но это жутко не красиво, и хотелось бы разобраться.
Offline Максим Коллегин  
#6 Оставлено : 26 февраля 2016 г. 15:13:11(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,395
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 718 раз в 622 постах
Прикрепите драйвер, из которого этот код.
В самых первых версиях 4.0 проблема могла быть.
Знания в базе знаний, поддержка в техподдержке
Offline DmitryB  
#7 Оставлено : 26 февраля 2016 г. 15:29:10(UTC)
DmitryB

Статус: Новичок

Группы: Участники
Зарегистрирован: 24.02.2016(UTC)
Сообщений: 9
Российская Федерация
Откуда: Санк-Петербург

Сказал(а) «Спасибо»: 1 раз
cpdrvlib.zip (204kb) загружен 2 раз(а).
Offline Максим Коллегин  
#8 Оставлено : 26 февраля 2016 г. 15:39:34(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,395
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 718 раз в 622 постах
Неудачно получилось, как раз в этом релизе была исправленна ошибка с несовместимостью CPC_CONFIG. Используйте более свежую версию CSP.
Знания в базе знаний, поддержка в техподдержке
Offline DmitryB  
#9 Оставлено : 26 февраля 2016 г. 15:39:36(UTC)
DmitryB

Статус: Новичок

Группы: Участники
Зарегистрирован: 24.02.2016(UTC)
Сообщений: 9
Российская Федерация
Откуда: Санк-Петербург

Сказал(а) «Спасибо»: 1 раз
Извиняюсь, версии разные. На проблемной машине 4.0.9106, где все OK - 4.0.9461.
Offline DmitryB  
#10 Оставлено : 26 февраля 2016 г. 15:43:28(UTC)
DmitryB

Статус: Новичок

Группы: Участники
Зарегистрирован: 24.02.2016(UTC)
Сообщений: 9
Российская Федерация
Откуда: Санк-Петербург

Сказал(а) «Спасибо»: 1 раз
Спасибо! Поставлю костыль cbSize = MAX(sizeof(CPC_CONFIG),0x308); чтобы техподдержке пользователям не объяснять про версии. В той версии что-то не может еще из-за этого вылезти?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.