Как можно вызвать функцию из 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? Не помню, какое там соглашение по вызову по стандарту применяется, но надо чтобы они были одинаковы в коде экзешника и в вашей дллке.