我正在尝试在HEX编辑器插入模式中编辑库。要点是重命名其中一些条目。如果我以“ shorewrite”模式做到这一点,一切都很好,但是每次我尝试在“插入”模式的字符串末端添加一些符号时,库都无法加载。我在这里缺少什么?

有帮助吗?

解决方案

是的,您缺少很多。图书馆遵循 PE/COFF 格式,在整个文件中的指针上都很重。 (例如,文件开头是一个表,指向文件中每个部分的位置)。

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

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

其他提示

您的名字是否将其更改为与旧名称相同的长度?如果没有,那么一切的偏移就会改变。并且任何功能都互相称呼吗?那可能是另一个问题点。获取源代码(如果不是内部的话,也可以从项目的网站上获得,或者在供应商已关闭的情况下从项目的网站上进行更容易)并在此更改它们,然后对其进行重新编译。我很好奇您为什么要更改名称。

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

基本上,底线是您要做的事情总是会破坏东西。如果您不幸,它甚至可能会破坏它 真的 严重造成严重损害。

当然 - 对格式的详细知识以及必须改变的内容。如果您想知道为什么某些编辑导致负载失败,那么您就会缺少这些知识。

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

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

您没有任何理由想这样做。如果是为了娱乐,那就比您预期的要难。如果您有另一个原因,最好是获得来源,或者得到一个有能力重命名和重建的人。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top