Как можно вызвать функцию из DLL, если известен только ее адрес в памяти, без доступа к исходному коду?
Программа может завершиться аварийно по разным причинам, включая ошибки в коде, нехватку памяти, недопустимые операции, несовместимость с операционной системой или другими программами, и т.д. Для выявления конкретной причины аварийного завершения программы нужно провести анализ логов, дампов памяти и других отладочных данных. Чтобы вызвать функцию из DLL, зная только ее адрес в памяти, можно воспользоваться функцией `GetProcAddress`, доступной в Windows API. Данная функция позволяет получить указатель на экспортированную функцию по ее имени или оффсету в адресном пространстве DLL. На практике это может выглядеть примерно следующим образом: ```c #include <windows.h> int main() { HMODULE hDll = LoadLibrary("mydll.dll"); if (hDll != NULL) { FARPROC functionAddress = GetProcAddress(hDll, "FunctionName"); if (functionAddress != NULL) { typedef void (*FunctionType)(); FunctionType Function = (FunctionType)functionAddress; Function(); } FreeLibrary(hDll); } return 0; } ``` Этот код загружает библиотеку DLL, находит в ней адрес функции по имени "FunctionName" и вызывает эту функцию.
А как вы адрес получали? Похоже, что с ним фигня.
Попробуйте запустить вашу программу в отладчике с брейкпоинтом по загрузке (видимо, нужно будет windbg использовать какой-нибудь. Не знаю, как это сделать в IDE). Пропустите загрузку всех модулей и потом ставьте брейкпойнт в вашем MainThread. Там пройдитесь до, собственно, вызова auth и посмотрите, по какому адресу оно сделает вызов. Потом, посмотрите в отладчике же, а какой же адрес у auth. Они точно совпадают?
Еще, а не рабатает ли, если auth в вашем взламываемом экзешнике объявить тоже _stdcall? Не помню, какое там соглашение по вызову по стандарту применяется, но надо чтобы они были одинаковы в коде экзешника и в вашей дллке.