Да, но как грузить такую exe-dll в свой процесс? С флагом dont_resolve_dll_references?31.01.06 15:46 Число просмотров: 2609 Автор: HandleX <Александр М.> Статус: The Elderman
Изучая некий экзешник, столкнулся с тем, что он не только импортирует, но и экспортирует из себя функции. Ну, т.е. у него имеется таблица экспорта, как у *.dll. Соответственно и вопрос: зачем это нужно экзешникам?
Заранее всем спасибо за ответы.
Нормальная весчь. Пример - распространение библиотеки кода и пользовательского интерфейса в одном файле. Хошь - пиши свой интерфейс, хошь - используй предлагаемые функции. Оччень удобно...31.01.06 13:01 Автор: kstati <Евгений Борисов> Статус: Elderman
Да, но как грузить такую exe-dll в свой процесс? С флагом dont_resolve_dll_references?31.01.06 15:46 Автор: HandleX <Александр М.> Статус: The Elderman
Но загрузить ее сможет только тот процесс который имеет нужные ей экспорты и нужное имя
Eugeny Borisov говорит, что это удобный метод использования "библиотеки и exe в одном файле". Если грузить её с помощью LoadLibrary, то винда начнёт напрягаться с вызовом DllEntry. Которого нет в exe.31.01.06 16:41 Автор: HandleX <Александр М.> Статус: The Elderman
Таким способом ты создашь новый процесс. И результат который ты получишь не будет валиден в адресном пространстве твоего процесса. Не говоря уж о функции экспортируемой тем ехешником.
Не лучше ли вместо гаданий просто RTFM?.. Функция GetProcAddress нормально работает с хендлами, полученными в результате LoadModule и LoadLibrary01.02.06 13:53 Автор: kstati <Евгений Борисов> Статус: Elderman
Евгений, похоже, ни разу сам с этой функцией не работал... :)01.02.06 15:13 Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 01.02.06 15:14 Количество правок: 1
Во-первых, если выставить pParameterBlock в NULL, наткнётесь на Access Violation.
Во-вторых, если всё-таки сформировать корректно этот lpParameterBlock с необходимым минимумом данных (указатель на пустую командную паскаль-строку должен ссылаться на реальную пустую паскаль-строку :)), то LoadModule исправно запустит процесс -))
А разве может процесс как исполняться, так и быть отображён в адресное пространство другого процесса?
Зато LoadLibrary(), по моим вчерашним исследованиям, прекрасно грузит екзешники как dll и винда выдаёт указатели на экспортируемые функции при помощи GetProcAddress. Так что всё-таки использовать можно. Но для тех, кто не и щет простых путей -))
Хм.. Это уже видимо перешагивание тонкой грани под названием...01.02.06 15:32 Автор: Killer{R} <Dmitry> Статус: Elderman
> А разве может процесс как исполняться, так и быть отображён > в адресное пространство другого процесса? > > Зато LoadLibrary(), по моим вчерашним исследованиям, > прекрасно грузит екзешники как dll и винда выдаёт указатели > на экспортируемые функции при помощи GetProcAddress. Так > что всё-таки использовать можно. Но для тех, кто не и щет > простых путей -)) Хм.. Это уже видимо перешагивание тонкой грани под названием "хак" :)
Тк CRT в ехешнике считает что она будет работать как процесс и будет неправильно инициализироваться. Хотя можно конечно писать и без CRT.. Но мне трудно представить необходимость загрузки ехе как длл.
> 4example > \\%SYSTEMDIR%\*.cpl Насколько я себе понимаю, они экспортят функцию CPlApplet, необходимую для вызова апплета контрол-панели
> \\Program Files\Microsoft Office\Office10\WINWORD.EXE экспортирует функции, необходимые для работы Active-X сервера
А вот действительно, если загружаемая дллина линкуется на функции загружаемого экзешника, насколько это правомерно\корректно с точки зрения ОС Windows?
Ничего противозаконного не вижу31.01.06 13:18 Автор: Killer{R} <Dmitry> Статус: Elderman
лоадеру в принципе пох. При резолве зависимостей при загрузке он ищет в списке уже загруженных модулей текущего процесса нужный, если находит - линкуется на него. На этом этапе абсолютно пофиг ехе это или длл. РЕ модуль он и в Африке РЕ модуль. Многие используют эту фичу для интерфейсов к своим плагинам.
Ой... А в таком файле уже будут две точки входа: один Main(), другой DLLEntryPoint()? Разве так бывает?31.01.06 14:35 Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 31.01.06 14:36 Количество правок: 1
По числу параметров они одинаковы, и вроде даж совпадают в первом параметре, но как узнать что "сейчас я екзешник, и нуно смотреть параметры запуска", а не "сейчас я dll, и нуно реагировать на DLL_PROCESS(THREAD)_ATTACH(DETACH)"?
В Delphi RTL есть переменная System.IsLibrary, которая по...31.01.06 15:17 Автор: Ustin <Ustin> Статус: Elderman Отредактировано 31.01.06 15:25 Количество правок: 1
>но как узнать что "сейчас я екзешник, и нуно смотреть параметры запуска", а не "сейчас я dll, и
> нуно реагировать на DLL_PROCESS(THREAD)_ATTACH(DETACH)"? В Delphi RTL есть переменная System.IsLibrary, которая по старту и принимает нужное значение.
>Естественно там не должно быть циклических ссылок - типа ехешник линкуется на длл а длл на >ехешник. Просто ехешник ее загружает через LoadLibrary будучи уже загруженным.
То есть нельзя делать статичных импортов? жаль...
А как это делает Delphi? Или это её ноу-хау? -))31.01.06 15:25 Автор: HandleX <Александр М.> Статус: The Elderman
Блин, попробовал так сделать, чтобы дллка грузилась из экзешника, а потом вызывает экспортируемую из него фцию. Получилось, что значение IsLibrary для ехешника всегда false. При вызове функции дллкой из незапущенной копии ехешника всё тихо падает.
При компиляции походу определяется, что вызывать при загрузке - инициализацию как библиотеки или как исполнимого файла.
[UPD]:Внутри экспортируемой функции - обычный messagebox, так что возможно на delphi нельзя сделать экзешник с функциональностью библиотеки
Есть только одна точка входа. Называется она EntryPoint.31.01.06 14:44 Автор: Killer{R} <Dmitry> Статус: Elderman Отредактировано 31.01.06 14:45 Количество правок: 1
DllMain и WinMain это уже поделки компиляторов. Они вызываются из кода CrtStartup'а. И кстати настоящие EntryPoint'ы ехешника и дллки различаются количеством параметров. Но в данном случае ничего нет плохого тк ехешник это всетаки ехешник а длл-всетаки длл. То что у ехешника есть экспорты никак не коррелирует с наличием у него DllMain'а :). Ты пойми - ехешник уже загружен в память на момент загрузки в его адресное пространство другой дллки которая на него линкуется. Естественно там не должно быть циклических ссылок - типа ехешник линкуется на длл а длл на ехешник. Просто ехешник ее загружает через LoadLibrary будучи уже загруженным.
Т.е. загружать такую "dll" надо с помощью LoadLibraryEx() с обязательным параметром dont_resolve_dll_references ?31.01.06 15:07 Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 31.01.06 15:08 Количество правок: 1