一个文件既可以是可执行文件(EXE),也可以是dynamic链接库(DLL)?

一个文件可能同时是可执行文件(EXE)和dynamic链接库(DLL)吗? (也就是说,它可以作为EXE执行,并在运行时作为共享库加载)。

我看不出为什么不可能,但也许有人可以给出解释?

从LoadLibrary文档:

模块的名称。 这可以是库模块(.dll文件)或可执行模块(.exe文件) 。 指定的名称是模块的文件名,与模块定义(.def)文件中的LIBRARY关键字所指定的与库模块本身中存储的名称无关。

编辑:我期待downvotes当我写这个答案。 我知道很多人认为这是不可能的(所以问题和意见的答案证实了这一点)。 但对于那些有兴趣的人,我可以提供POC(或只是看看众所周知的“过程资源管理器”来源)

请注意,如果您需要从模块中导出符号,则需要在.def文件中使用这些EXPORT语句。 然后你可以使用GetProcAddress

实际上,我看到这个问题也在评论中提到,已经回答了文章“Load EXE as DLL:Mission Possible” ,这也是我要引用的。 答案不被接受,接受答案说“不”,甚至被当作社区维基。 那么“所以不声称是(部分)图书馆的参考”

在官方的PE文档中, IMAGE_FILE_EXECUTABLE_IMAGE (0x002)IMAGE_FILE_DLL (0x2000)都是PE-header Characteristics字段的标志。

IMAGE_FILE_DLL (0x2000)

该图像文件是一个动态链接库(DLL)。 尽管无法直接运行这些文件,但几乎可以将这些文件视为可执行文件。

但是,对于IMAGE_FILE_EXECUTABLE_IMAGE (0x002)

只有图像。 这表示图像文件是有效的,可以运行。 如果此标志未设置,则表示链接器错误。

由于该DLL不能直接运行,因此可能没有设置IMAGE_FILE_EXECUTABLE_IMAGE (0x002)标志。

我想,这些标志或者会在加载时导致错误,但我不确定。