【问题标题】:Find out where PE file ends through PE header?通过 PE 标头找出 PE 文件在哪里结束?
【发布时间】:2010-03-11 06:11:44
【问题描述】:

我想将一些二进制数据附加到我的可执行文件的末尾。这只是为了让我的程序变成一个文件。我尝试使用 UpdateResource,但我用我的特定数据在其中遇到了一些错误,所以我必须使用另一种解决方案。所以我需要知道原始文件的大小来确定是否真的有任何数据附加到它上面。是否可以从 PE 标头中获取此信息?

谢谢!

【问题讨论】:

  • “我用我的特定数据在其中遇到了一些错误”是什么意思?据我所知,UpdateResource 只适用于二进制数据块,因此该数据的细节无关紧要。
  • UpdateResource 可以处理二进制数据块(RT_RCDATA 类型)。但是,如果您传递其他内容,则数据的细节确实很重要。例如。 “所有包含字符串或文本的数据都必须是 Unicode 格式。”这表明当它拒绝您的 ASCII 字符串时,您可能会遇到“错误”。
  • 这仅适用于您使用具有字符串数据的预定义数据类型之一。 RT_RCDATA 只是一个二进制 blob; Windows 不知道也不关心它包含什么样的数据。只要你正确序列化和反序列化它就可以正常工作。
  • 我使用 RT_RCDATA,但是当我添加其中两个时,它们会导致 kernel32.dll 崩溃。我能够使用 XN 资源编辑器重现崩溃,因此我将其视为“外部错误”并在其他地方寻找解决方案...
  • 一定是XN资源编辑器的bug。数据是不是特别大?它的结构如何?我已经使用 UpdateResource 成功地将大型 (50+ MB) zip 文件添加为资源,所以我不确定为什么您的数据会如此特别。如果你坚持走 PE 路线,我会使用 3rd 方库,因为解析 PE 文件充满危险。

标签: c++ c winapi portable-executable


【解决方案1】:

我在这里找到了我的解决方案http://www.strchr.com/creating_self-extracting_executables

【讨论】:

    【解决方案2】:

    如果你能得到每个块的大小,你也许可以。这可能会有所帮助:

    http://msdn.microsoft.com/en-us/library/ms809762.aspx

    【讨论】:

    • 我尝试对每个块的大小求和,有时它几乎可以工作,有时它给出的结果是文件大小的两倍。
    • 收回双倍文件大小的东西。这是由于加载文件的路径与我想象的不同。您还需要将 nt_header.OptionalHeader.SizeOfHeaders 添加到计算中,然后它似乎适用于某些文件:)
    【解决方案3】:

    您可能会发现这个 PE 文件阅读器很有用。 您应该能够使用此软件从 PE 标头中提取适当的值。 提供完整来源。

    http://www.objectmedia.ltd.uk/freeSoftware/peFileDLL.html

    同一站点上还有一个 PE 文件资源管理器(带有源代码)。我目前不能发布多个 URL,因为我没有足够的状态点,所以你必须解决它。

    PE 文件资源管理器允许您浏览 PE 文件的内容。

    我编写了我所指的软件(这反过来又受到 Matt Pietrek 称为 LIPOsuction 的软件工具的启发,很多很多个月前)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-06
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      相关资源
      最近更新 更多