Как вызвать экспортированную функцию из DLL в C/C++?
Моя цель - вызвать какую-то функцию через ее адрес. Как мне это сделать?
Я проделал следующую работу для этой цели, но сначала (1) - у меня нарушение прав доступа (не знаю почему), а со второй у меня возникли некоторые проблемы с вызовом функции ASM со значением ESP...
Первый (проблема с нарушением доступа):
#include <iostream>
#include <Windows.h>
const DWORD_PTR offset = 0x00001a90;
typedef void (__stdcall *uef)(int);
int main(void)
{
HMODULE hModule = LoadLibrary(L"C:\\Windows\\system32\\OpenAL32.dll");
DWORD_PTR addr = (DWORD_PTR)hModule + offset;
uef func = (uef)offset;
func(0);
return 0;
}
Второе (проблемы во время выполнения со значением ESP):
#include <iostream>
#include <Windows.h>
typedef void (__stdcall *uef)(int);
int main(void)
{
HMODULE hModule = LoadLibrary(L"C:\\Windows\\system32\\OpenAL32.dll");
uef obj = NULL;
if(hModule != NULL)
{
obj = reinterpret_cast<uef>(GetProcAddress(hModule, "alEnable"));
}
if(obj != NULL)
{
(*obj)(0);
}
if(hModule != NULL)
{
FreeLibrary(hModule);
}
return 0;
}
Как я мог решить эту проблему?
PS
И еще один главный вопрос:
Как я могу динамически вычислить адрес функции во время выполнения для следующего вызова?
Спасибо,
С уважением!
1 ответ
Во-первых, существует серьезная проблема (отсюда и нарушение прав доступа) с жестко закодированным смещением адреса (const DWORD_PTR offset = 0x00001a90). Не делай этого! Как вы можете знать, что смещение не будет изменено из-за ASLR?