如何在C / C ++中调用dll中的导出函数?

时间:2012-06-10 21:27:44

标签: function dll call dllexport function-address

我的目标是通过其地址调用某些功能。我该怎么办?

我已经为这样的目标完成了下一步的工作,但是最初(1) - 我有访问冲突(不知道为什么)和第二次我有一些问题,调用函数是具有ESP值的ASM。 ..

第一个(访问冲突的问题):

#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 个答案:

答案 0 :(得分:1)

首先,存在一个主要问题(因此访问冲突)具有硬编码地址偏移量(const DWORD_PTR offset = 0x00001a90)。不要那样做!你怎么知道由于ASLR而不会改变offsett?