文件是否可以同时是可执行文件(EXE)和动态链接库(DLL)? (即,它可以作为EXE执行,并在运行时作为共享库加载。)
我无法理解为什么它不可能,但也许有人可以给出解释?
答案 0 :(得分:7)
来自LoadLibrary文档:
编辑:当我写下这个答案时,我预计会发生一些问题。我知道很多人认为这是不可能的(所以问题和评论的答案都证实了这一点)。但是对于那些感兴趣的人我可以提供POC(或者只是看一下众所周知的“过程探索者”来源)模块的名称。 这可以是库模块(.dll文件)或可执行模块(.exe文件)。指定的名称是模块的文件名,与库模块本身中存储的名称无关,由模块定义(.def)文件中的LIBRARY关键字指定。
请注意,如果您需要从模块导出符号,则需要在.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)
标志。
我想,这些标志或者在加载时会导致错误,但我不确定。