Возможно ли, чтобы файл одновременно исполнялся (EXE) и библиотека динамической компоновки (DLL)? (Например, он может быть выполнен как EXE и загружен во время выполнения в качестве общей библиотеки.)
Я не понимаю, почему это невозможно, но может кто-нибудь может дать объяснение?
Название модуля. Это может быть либо библиотечный модуль (файл .dll), либо исполняемый модуль (файл .exe). Указанное имя - это имя файла модуля и не связано с именем, хранящимся в самом модуле библиотеки, как определено ключевым словом LIBRARY в файле module-definition (.def).
РЕДАКТИРОВАТЬ: Я ожидал downvotes, когда я написал этот ответ. Я знаю, что многие люди думают, что это невозможно (ответы на вопросы и ответы из комментариев подтверждают это). Но для тех, кого это интересует, я могу предоставить POC (или просто посмотреть на хорошо известные источники процесса).
Обратите внимание: если вам нужно экспортировать символы из модуля, вам нужно использовать эти операторы EXPORT в файле .def
. Затем вы можете использовать GetProcAddress
Собственно, я вижу, что этот вопрос SO, также упоминаемый в комментариях, имеет ответ, который указывает на статью "Загрузить EXE как DLL: Mission Possible" , который я также собирался процитировать. Этот ответ не принят, принятый ответ говорит "нет" и даже принимается как вики сообщества. Well "SO не претендует на то, чтобы быть (частично) ссылкой на библиотеку"
В официальной документации 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 приведут к ошибке во время загрузки, но я не уверен.