Доступ к неэкспортируемым функциям DLL

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Здравствуйте.
У меня такой вопрос к специалистам: если я загружаю DLL-модуль в адресное пространство своего процесса, то я по идее могу иметь доступ ко всем его объектам, а не только к ресурсам и экспортируемым функциям.
Как мне обратиться напрямую к другим функциям и классам в DLL без их экспорта?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Нет. В том-то и смысл экспорта, чтобы вызывающей стороне стали видимыми имена процедур. Имя ассоциировано с адресом точки входа в процедуру.
Без экспорта не найти точки входа.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Это как попросить доступ к private секции класса. Мы рушим всю идеологию сокрытия данных, если бы предоставили какие-либо пути для реализации подобного желания :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Весь вопрос в том, кто разрабатывает саму DLL. Если это чужой модуль, то тебе там практически ничего не светит, и к сказаному ранее тут добавить нечего.
Но если ты сам разрабатываешь эту DLL для своего же приложения, то твои возможности отнюдь не ограничены стандартным экспортом функций. Тебе в принципе достаточно иметь всего одну экспортируемую функцию, чтобы через неё получить доступ к остальным процедурам и классам. Яркий тому пример - это доступ к СОМ-объектам через функцию DllGetClassObject. В этом плане ты даже больше выигрываешь, из-за того что не ограничен жесткими стандартами СОМ-технологии. Ты можешь за один вызов своей экспортируемой функции получить сразу весь массив указателей на остальные функции. Тогда ты получаешь реальный выигрыш во времени, по-скольку не нужно искать каждую отдельную функцию по имени, как это происходит при стандартном экспорте.
Если же тебе по каким-то причинам (на то должны быть реальные причины) нужно вообще отказаться от экспорта функций из DLL, то придётся самому реализовать альтернативный способ передачи адресов вызываемых функций в основное приложение.
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

Теоретически вызвать не экспортируемую функцию можно. Если библиотека ничем не запакована, можно получить абсолютное смещение относительно какой-то части dll, для которой мы можем гарантировано получить адрес (скажем относительно известной экспортируемой функции). Смещение посчитать можно, загрузив библиотеку в отладчик. Дальше в программе загружаем библиотеку LoadLibrary, получаем адрес известной экспортируемой функции GetProcAddress, считаем адрес + смещение, заполняем стек параметрами внутренней функции и вызываем последнюю по известному адресу. Здесь надо наверняка знать устройство не экспортируемой функции: количество и типы параметров, соглашение о вызовах этой функции и все-все остальное, что нужно знать для корректной работы с функцией. Как думаете, сработает?
На заказ: VBA, Excel mc-black@yandex.ru
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

можно получить абсолютное смещение относительно какой-то части dll, для которой мы можем гарантировано получить адрес (скажем относительно известной экспортируемой функции).
Очень уж сомнительный способ. Как мне в коде на С++ указывать эти смещения? Просто цифры вбивать?
Смещение посчитать можно, загрузив библиотеку в отладчик.
В DEBUG-версии эти значения будут одни, а в RELEASE-версии уже совсем другие...
Мне нравится решение, которое предложил WinMain, когда одна экспортируемая функция используется как провайдер для всех остальных. Попробую этот вариант реализовать и позже сообщу о результатах.
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

Просто цифры вбивать?
Именно. Я дал ответ насчет того, как поступить, если библиотека НЕ ТВОЯ, у тебя будет только релиз и только одна конкретная версия, любое изменение библиотеки все нарушит. Если она твоя, то ты просто фигней занимаешься. Скажи, зачем? Если это механизм защиты, то он вообще не катит!
На заказ: VBA, Excel mc-black@yandex.ru
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Чтобы вызывать из чужих модулей какие-то дополнительные функции таким необычным способом, нужно точно знать, что там есть нечто очень ценное, но скрытое от посторонних. Иначе результат не оправдает затраченных усилий. Ведь нужно каким-то образом узнать об имеющихся там функциях (кроме уже известных экспортируемых), об их параметрах (если конечно сам разработчик не предоставит подробную информацию). Там может находиться множество типовых функций из стандартной библиотеки С++, встраиваемых в модуль при компоновке, которые и так доступны любому разработчику. А какие-нибудь простенькие функции легче самому написать.
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

WinMain, предположим там есть что-то ценное. Допустим разбор неспецифицированного формата файлов и пара функций, конвертирующих в этот формат из известного формата и обратно. Об этом можно узнать по возможностям программы. Что делать? Реверсим программу: отладчик, дизассемблер, находим откуда ноги растут и пользуемся на здоровье. Либо бесконечно и бесполезно исследуем формат файла в hex-вьювере, надеясь докопаться до всех фич, что засунуты в формат. Если человек пытается добраться до своей не-экспортируемой функции, то я его совсем не понимаю. Разве только из любви к искусству... )
На заказ: VBA, Excel mc-black@yandex.ru
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Реверсим программу: отладчик, дизассемблер, находим откуда ноги растут и пользуемся на здоровье.
Это легко говорить тому, кто специализируется на таких вещах. А я на столько далёк от этого всего, что мне сейчас даже браться за это бессмысленно...
А для чего мне нужны эти фокусы со своей DLL?
Да просто для начала попробовать реализовать некую интересную на мой взгляд идею. А что из этого получится и как это будет на деле работать - только практика покажет.
Ответить