Доступ к неэкспортируемым функциям DLL
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Здравствуйте.
У меня такой вопрос к специалистам: если я загружаю DLL-модуль в адресное пространство своего процесса, то я по идее могу иметь доступ ко всем его объектам, а не только к ресурсам и экспортируемым функциям.
Как мне обратиться напрямую к другим функциям и классам в DLL без их экспорта?
У меня такой вопрос к специалистам: если я загружаю 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Весь вопрос в том, кто разрабатывает саму DLL. Если это чужой модуль, то тебе там практически ничего не светит, и к сказаному ранее тут добавить нечего.
Но если ты сам разрабатываешь эту DLL для своего же приложения, то твои возможности отнюдь не ограничены стандартным экспортом функций. Тебе в принципе достаточно иметь всего одну экспортируемую функцию, чтобы через неё получить доступ к остальным процедурам и классам. Яркий тому пример - это доступ к СОМ-объектам через функцию DllGetClassObject. В этом плане ты даже больше выигрываешь, из-за того что не ограничен жесткими стандартами СОМ-технологии. Ты можешь за один вызов своей экспортируемой функции получить сразу весь массив указателей на остальные функции. Тогда ты получаешь реальный выигрыш во времени, по-скольку не нужно искать каждую отдельную функцию по имени, как это происходит при стандартном экспорте.
Если же тебе по каким-то причинам (на то должны быть реальные причины) нужно вообще отказаться от экспорта функций из DLL, то придётся самому реализовать альтернативный способ передачи адресов вызываемых функций в основное приложение.
Но если ты сам разрабатываешь эту DLL для своего же приложения, то твои возможности отнюдь не ограничены стандартным экспортом функций. Тебе в принципе достаточно иметь всего одну экспортируемую функцию, чтобы через неё получить доступ к остальным процедурам и классам. Яркий тому пример - это доступ к СОМ-объектам через функцию DllGetClassObject. В этом плане ты даже больше выигрываешь, из-за того что не ограничен жесткими стандартами СОМ-технологии. Ты можешь за один вызов своей экспортируемой функции получить сразу весь массив указателей на остальные функции. Тогда ты получаешь реальный выигрыш во времени, по-скольку не нужно искать каждую отдельную функцию по имени, как это происходит при стандартном экспорте.
Если же тебе по каким-то причинам (на то должны быть реальные причины) нужно вообще отказаться от экспорта функций из DLL, то придётся самому реализовать альтернативный способ передачи адресов вызываемых функций в основное приложение.
- mc-black
- Сообщения: 250
- Зарегистрирован: 08 май 2008, 16:09
- Откуда: Россия, Нижний Новгород
- Контактная информация:
Теоретически вызвать не экспортируемую функцию можно. Если библиотека ничем не запакована, можно получить абсолютное смещение относительно какой-то части dll, для которой мы можем гарантировано получить адрес (скажем относительно известной экспортируемой функции). Смещение посчитать можно, загрузив библиотеку в отладчик. Дальше в программе загружаем библиотеку LoadLibrary, получаем адрес известной экспортируемой функции GetProcAddress, считаем адрес + смещение, заполняем стек параметрами внутренней функции и вызываем последнюю по известному адресу. Здесь надо наверняка знать устройство не экспортируемой функции: количество и типы параметров, соглашение о вызовах этой функции и все-все остальное, что нужно знать для корректной работы с функцией. Как думаете, сработает?
На заказ: VBA, Excel mc-black@yandex.ru
Очень уж сомнительный способ. Как мне в коде на С++ указывать эти смещения? Просто цифры вбивать?можно получить абсолютное смещение относительно какой-то части dll, для которой мы можем гарантировано получить адрес (скажем относительно известной экспортируемой функции).
В DEBUG-версии эти значения будут одни, а в RELEASE-версии уже совсем другие...Смещение посчитать можно, загрузив библиотеку в отладчик.
Мне нравится решение, которое предложил WinMain, когда одна экспортируемая функция используется как провайдер для всех остальных. Попробую этот вариант реализовать и позже сообщу о результатах.
- mc-black
- Сообщения: 250
- Зарегистрирован: 08 май 2008, 16:09
- Откуда: Россия, Нижний Новгород
- Контактная информация:
Именно. Я дал ответ насчет того, как поступить, если библиотека НЕ ТВОЯ, у тебя будет только релиз и только одна конкретная версия, любое изменение библиотеки все нарушит. Если она твоя, то ты просто фигней занимаешься. Скажи, зачем? Если это механизм защиты, то он вообще не катит!Просто цифры вбивать?
На заказ: VBA, Excel mc-black@yandex.ru
Чтобы вызывать из чужих модулей какие-то дополнительные функции таким необычным способом, нужно точно знать, что там есть нечто очень ценное, но скрытое от посторонних. Иначе результат не оправдает затраченных усилий. Ведь нужно каким-то образом узнать об имеющихся там функциях (кроме уже известных экспортируемых), об их параметрах (если конечно сам разработчик не предоставит подробную информацию). Там может находиться множество типовых функций из стандартной библиотеки С++, встраиваемых в модуль при компоновке, которые и так доступны любому разработчику. А какие-нибудь простенькие функции легче самому написать.
- mc-black
- Сообщения: 250
- Зарегистрирован: 08 май 2008, 16:09
- Откуда: Россия, Нижний Новгород
- Контактная информация:
WinMain, предположим там есть что-то ценное. Допустим разбор неспецифицированного формата файлов и пара функций, конвертирующих в этот формат из известного формата и обратно. Об этом можно узнать по возможностям программы. Что делать? Реверсим программу: отладчик, дизассемблер, находим откуда ноги растут и пользуемся на здоровье. Либо бесконечно и бесполезно исследуем формат файла в hex-вьювере, надеясь докопаться до всех фич, что засунуты в формат. Если человек пытается добраться до своей не-экспортируемой функции, то я его совсем не понимаю. Разве только из любви к искусству... )
На заказ: VBA, Excel mc-black@yandex.ru
Это легко говорить тому, кто специализируется на таких вещах. А я на столько далёк от этого всего, что мне сейчас даже браться за это бессмысленно...Реверсим программу: отладчик, дизассемблер, находим откуда ноги растут и пользуемся на здоровье.
А для чего мне нужны эти фокусы со своей DLL?
Да просто для начала попробовать реализовать некую интересную на мой взгляд идею. А что из этого получится и как это будет на деле работать - только практика покажет.