0

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

4

4 回答 4

4

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

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

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

于 2010-09-14T13:38:31.167 回答
2

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

于 2010-09-14T13:34:32.457 回答
2

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

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

于 2010-09-14T13:39:40.043 回答
2

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

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

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

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

于 2010-09-14T13:40:08.730 回答