• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Lotusscript + Dll + Unicode Pointer

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
В общем необходимо вызвать функцию из виндовых библиотек
и вот не вьежаю как правильно её задекларить
Функция требует чтобы переменные были типа LPCWSTR
Читаю описание LPCWSTR
An LPCWSTR is a 32-bit pointer to a constant string of 16-bit Unicode characters, which MAY be null-terminated.
This type is declared as follows:
typedef const wchar_t* LPCWSTR;


но из всех возможных удаётся в декларе только variant
Declare Function CryptUIDlgSelectCertificateFromStore Lib "Cryptui" (Byval hCertStore As Long, Byval hwnd As Long, Byval pwszTitle As Variant...

вызываю просто:
Call CryptUIDlgSelectCertificateFromStore(hStore, 0, "Выбор"...

попытка передать массив байт, задекларить иначе, другими переменніми - или валит лотус или тайпмисмач

Собственно от Variant хотелось бы уйти и понять что именно ему передать?
 
N

nvyush

Byval pwszTitle As LMBCS String ?
Можно также глянуть в справке дизайнера разделы "Passing strings", "Declare statement (external C calls)".

Также возможны варианты:
Byval pwszTitle As Unicode String
Byval pwszTitle As Any
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
Byval pwszTitle As Unicode String
точно, спасибо, помогло :crash:

Добавлено: теперь следующий пример, более суровый
size := 0;
CertGetCertificateContextProperty(hCert, CERT_KEY_PROV_INFO_PROP_ID, nil, @size);
if size<>0 then begin
pKeyInfo := AllocMem(size);
CertGetCertificateContextProperty(hCert, CERT_KEY_PROV_INFO_PROP_ID, pKeyInfo, @size);
{ Set provider parameters }
ProviderName := pKeyInfo.pwszProvName;
ProviderType := pKeyInfo.dwProvType;
KeyName := pKeyInfo.pwszContainerName;
KeySpec := pKeyInfo.dwKeySpec;
end;
суть момента в том что pKeyInfo это своего рода плавающая структура(её длина из-за наличия внутри стрингов разная)
описание MSDN
BOOL WINAPI CertGetCertificateContextProperty(
__in PCCERT_CONTEXT pCertContext,
__in DWORD dwPropId,
__out void *pvData,
__inout DWORD *pcbData
);

нормально удалось её задекларить лишь так
Declare Function CertGetCertificateContextProperty Lib "Crypt32" (Byval pCertContext As Long, Byval dwPropId As Long, Byval pvData As String, pcbData As Long) As Long
первый раз она возвращает длинну сертификата, второй раз ей предварительно передаётся обьект с нужной длинной, потом обьект как видим дер*цензура*ится
чтобы лотус не упал первый и второй раз, приходится передавать стринг
как-то можно потом не по символьно раздер*цензура*ить стринг на обьект?

ума не приложу как описать такой тип и еще и ресайзить его в лотусе
 
N

nvyush

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

Судя по описанию функции CertGetCertificateContextProperty ( ) то, что она возвращает в буфере, зависит от параметра dwPropId. Можно попробовать реализовать требуемые структуры данных на LS и передавать в качестве буфера переменные соответствующего типа, а функцию задекларировать так:
Declare Function CertGetCertificateContextProperty Lib "Crypt32" (Byval pCertContext As Long, Byval dwPropId As Long, pvData As Any, pcbData As Long) As Long
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
а зачем понадобилось криптоапи виндей?... пароли прятать хотите? :crash:
дык по темже усером - оно полюбасу будет доступно
этож не keyring - как в нормальных системах, а очередной МС костыль (на почве SSO)
 
T

TIA

ума не приложу как описать такой тип и еще и ресайзить его в лотусе
В таких случаях делаю разные декларации и один альяс. Что-то вроде:

Declare Function CertGetCertificateContextProperty1 Lib "Crypt32" Alias "CertGetCertificateContextProperty" (..., pvData As MyType1, ...) As Long
Declare Function CertGetCertificateContextProperty2 Lib "Crypt32" Alias "CertGetCertificateContextProperty" (..., pvData As MyType2, ...) As Long
Declare Function CertGetCertificateContextProperty3 Lib "Crypt32" Alias "CertGetCertificateContextProperty" (..., ByVal pvData As MyType3, ...) As Long
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
Это штатное использование такого рода функций ]]>http://msdn.microsoft.com/en-us/library/aa...v=vs.85%29.aspx]]>
Нужно также иметь ввиду, что при втором вызове также возвращается истинный размер данных, помещённых в буфер, он может быть меньше размера буфера.
так вот и я про это как бы я не обьявлял свои тип такую фичу как в Сях - pKeyInfo := AllocMem(size); я в лотусе сделать не могу - а НАДО
так как в следующий момент этот тип становится на 50 байт больше/меньше

а зачем понадобилось криптоапи виндей?... пароли прятать хотите?
не, как раз таки всё проще, большинство локальных сертифицированных криптопровайдеров начали использовать этот интерфейс - там можно назначать какой криптопровайдер юзать и всё становится напорядок проще а не затачиваться постоянно под индивидуала :crash:
 
N

nvyush

так вот и я про это как бы я не обьявлял свои тип такую фичу как в Сях - pKeyInfo := AllocMem(size); я в лотусе сделать не могу - а НАДО
так как в следующий момент этот тип становится на 50 байт больше/меньше
Больше не должно. Иначе может лечь не только Лотус, но и система. А вместо pKeyInfo := AllocMem(size) обычно используется
pKeyInfo = String$(size, Chr$(0)). Если возвращаемая структура содержит только одно строковое поле и оно последнее, его размер легко вычислить, зная размеры остальных полей фиксированного размера, и тогда в качестве буфера в вызов функции можно подставлять переменную соответствующего типа. В противном случае остаётся только парсить строку.
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
А вместо pKeyInfo := AllocMem(size) обычно используется
pKeyInfo = String$(size, Chr$(0)).
именно так и сделал

Если возвращаемая структура содержит только одно строковое поле и оно последнее, его размер легко вычислить
правду говоришь, но тут как раз всё плохо так как два стринга 1я и 3я переменная...
 
N

nvyush

Можно поискать парсеры ASN.1. Кой-чего можно почитать тут:
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!