Я создал тестовую программу и создал функцию, которая просто печатает некоторый текст, и я пытаюсь вызвать его из DLL, перевернув его с помощью IDA / Ghidra и получив указатель на него.
Как это выглядит в Ghidra
Я думал, что IDA дал неправильный адрес, поэтому я проверил с Ghidra, и я получил тот же адрес ...
Вот мой код для вызова функция из моей DLL
#include <iostream>
void coolRoutine() {
printf("starting...\n");
void(*ofunct)() = (void(__cdecl *)())(0x00401000);
printf("got funct!\n");
ofunct();
printf("done!\n");
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
coolRoutine();
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Программа печатает «запуск ...» и «получил функцию!» но не вызывает исходную функцию.
Я попытался просмотреть несколько сообщений, и я не могу понять, что я делаю неправильно, поскольку кто-то сделал что-то подобное, и это сработало для них.
Обновление: как кто-то предложил, я попытался добавить базовый адрес к указателю на функцию, но в итоге получил тот же результат.
Вот что я пытался:
void coolRoutine() {
printf("starting...\n");
uintptr_t baseAddress = (uintptr_t)GetModuleHandle(0);
std::cout << "Base Address: " << baseAddress << std::endl;
void(*ofunct)() = (void(__cdecl *)())(baseAddress + 0x00401000);
printf("got funct!\n");
ofunct();
printf("done!\n");
}
Это правильно получает базовый адрес (или, по крайней мере, я так думаю, поскольку он не равен нулю), но он не выполняет ununct и выводит «done!».