【问题标题】:Portable Executable File Without Any Dependencies Nor Import没有任何依赖或导入的便携式可执行文件
【发布时间】:2021-05-05 13:44:27
【问题描述】:

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

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

编辑:这是 PE Explorer 的屏幕截图。 PE Explorer 也表示没有依赖关系。

【问题讨论】:

  • 我猜 CFF Explorer 是错误的,并且文件格式中的某些东西混淆了它,所以它报告没有导入,或者他们已经做了类似从 User32 复制 LoadLibraryEx 和 GetProcAddress 的实现,即他们自己进行中断调用,然后根据需要使用它们来导入更多功能。我不知道这在 Windows 版本和更新之间的兼容性如何——毕竟这是一个私有 API——或者你为什么真的想要这样做。
  • 我认为第二种可能性更大。事实上,我们想隐藏我们的应用程序使用了哪些 DLL 和函数。但这似乎相当艰巨。
  • 能否提供您分析的可执行文件?我想更深入地测试可执行文件的结构。提前谢谢1
  • 导入表为空的原因之一是可执行文件仅包含资源!这真的很常见。
  • @mox 由于我正在分析的软件是商业产品,因此可能不适合公开该产品。但是如果你可以通过以下地址联系我,我可以告诉你软件的名称:l5216006@std.yildiz.edu.tr.

标签: c++ c visual-c++ portable-executable


【解决方案1】:

生成没有导入的可执行文件非常容易。由于这是关于 Windows 的,我将举一个使用 MSVC 的示例。

您需要做的就是转到项目属性 -> 链接器 -> 输入 并将Ignore All Default Libraries 设置为Yes /NODEFAULTLIB .

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

或者,直接从命令行使用cl.execl.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 版本更改为另一个版本)。

【讨论】:

    猜你喜欢
    • 2011-05-08
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    相关资源
    最近更新 更多