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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline satr  
#1 Оставлено : 17 октября 2014 г. 15:38:54(UTC)
satr

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

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

При попытке вызова функции CryptAcquireContextW() из динамически-загружаемой библиотеки в Linux (RedHat Linux Enterprise Server 6.5 64-bit) происходит аварийное завершение программы.

Цитата:

#include <stdio.h>
#include <dlfcn.h>

typedef int (*functype) (void*, void*, const void*, unsigned int, unsigned);

int main (int argc, char** argv)
{
void* module1 = dlopen("/opt/cprocsp/lib/amd64/libcapi10.so", RTLD_GLOBAL | RTLD_LAZY);
void* module2 = dlopen("/opt/cprocsp/lib/amd64/libcapi20.so", RTLD_GLOBAL | RTLD_LAZY);

printf("module1 = 0x%08x, module2 = 0x%08x\n", module1, module2);

void* func1 = dlsym(module1, "CryptAcquireContextW");
void* func2 = dlsym(module2, "CryptAcquireContextW");

printf ("func1 = 0x%08x, func2 = 0x%08x\n", func1, func2);

functype* f = (functype*)(func1 ? func1 : func2);

char prov[256];
void* container = 0;
const wchar_t* provider = L"Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider";
unsigned type = 75;
unsigned flags = 4026531840;

int ret = (*f)(&prov[0], container, provider, type, flags);
printf("ret = %d\n", ret);

return 0;
}



В частности, возникает ошибка сегментирования (segmentation fault). Вот вывод программы:

Цитата:

/usr/local/lib/64/libcurl.so: cannot open shared object file: No such file or directory
module1 = 0x01f5b040, module2 = 0x01f5d8f0
func1 = 0x00a46a80, func2 = 0x00a46a80
Segmentation fault (core dumped)


Программа компилируется так:
Цитата:

g++ -Wall -w -g3 -c -o test.o test.cpp
g++ -ldl -o test test.o


При запуске в отладчике:
Цитата:

[ruslan@cs-redhat6-satr ~]$ gdb ./test
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/ruslan/test...done.
(gdb) r
Starting program: /home/ruslan/test
[Thread debugging using libthread_db enabled]
support_dlopen() = 0x(nil) fail (1)
/usr/local/lib/64/libcurl.so: cannot open shared object file: No such file or directory
module1 = 0x00601040, module2 = 0x006038f0
func1 = 0xf7edea80, func2 = 0xf7edea80

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400759 in main (argc=1, argv=0x7fffffffe5e8) at test.cpp:26
26 int ret = (*f)(&prov[0], container, provider, type, flags);



Неразрешенные зависимости в загружаемых библиотеках не обнаружены
Цитата:

[ruslan@cs-redhat6-satr ~]$ ldd -r /opt/cprocsp/lib/amd64/libcapi10.so
linux-vdso.so.1 => (0x00007ffffabb3000)
librdrsup.so.3 => /opt/cprocsp/lib/amd64/librdrsup.so.3 (0x00007f86e5b3d000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f86e5939000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f86e571b000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f86e5415000)
libm.so.6 => /lib64/libm.so.6 (0x00007f86e5191000)
libc.so.6 => /lib64/libc.so.6 (0x00007f86e4dfc000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f86e4be6000)
/lib64/ld-linux-x86-64.so.2 (0x000000357f200000)
[ruslan@cs-redhat6-satr ~]$ ldd -r /opt/cprocsp/lib/amd64/libcapi20.so
linux-vdso.so.1 => (0x00007fffcb1ff000)
libcpext.so.3 => /opt/cprocsp/lib/amd64/libcpext.so.3 (0x00007f2d4b0ec000)
libcapi10.so.3 => /opt/cprocsp/lib/amd64/libcapi10.so.3 (0x00007f2d4afd8000)
libasn1data.so.3 => /opt/cprocsp/lib/amd64/libasn1data.so.3 (0x00007f2d4a892000)
librdrsup.so.3 => /opt/cprocsp/lib/amd64/librdrsup.so.3 (0x00007f2d4a77a000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f2d4a576000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2d4a358000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f2d4a052000)
libm.so.6 => /lib64/libm.so.6 (0x00007f2d49dce000)
libc.so.6 => /lib64/libc.so.6 (0x00007f2d49a39000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f2d49823000)
/lib64/ld-linux-x86-64.so.2 (0x000000357f200000)

Offline satr  
#2 Оставлено : 17 октября 2014 г. 16:20:47(UTC)
satr

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

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

Просьба перенести тему в ветку КриптоПро CSP 3.6.
Offline cross  
#3 Оставлено : 20 октября 2014 г. 11:11:47(UTC)
Анатолий Беляев

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

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
У вас в коде есть крайне вольные манипуляции с указателями, поэтому при попытке вызвать "функцию по указателю" => SEGFAULT.
typedef int (*functype) (unsigned long*, const wchar_t*, const wchar_t*, unsigned int, unsigned int );
...
void* func1 = dlsym(module1, "CryptAcquireContextW");
void* func2 = dlsym(module2, "CryptAcquireContextW");
...
functype f = (functype)(func1 ? func1 : func2);
...
unsigned long prov;
int ret = f(&prov, container, provider, type, flags);

Да и вообще код странный какой то.
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline satr  
#4 Оставлено : 22 октября 2014 г. 12:29:34(UTC)
satr

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

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

Да, в коде теста ошибка. Тема закрыта.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.