информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsГде водятся OGRыЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Странные вещи в обычных екзешниках... 31.01.06 12:35  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
Изучая некий экзешник, столкнулся с тем, что он не только импортирует, но и экспортирует из себя функции. Ну, т.е. у него имеется таблица экспорта, как у *.dll. Соответственно и вопрос: зачем это нужно экзешникам?

Заранее всем спасибо за ответы.
Нормальная весчь. Пример - распространение библиотеки кода и пользовательского интерфейса в одном файле. Хошь - пиши свой интерфейс, хошь - используй предлагаемые функции. Оччень удобно... 31.01.06 13:01  
Автор: kstati <Евгений Борисов> Статус: Elderman
<"чистая" ссылка>
4example
\\%SYSTEMDIR%\*.cpl
\\Program Files\Microsoft Office\Office10\WINWORD.EXE
\\Program Files\Adobe\Photoshop CS\Photoshop.exe
\\Program Files\Adobe\Illustrator CS\Support Files\Contents\Windows\Illustrator.exe
Да, но как грузить такую exe-dll в свой процесс? С флагом dont_resolve_dll_references? 31.01.06 15:46  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
Нет. Банальным LoadLibrary. 31.01.06 15:50  
Автор: Killer{R} <Dmitry> Статус: Elderman
Отредактировано 31.01.06 15:54  Количество правок: 2
<"чистая" ссылка>
Но загрузить ее сможет только тот процесс который имеет нужные ей экспорты и нужное имя
Eugeny Borisov говорит, что это удобный метод использования "библиотеки и exe в одном файле". Если грузить её с помощью LoadLibrary, то винда начнёт напрягаться с вызовом DllEntry. Которого нет в exe. 31.01.06 16:41  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
RTFM, сударь... 2example: Handle=LoadModule("my.exe", NULL); GetProcessAddress(Handle, "MyProcName"); 31.01.06 18:24  
Автор: kstati <Евгений Борисов> Статус: Elderman
<"чистая" ссылка>
оно же работать не будет 31.01.06 19:01  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
Таким способом ты создашь новый процесс. И результат который ты получишь не будет валиден в адресном пространстве твоего процесса. Не говоря уж о функции экспортируемой тем ехешником.
Не лучше ли вместо гаданий просто RTFM?.. Функция GetProcAddress нормально работает с хендлами, полученными в результате LoadModule и LoadLibrary 01.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.. Но мне трудно представить необходимость загрузки ехе как длл.
эх... 31.01.06 17:06  
Автор: Killer{R} <Dmitry> Статус: Elderman
Отредактировано 31.01.06 17:07  Количество правок: 1
<"чистая" ссылка>
он видимо имел ввиду что функции ехешника можно будет юзать из дллек загруженных в него безо всяких доп получений указателей/интерфейсов.
Ну например ехешник может загрузить в себя длл которая линкуется на функци ехешника 31.01.06 12:39  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
А насколько корректен такой подход? 31.01.06 13:04  
Автор: Ustin <Ustin> Статус: Elderman
Отредактировано 31.01.06 13:14  Количество правок: 2
<"чистая" ссылка>
> 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
<"чистая" ссылка>
Походу при компиляции 31.01.06 15:58  
Автор: Ustin <Ustin> Статус: Elderman
Отредактировано 31.01.06 16:15  Количество правок: 1
<"чистая" ссылка>
Блин, попробовал так сделать, чтобы дллка грузилась из экзешника, а потом вызывает экспортируемую из него фцию. Получилось, что значение 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
<"чистая" ссылка>
1  |  2 >>  »  




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach