Визуальная ссылка C ++ Странность с bcrypt.dllC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Визуальная ссылка C ++ Странность с bcrypt.dll

Сообщение Anonymous »

В Windows 11 библиотека BCrypt содержит криптографические функции Microsoft. Я заметил уникальное поведение линкера при связи с Bcrypt.dll , и я был бы признателен за мнение специалистов. Такое поведение уникально для bcrypt.dll . Я не видел этого ни с какой другой библиотекой. Обратите внимание, что предполагаемой статической библиотеки не существует, и основная причина, очевидно, отличается. На практике все символы от bcrypt.dll имеют одинаковое поведение.
Каждый символ сначала используется в качестве прямой ссылки в коде. Его адрес отображается с именем модуля по этому адресу. Затем символ явно загружается в виде строки из ожидаемого DLL, и отображается возвращенный адрес. < /P>
Режим выпуска: < /p>
BCryptEncrypt at 7ff82d9fb200, linked from C:\WINDOWS\SYSTEM32\bcrypt.dll
BCryptEncrypt at 7ff82d9fb200, loaded from bcrypt.dll
CertOpenStore at 7ff82ddec5f0, linked from C:\WINDOWS\System32\CRYPT32.dll
CertOpenStore at 7ff82ddec5f0, loaded from crypt32.dll
< /code>
в режиме выпуска, для двух символов, тот, который был связан из исходного кода, и тот, который был явно загружен как строка из DLL, идентичны. < /p>
Режим отладки: < /p>
BCryptEncrypt at 7ff6ee6813d9, linked from D:\test\win-memory-map\build\Debug-x64\simple-demo.exe
BCryptEncrypt at 7ff82d9fb200, loaded from bcrypt.dll
CertOpenStore at 7ff82ddec5f0, linked from C:\WINDOWS\System32\CRYPT32.dll
CertOpenStore at 7ff82ddec5f0, loaded from crypt32.dll

В режиме отладки символ bcryptencrypt ведет себя по -разному. Символ, который связан из исходного кода, находится внутри основного исполняемого файла. На практике это то же самое для всех символов в bcrypt.dll .
Итак, очевидная идея заключается в том, что версия отладки была связана с статической библиотекой версии Bcrypt.lib , в то время как версия релиза была связана с динамической библиотекой. И это верно только для bcrypt.dll , а не crypt32.dll , а не какая -либо другая библиотека.
Однако есть только одна версия bcrypt.lib для x64 на диск, в C: \ Program Files (x86) \ Комплекты \ 10 \ lib \ 10.0.26100.0 \ um \ x64 \ bcrypt.lib . Используя команду Dimplbin , внутри нет конкретного статического кода. Вопрос: < /p>

Как операция ссылки может добиться успеха без __declspec (dllimport) < /code>? В частности, в случае сборки выпуска символы успешно извлечены из DLL. В файле проекта VS нет ничего конкретного в этой библиотеке. />#include
#include
#include
#include

#pragma comment(lib, "crypt32.lib")
#pragma comment(lib, "bcrypt.lib")

void test(const void* mem_addr, const char* symbol, const char* dll_name)
{
char mem_name[2048] = { 0 };
HMODULE mem_mod = nullptr;
HMODULE dll_mod = nullptr;
GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, dll_name, &dll_mod);
GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT | GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, LPCSTR(mem_addr), &mem_mod);
GetModuleFileNameA(mem_mod, mem_name, DWORD(ARRAYSIZE(mem_name)));
const void* dll_addr = GetProcAddress(dll_mod, symbol);
std::cout

Подробнее здесь: https://stackoverflow.com/questions/797 ... bcrypt-dll
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»