Почему не удается определить местоположение функции?

Как я могу правильно получить адрес функции `auth()` из кода программы на языке C++? Я пытался различные способы, но безуспешно. Может кто-то посоветует, как это сделать? Вот приведенный код программы и код DLL, которую я загружаю в память.
  • 14 июня 2024 г. 2:11
Ответы на вопрос 4
Пожалуйста, предоставьте код программы на C++ и код DLL, который вы загружаете в память, чтобы можно было более точно определить, почему у вас возникают проблемы при попытке определить местоположение функции `auth()`. 

Обычно для получения адреса функции из загруженной DLL используется функция `GetProcAddress` из библиотеки Windows API. Однако, возможно, у вас есть какие-то особенности кода или процесса загрузки DLL, из-за которых возникают сложности. 

Если вы предоставите больше информации о вашей задаче, коде программы и коде DLL, я смогу помочь вам более конкретно.
Если эта целевая программа не твоя и часто обновляется, то нужно найти сигнатуру функции, представляющую собой уникальный паттерн инструкций. Потом прогонять поиск по памяти образа на наличие этой сигнатуры и брать итоговое смещение относительно базового адреса. Это и будет нужный адрес. 

Если программа не обновляется никогда, то возьми да захардкодь RVA этой функции.

Если программа твоя, то как у уже сказали остальные, просто сделай символ публичным плюс C abi через extern "C"
Файл DLL имеет макет, очень похожий на EXE-файл, с одним важным отличием — DLL-файл содержит таблицу экспорта. Таблица экспорта содержит имя каждой функции, которую библиотека DLL экспортирует в другие исполняемые файлы. Эти функции являются точками входа в библиотеку DLL; другие исполняемые файлы могут обращаться только к функциям из таблицы экспорта. Все остальные функции библиотеки DLL являются закрытыми. Таблицу экспорта библиотеки DLL можно просмотреть с помощью средства DUMPBIN с параметром /EXPORTS. 

Экспортировать функции из библиотеки DLL можно двумя способами:


При экспорте функций любым способом убедитесь, что используется соглашение о вызовах __stdcall.
Уже подсказали про проблему с экспортом, но не в ту сторону. 
Ты хочешь получить адрес функции из исполняемого файла с помощью дин. либы. То есть тебе надо экспортировать символ не из dll, а из исполняемого файла. Грубо говоря, из main.c. В шиндоузе, если не указывать видимость символа, то по умолчанию он не импортируется, т.е. надо добавить __declspec(dllexport) вручную.

Также, проблема может быть из-за манглинга - ты используешь c++ и функция не в extern "C" . В результате, ее имя не auth, а какое-нибудь B4__authV
Похожие вопросы