Как создать проксированную DLL для wintrust.dll с помощью g++ и обеспечить 32-битную/64-битную совместимость?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как создать проксированную DLL для wintrust.dll с помощью g++ и обеспечить 32-битную/64-битную совместимость?

Сообщение Anonymous »

Я пытаюсь создать прокси-библиотеку DLL для wintrust.dll, используя g++ из набора инструментов ucrt64. Моя цель состоит в том, чтобы DLL имитировала исходный файл wintrust.dll, за исключением того, что функция WinVerifyTrust всегда будет возвращать успех.
Сначала я попробовал использовать следующую строку в моем файле .cpp:

Код: Выделить всё

#pragma comment(linker, "/export:function_name=lib.function_name")
чтобы связать функции, но это не привело к созданию связанных функций. Кроме того, ошибок не было —, похоже, просто проигнорировал инструкцию. Однако создание файла .def с помощью EXPORTS сработало, позволяя DLL работать должным образом.
Вот текущая настройка:
wintrustprox.def:

Код: Выделить всё

EXPORTS
WinVerifyTrust @1
AddPersonalTrustDBPages=wintrust.AddPersonalTrustDBPages @2
CatalogCompactHashDatabase=wintrust.CatalogCompactHashDatabase @3
ComputeFirstPageHash=wintrust.ComputeFirstPageHash @4
;rest of the wintrust.dll functions...
wintrustprox.cpp:

Код: Выделить всё

#include 

// Define Success as 0
#define WINVERIFYTRUST_SUCCESS 0

// Define the function signature based on the original WinVerifyTrust
extern "C" __declspec(dllexport) LONG WinVerifyTrust(
HWND hwnd,
GUID *pgActionID,
LPVOID pWVTData
) {
// Return Success enum value
return WINVERIFYTRUST_SUCCESS;
}

BOOL APIENTRY DllMain(HMODULE hModule,
DWORD  ul_reason_for_call,
LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
сделать:

Код: Выделить всё

g++ wintrustprox.cpp wintrustprox.def -o wintrustprox.dll -shared
Это работает так, как задумано, но у меня есть несколько вопросов:
  • Почему #pragma comment(linker) не работает с g++?

    Я видел, как он используется с MSVC, но когда я пробую его с g++ , похоже, он игнорируется без каких-либо ошибок или предупреждений.
  • Как скомпилировать 32-битную версию этой DLL?

    Мне нужно убедиться, что 32-битная DLL:
    • Использует wintrust .dll из папки syswow64, а не system32.
    • Работает в 32-битных системах. . Какой дополнительный код или инструменты мне нужно скомпилировать для 32-разрядной версии?
  • Как я могу проверить, что DLL действительно правильно проксирует функции в 32- и 64-битных системах?

    Помимо простой проверки существования функций, как я могу подтвердить, что вызовы перенаправляются на исходный файл wintrust.dll (кроме WinVerifyTrust, который я переопределяю)?


Подробнее здесь: https://stackoverflow.com/questions/791 ... bit-64-bit
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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