Почему программа завершилась аварийно (крашнулась)?

Как можно вызвать функцию из DLL, если известен только ее адрес в памяти, без доступа к исходному коду?
  • 14 июня 2024 г. 16:41
Ответы на вопрос 2
Программа может завершиться аварийно по разным причинам, включая ошибки в коде, нехватку памяти, недопустимые операции, несовместимость с операционной системой или другими программами, и т.д. Для выявления конкретной причины аварийного завершения программы нужно провести анализ логов, дампов памяти и других отладочных данных.

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