я пробую сделать вызов функции программы из под dll загружая ее в память. Я определил офсет функции и теперь имею ее адрес
// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"
#include <Windows.h>
#include <string>
#include <iostream>
using namespace std;
typedef void(__stdcall* _auth)();
_auth auth;
DWORD WINAPI MainThread(LPVOID param)
{
uintptr_t modBase = (uintptr_t)GetModuleHandle(NULL);
auth = (_auth)(modBase + 0x1040);
cout << "0x" << std::hex << auth << endl;
while (!GetAsyncKeyState(VK_END))
{
if (GetAsyncKeyState(VK_F9) & 1)
{
try
{
//cout << "0x" << std::hex << modBase << endl;
auth();
}
catch (exception& ex)
{
cout << "Exception caught while calling auth() " << ex.what() << endl;
}
}
}
FreeLibraryAndExitThread((HMODULE)param, 0);
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
CreateThread(0, 0, MainThread, hModule, 0, 0);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
допустим мы не знаем кода программы функцию которой мы хотим вызвать, но для простоты задания я написал маленькое консольное приложение
void auth()
{
cout << "CALLED FUNCTION auth()" << endl;
}
int main()
{
while (true)
{
if (GetAsyncKeyState(VK_F8) & 1)
{
auth();
}
}
return 0;
}
проблема заключается в том, что при попытке вызвать auth() через Dll программа просто крашиться. Пробовал поймать ошибку блоками try catch, но ошибка банально не выводится, приложение закрывается.
Это main() функция программы. В 7 строке идет вызов функции auth() и вывод сообщения, а последующий колл, как я понял, отвечает за перенос строки. Решил ради эксперимента убрать последнюю call инструкцию и получил в точности ту же ошибку что и при попытке запустить функцию из под Dll. Я не совсем понимаю как тогда должна выглядеть конструкция Dll файла, мне надо сделать еще один call сразу после вызова по адресу функции auth() или как-то полностью изменить инструкцию?