Как я могу правильно получить адрес функции `auth()` из кода программы на языке C++? Я пытался различные способы, но безуспешно. Может кто-то посоветует, как это сделать? Вот приведенный код программы и код DLL, которую я загружаю в память.
Пожалуйста, предоставьте код программы на 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