Может ли файл быть одновременно исполняемым файлом (EXE) и динамически подключаемой библиотекой (DLL)?

7

Возможно ли, чтобы файл одновременно исполнялся (EXE) и библиотека динамической компоновки (DLL)? (Например, он может быть выполнен как EXE и загружен во время выполнения в качестве общей библиотеки.)

Я не понимаю, почему это невозможно, но может кто-нибудь может дать объяснение?

  • 1
    Это не может. Смотрите следующее: stackoverflow.com/questions/1210873/…
  • 0
    Похожие страницы : stackoverflow.com/questions/19110747/loadlibrary-an-exe
Показать ещё 3 комментария
Теги:
dll
exe

2 ответа

7

Из Документация LoadLibrary:

Название модуля. Это может быть либо библиотечный модуль (файл .dll), либо исполняемый модуль (файл .exe). Указанное имя - это имя файла модуля и не связано с именем, хранящимся в самом модуле библиотеки, как определено ключевым словом LIBRARY в файле module-definition (.def).

РЕДАКТИРОВАТЬ: Я ожидал downvotes, когда я написал этот ответ. Я знаю, что многие люди думают, что это невозможно (ответы на вопросы и ответы из комментариев подтверждают это). Но для тех, кого это интересует, я могу предоставить POC (или просто посмотреть на хорошо известные источники процесса).

Обратите внимание: если вам нужно экспортировать символы из модуля, вам нужно использовать эти операторы EXPORT в файле .def. Затем вы можете использовать GetProcAddress

Собственно, я вижу, что этот вопрос SO, также упоминаемый в комментариях, имеет ответ, который указывает на статью "Загрузить EXE как DLL: Mission Possible" , который я также собирался процитировать. Этот ответ не принят, принятый ответ говорит "нет" и даже принимается как вики сообщества. Well "SO не претендует на то, чтобы быть (частично) ссылкой на библиотеку"

  • 0
    Хм, статья в основном показывает, как вы можете выполнять дополнительную работу, которую LoadLibrary не делает для библиотек DLL. Он не показывает, как что-то может быть как EXE, так и DLL, он показывает, как вы можете перепрыгнуть через дополнительные обручи, чтобы заставить DLL работать как EXE. Конечно, это возможно, вы просто пишете тот же код, который Microsoft сделала в загрузчике. Я не знаю, что вы имеете в виду под «источниками проводника процессов». У вас есть исходный код для Process Explorer? Какое отношение это имеет к этой проблеме?
  • 0
    Кроме того, я подозреваю реальную причину, по которой документация по функции LoadLibrary говорит, что это историческая история. В 16-разрядные дни расширение DLL не использовалось широко (в Windows 1.0, конечно, оно даже не существовало). Все двоичные файлы, содержащие код, имели расширение EXE, включая KRNL386.EXE, USER.EXE, GDI.EXE и т. Д. Но это были только библиотеки DLL, как мы их теперь знаем. Один бит в PE-заголовке определяет, как они должны быть загружены. Документация, вероятно, никогда не обновлялась, и обратная совместимость указывает на то, что код также не обновлялся. Кроме того, ресурсы могут быть загружены из EXE таким образом.
Показать ещё 5 комментариев
2

В официальной документации PE IMAGE_FILE_EXECUTABLE_IMAGE (0x002) и IMAGE_FILE_DLL (0x2000) - оба флага поля Characteristics PE-заголовка.

Как видно из IMAGE_FILE_DLL (0x2000):

Файл изображения представляет собой библиотеку динамической компоновки (DLL). Такие файлы считаются исполняемыми файлами практически для всех целей, хотя они не может быть запущен напрямую.

Однако для IMAGE_FILE_EXECUTABLE_IMAGE (0x002):

Только изображение. Это означает, что файл изображения действителен и может быть запустить. Если этот флаг не установлен, это указывает на ошибку компоновщика.

Так как DLL не может быть напрямую запущена, у нее может не быть установлен флаг IMAGE_FILE_EXECUTABLE_IMAGE (0x002).

Я предполагаю, что эти флаги OR'd toghether приведут к ошибке во время загрузки, но я не уверен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню