【问题标题】:How can a windows executable be of only 128 byteswindows可执行文件怎么可能只有128个字节
【发布时间】:2026-01-21 13:00:02
【问题描述】:

查看this post,它描述了一种将可执行​​代码放入 DICOM 文件的前 128 个字节(即前导部分)的技术。这样 DICOM 就可以被视为 DICOM 和 PE 可执行文件。

This git repo 也证明了这一点。但是它们不显示代码,而只有二进制文件。

现在我的问题。一个可执行文件怎么能只保存在 128 字节,因为我知道最小的 exe 将占用来自thisthisthis SO 帖子的至少几个 KB?

【问题讨论】:

  • AFAIK 在 64 位之前的 Windows 上最小的可执行文件是两个字节(基本上只是 INT 20h),尽管您不能将它添加到任何大于 64k 的文件中。正如您的第二个链接所示,最小的 PE 可执行文件似乎是 97 字节。最后,通过浏览文章,您不需要将可执行文件放入 128 字节;您只需要将 PE header 放入 128 个字节。这么小的可执行文件总是用汇编语言手工制作的,所以这个问题肯定不是language-agnostic
  • @Amadan '您只需要将 PE 标头放入 128 个字节' - 那么可执行文件的其余部分在哪里,我们如何告诉跳转到那个位置?
  • 再次声明,不是专家,也没有完整阅读文章;但是可能没有理由不能在图像数据之后隐藏其他代码(除非图像格式对文件结尾敏感);甚至在图像数据中,作为隐写码。你怎么跳过去?我希望你以同样的方式跳转到程序集的任何其他地方(鉴于 128 字节的 PE 标头已经可以具有可执行代码)。

标签: windows language-agnostic executable portable-executable


【解决方案1】:

image 1 来看,它看起来很简单,有效的 DOS 标头放置在空闲区域,而完整的 PE 图像稍后嵌入文件中,作者将它放在两个合法的 DICOM 之间例如元条目。 DOS 头非常短,并且有一个名为 e_lfanew 的字段,它将文件偏移量保存到 IMAGE_NT_HEADERS。换句话说,您实际上并不需要 128 字节的完整图像,您可以将其嵌入文件中的任何位置,只要它不干扰 DICOM,一开始只需要 dos 标头。

【讨论】:

  • 只有 1 个更新:在 dicom 文件中,我们不能按原样放置内容,因为那样它就不再是有效的 dicom。所以它必须保存在dicom private tag
【解决方案2】:

在回答如何将可执行文件放入 128 字节之前,我们需要先了解一些事情。

  1. dicom 文件的字节 121-124(前缀部分)必须包含字符 DICM(文件扩展名)才能被识别为 dicom 文件
  2. Windows 可执行文件必须在文件的前 64 个字节中包含 DOS 标头,才能按照 PE(可移植可执行)文件格式执行。
  3. 结合以上 2 点,创建了一种名为 PEDICOM 的新文件格式,它既是 dicom 又是可执行文件。 PEDICOM 的架构如上图所示。
  4. PEDICOM 在不同部分包含可执行文件的标头和内容,因为整个可执行文件无法容纳在 128 字节内。
  5. Windows 提供结构列表和 Win32 API 以在 winnt.h 标头中逐节读取/写入这些 PE 文件。

创建 PEDICOM 文件:

  1. DOS 标头 (IMAGE_DOS_HEADER) 有一个名为 e_lfanew 的字段,其中包含实际 PE 内容的偏移量。这允许将整个可执行代码保存在至少 2 个内存位置。
  2. PE Header (IMAGE_NT_HEADER) 包含节数和指向节的指针(代码、数据、堆栈等)

现在回答最初的问题,不能将整个可执行文件保存在 128 个字节中。然而,128 字节的数据足以将文件声明为可执行文件,即 dos headerdos stub 可以保存在 128 字节中,而可执行文件的其余部分可以保存在其他地方,在这种情况下,在私有 dicom 标记中并且标题中的一个字段可以指向这个。使包含文件成为有效且合法的可执行文件。

【讨论】:

    最近更新 更多