文件可以同时是可执行文件(EXE)和动态链接库(DLL)吗?

时间:2016-08-24 19:02:57

标签: c++ windows dll exe

文件是否可以同时是可执行文件(EXE)和动态链接库(DLL)? (即,它可以作为EXE执行,并在运行时作为共享库加载。)

我无法理解为什么它不可能,但也许有人可以给出解释?

2 个答案:

答案 0 :(得分:7)

来自LoadLibrary文档:

  

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

编辑:当我写下这个答案时,我预计会发生一些问题。我知道很多人认为这是不可能的(所以问题和评论的答案都证实了这一点)。但是对于那些感兴趣的人我可以提供POC(或者只是看一下众所周知的“过程探索者”来源)

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

实际上,我发现在评论中也提到的SO question已回答指向文章"Load EXE as DLL: Mission Possible"的问题,我也引用了这篇文章。答案不被接受,接受的答案说“不”,甚至被视为社区维基。那么"SO doesn't claim to be (in part) a library reference"

答案 1 :(得分:2)

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

IMAGE_FILE_DLL (0x2000)

所示
  

图像文件是动态链接库(DLL)。这样的文件是   几乎所有目的都考虑了可执行文件,尽管它们   不能直接运行。

然而,对于IMAGE_FILE_EXECUTABLE_IMAGE (0x002)

  

仅图片。这表示图像文件有效且可以   跑。如果未设置此标志,则表示链接器错误。

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

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