1

我的目标是通过它的地址调用一些函数。我该怎么做?

我已经为这个目标做了下一个工作,但首先(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;
}

我该如何解决这个问题?

附言

另一个主要问题是:

如何在运行时动态计算函数地址以便下次调用?

谢谢,

此致!

4

1 回答 1

1

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

于 2012-06-11T12:40:38.380 回答