【问题标题】:Edit library in hex editor while preserving its integrity在十六进制编辑器中编辑库,同时保持其完整性
【发布时间】:2011-04-12 04:18:29
【问题描述】:

我正在尝试在十六进制编辑器中编辑库,插入模式。要点是重命名其中的一些条目。如果我在“Otherwrite”模式下,一切正常,但每次我尝试在“Insert”模式下在字符串末尾添加一些符号时,库都无法加载。我在这里缺少什么吗?

【问题讨论】:

    标签: windows dll hex hex-editors


    【解决方案1】:

    当然 - 详细了解格式以及必须更改的内容。如果您想知道为什么您的某些编辑会导致加载失败,那么您就错过了这些知识。

    库旨在由链接器编写以供链接器使用。它们遵循明确定义的格式,旨在使链接器易于写入和读取。它们不需要像编译器那样容忍人工输入。

    很简单,库不打算被十六进制编辑器修改。可以通过使用相同长度的名称覆盖条目来更改条目,或者可能会在某处搞砸索引。如果您更改任何内容的长度,您可能会破坏指针和元数据。

    你没有给出任何想要这样做的理由。如果是为了好玩,嗯,这比你想象的要难。如果你有其他原因,你最好获得源代码,或者让有源代码的人重命名和重建。

    【讨论】:

      【解决方案2】:

      DLL 是一种复杂的二进制格式(即编译代码)。编译过程将命名函数调用转换为对文件中特定位置的硬连线引用(“偏移量”)。因此,如果您在文件中间插入字符,则该点之后的偏移量将不再与它们引用的实际位置匹配,这意味着库中的函数调用将运行错误的代码(如果它们设法运行任何东西)完全)。

      基本上,底线是你所做的总是会破坏东西。如果你不走运,它甚至可能真的严重损坏它并造成严重损坏。

      【讨论】:

      • 如果您所做的只是编辑文件中的资源(.text 之外),那么关于函数调用的“它们引用的位置”实际上不是问题 - 因为调用操作数是有符号整数,相对于它们当前位置的指向——只要整个代码块一致地移动,它们仍然会调用正确的位置。
      【解决方案3】:

      是的,你错过了很多。库遵循PE/COFF 格式,该格式在整个文件中的指针非常繁重。 (例如,在文件的开头是一个指向文件中每个部分的位置的表)。

      在您编辑资源的情况下,如果您确保在编辑后纠正任何指向的任何指针和大小,则有可能在不破坏任何东西的情况下完成此操作,但我怀疑这会很容易。如果您正在编辑 .text 部分(即代码),那么我怀疑您会完成它,因为函数调用和跳转的操作数是它们在代码中位置的相对位置 - 您需要更新考虑编辑的整个代码。

      克服此问题的一种技术是“代码洞穴”,您可以在其中使用显式 JMP 指令将一段现有代码替换到某个空位置(您可以在运行时执行此操作,您可以在其中创建新内存) - 你定义了一些可以是任意长度的新代码 - 然后你明确地 JMP 回到你调用的地方(+5 字节表示 JMP 操作码 + 操作数)。

      【讨论】:

        【解决方案4】:

        您要更改的名称是否与旧名称的长度相同?如果不是,那么所有东西的偏移量都会被移动。是否有任何功能相互调用?这可能是另一个问题点。获取源代码会更容易(如果它不是内部的,则从项目的网站获取,或者如果它已关闭,则从供应商获取)并在其中更改它们,然后重新编译它。我很好奇你为什么要改名字。

        【讨论】:

        • 这个库是我的,但我丢失了它的源代码。长度变化,如何使它与这种变化一起工作?
        猜你喜欢
        • 2012-02-12
        • 2011-06-10
        • 2018-02-01
        • 2012-05-07
        • 1970-01-01
        • 2011-11-20
        • 2013-02-22
        • 2016-08-10
        • 2021-11-19
        相关资源
        最近更新 更多