可移植的可执行文件,没有任何 DLL 依赖项或导入表

问题描述 投票:0回答:1

我的计算机上安装了一个程序。当我使用 CFF Explorer 检查它时,我看不到任何导入或依赖项。您可以猜测它是一个纯资源可执行映像,但事实并非如此。它有一个 .text 部分,其中包含有效的可执行代码和该

.text
部分的入口点。
很明显,它以某种方式加载并链接到系统库,因为否则,用户模式应用程序在不调用任何系统 API 的情况下无法执行任何有用的操作。

如果答案可以回答这些问题那就太好了:

    这样的PE图像怎么可能?
  1. 他们使用哪种技术?
  2. 如果可能的话,还有一个最小的工作示例代码。
  3. 这是 PE 文件在 CFF Explorer 中的样子:

enter image description here

enter image description here 这是 PE Explorer 的屏幕截图。 PE Explorer还说没有导入表。

enter image description here

c++ c visual-c++ portable-executable
1个回答
2
投票

您需要做的就是转到

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 版本),则可以解决此问题。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.