我的计算机上安装了一个程序。当我使用 CFF Explorer 检查它时,我看不到任何导入或依赖项。您可以猜测它是一个纯资源可执行映像,但它不是。
很明显,程序的作者想要隐藏程序使用的系统DLL。我可以在自己的 Visual Studio C/C++ 环境中构建这样的 PE 文件吗?如果是的话,怎么办?
这是 PE 文件在 CFF Explorer 中的样子:
编辑:这是PE Explorer的截图。 PE Explorer 还说没有依赖性。
无需导入即可生成可执行文件非常容易。由于这是关于 Windows 的,我将给出一个使用 MSVC 的示例。
您需要做的就是转到 project Properties -> Linker -> Input 并将
Ignore All Default Libraries
设置为 Yes /NODEFAULTLIB
。
您需要提供您自己的
mainCRTstartup
版本,这是 MSVC 设置的入口点的默认名称。您可以通过转到 project Properties -> Linker -> Advanced 并将 Entry Point
设置为要用作入口点的函数的名称来更改此设置。
或者,直接从命令行使用
cl.exe
:cl.exe main.c /link /NODEFAULTLIB /ENTRY:"main"
。完整示例:
$ more main.c
int main()
{
return 0;
}
$ cl.exe main.c /link /NODEFAULTLIB /ENTRY:"main"
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29333 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
main.c
Microsoft (R) Incremental Linker Version 14.28.29333.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:main.exe
/NODEFAULTLIB
/ENTRY:main
main.obj
$ dumpbin /imports main.exe
Microsoft (R) COFF/PE Dumper Version 14.28.29333.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file main.exe
File Type: EXECUTABLE IMAGE
Summary
1000 .rdata
1000 .text
当然,这意味着您不能使用任何 Win32 API。即使您静态链接 MSVC 提供的 C 运行时库,它仍然无法工作,因为它将使用系统 DLL 中的功能。如果您直接调用所需的系统调用(只要您知道它们的编号,该编号可能会从一个 Windows 版本更改为另一个 Windows 版本),则可以解决此问题。