1

私の目的は、そのアドレスを介していくつかの関数を呼び出すことです。どうすればいいですか?

私はそのような目的のために次の作業を行いましたが、最初は(1) - アクセス違反が発生し (理由はわかりません)、2 つ目は関数の呼び出しに問題があり、ESP 値を持つ ASM です...

1 つ目 (アクセス違反の問題):

#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;
}

2 番目 (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 つの主な質問は次のとおりです。

次の呼び出しのために実行時に関数アドレスを動的に計算するにはどうすればよいですか?

ありがとう、

よろしくお願いします!

4

1 に答える 1

1

まず、ハードコードされたアドレスオフセット(const DWORD_PTR offset = 0x00001a90)に大きな問題(したがってアクセス違反)があります。そうしないでください!ASLRのためにオフセットが変更されないことをどうやって知ることができますか?

于 2012-06-11T12:40:38.380 に答える