Вызов функции-члена с адресом смещения из Dll - PullRequest
0 голосов
/ 02 июня 2019

У меня есть неэкспортированная функция-член в dll.
Я пытаюсь вызвать эту функцию с base + offset адресом, который я извлек ранее.
У меня проблема с выполнениемфактический вызов из экземпляра класса.

II удалось получить базовый адрес модуля и смещение функции из библиотеки DLL.
Я получил ошибку при вызове функции, поскольку она не является членом моего класса.

HMODULE hDll = GetModuleHandleA("myModule.dll");

void *(funcPtr)() = (void(*)())((char *)&hDll + 0x101E07); //this is the non exported function address
myClassInstance->funcPtr();

Я получаю сообщение об ошибке:

'funcPtr' is not a member of 'MyClass'

Как мне сделать вызов funcPtr с myClassInstance?

1 Ответ

0 голосов
/ 03 июня 2019

Это не простая вещь, чтобы сделать. Во-первых, вам нужно объявить ваш указатель как указатель на функцию-член:

void (MYCLASS::*funcPtr)();

И вы бы позвонили через

(myClassInstance->*funcPtr)();

Тогда вам нужен какой-то способ сохранить значение там. Вы не можете привести char * (или void *) указатель на указатель на функцию-член. Вы должны будете использовать некоторую форму типа наказания.

Типичный способ - использовать memcpy:

void *addr = (char *)&hDll + 0x101E07;
memcpy(&funcPtr, &addr, sizeof(void *));

Другая возможность, так как получение адреса функции-члена из DLL уже за линией для неопределенного поведения, возможно, использует объединение:

union MemFuncPtr {
    void *addr;
    void (MYCLASS::*memfun)();
    // Can be expanded to include other member function pointer types if necessary
};

Тогда вы можете просто

MemFuncPtr mfp;
mfp.addr = (char *)&hDll + 0x101E07;
funcPtr = mfp.memfun;

Или вы можете попробовать очень некрасивый референтный бросок в левой части задания.

Существуют дополнительные возможные сложности, если функция, адрес которой вы получаете, является virtual и myClassInstance указывает на производный класс, или если задействовано множественное наследование.

Действуйте на свой страх и риск.

...