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


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

发布于 2021-02-01 20:13:55
在没有导入的情况下生成可执行文件是非常容易的。因为这是关于Windows的,所以我将给出一个使用MSVC的示例。
您所需要做的就是转到项目Properties -> Linker -> Input并将Ignore All Default Libraries设置为Yes /NODEFAULTLIB。
您需要提供自己的mainCRTstartup版本,这是由MSVC设置的入口点的默认名称。您可以通过转到项目属性、链接器、->高级并将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中的功能。如果您直接调用所需的syscall,则可以解决此问题(只要您知道它们的编号,不同的Windows版本可能会有所不同)。
https://stackoverflow.com/questions/65991737
复制相似问题