В 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
Визуальная ссылка C ++ Странность с bcrypt.dll ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1758055977
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79766569/visual-c-link-weirdness-with-bcrypt-dll[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия