没有任何依赖的便携式可执行文件也没有导入

问题描述

我的电脑上安装了一个程序。当我用 CFF Explorer 检查它时,我看不到任何导入或依赖项。它可能是用 Delphi 编写的。那么这种类型的 PE 是如何工作的呢?该程序的作者似乎想隐藏使用了哪些系统 DLL。我可以在自己的 Visual Studio C/C++ 环境中构建这样的 PE 文件吗?

这就是 CFF EXplorer 中 PE 文件的样子:

enter image description here

enter image description here

编辑:这是PE Explorer的截图。 PE Explorer 还说没有依赖关系。

enter image description here

解决方法

无需导入即可轻松生成可执行文件。由于这是关于 Windows,我将给出一个使用 MSVC 的示例。

您需要做的就是转到 project Properties -> Linker -> Input 并将 Ignore All Default Libraries 设置为 { {1}}。

您需要提供您自己的 Yes /NODEFAULTLIB 版本,这是 MSVC 设置的入口点的默认名称。您可以通过转至 project Properties -> Linker -> Advanced 并设置 mainCRTstartup 为您的函数名称来更改此设置想用作入口点。

或者,直接从命令行使用 Entry Pointcl.exe。完整示例:

cl.exe main.c /link /NODEFAULTLIB /ENTRY:"main"

当然,这意味着您不能使用任何 Win32 API。即使您静态链接 MSVC 提供的 C 运行时库,它仍然无法工作,因为它将使用系统 DLL 中的功能。如果您直接调用所需的系统调用,则可以解决此问题(只要您知道它们的编号,该编号可能会从一个 Windows 版本更改为另一个)。