Windows 在十六进制编辑器中编辑库,同时保持其完整性

Windows 在十六进制编辑器中编辑库,同时保持其完整性,windows,dll,hex,hex-editors,Windows,Dll,Hex,Hex Editors,我正在尝试以十六进制编辑器插入模式编辑库。要点是重命名其中的几个条目。如果我使用Otherwrite模式,一切正常,但每次我尝试在插入模式下向字符串末尾添加一些符号时,库都无法加载。我有什么遗漏吗 您要更改的名称是否与旧名称的长度相同?如果不是,那么所有的偏移量都会移动。这些函数之间有相互调用的吗?这可能是另一个问题。如果项目不是内部的,那么从项目的网站上获取源代码会更容易,如果项目关闭,那么从供应商那里获取源代码并在其中进行更改,然后重新编译。我很好奇你为什么要改名字。是的,你错过了很多。库遵

我正在尝试以十六进制编辑器插入模式编辑库。要点是重命名其中的几个条目。如果我使用Otherwrite模式,一切正常,但每次我尝试在插入模式下向字符串末尾添加一些符号时,库都无法加载。我有什么遗漏吗

您要更改的名称是否与旧名称的长度相同?如果不是,那么所有的偏移量都会移动。这些函数之间有相互调用的吗?这可能是另一个问题。如果项目不是内部的,那么从项目的网站上获取源代码会更容易,如果项目关闭,那么从供应商那里获取源代码并在其中进行更改,然后重新编译。我很好奇你为什么要改名字。

是的,你错过了很多。库遵循这种格式,这在整个文件中对指针的使用非常多。例如,文件的开头是一个表,它指向文件中每个部分的位置

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


克服这一问题的一种技术是代码洞,您可以在运行时使用显式JMP指令将现有代码替换到某个空位置,当您能够创建新内存时-在其中定义一些可以是任意长度的新代码时-然后显式地将JMP返回到从+5字节调用的位置,例如JMP操作码+操作数。

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


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

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

库是由链接器编写以供链接器使用的。它们遵循一种定义良好的格式,以便于链接器的写入和读取。他们不需要像编译器那样容忍人为输入

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


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

库是我的,但我丢失了它的源代码。长度变化,如何使其在这种移位中工作?如果您所做的只是在.text之外编辑文件中的资源,那么它们在函数调用中引用的位置实际上不是问题-因为调用操作数是有符号整数,指向相对于当前位置的位置-只要整个代码块一致移动,他们仍然会调用正确的位置。