Как вызвать экспортированную функцию из 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?

Другие вопросы по тегам