2010-09-14 60 views

回答

4

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

如果您正在编辑资源,如果您确定修改任何指向修改后的指针和大小的任何指针和大小,就可以在不破坏内容的情况下执行此操作,但我怀疑这很容易。在编辑.text段(即代码)的情况下,我怀疑你会完成它,因为函数调用和跳转的操作数是它们在代码中的位置的相对位置 - 您需要更新整个代码来解释编辑。

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

2

你改变它们的名字与旧名称的长度相同吗?如果不是,那么所有的偏移量都会被移位。并且做任何函数互相调用?这可能是另一个问题。获得源代码会更容易(如果项目的网站不是内部的,或者来自供应商,如果它已关闭,则从项目的网站获取)并更改它们,然后重新编译它。无论如何,我很好奇你为什么要改名字。

+0

该库是我的,但我失去了它的源代码。长度的变化,如何使它与这种转变一起工作? – SharpAffair 2010-09-14 13:38:03

2

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

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

+0

如果您所做的只是编辑文件中的资源('.text'之外),那么“函数调用的位置”实际上不是问题 - 因为调用操作数是带符号整数,相对于它们的当前位置 - 只要整个代码块一致地移动,他们将仍然在呼叫正确的地方。 – 2010-09-14 13:55:38

2

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

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

很简单,图书馆不打算由十六进制编辑器修改。可以通过用相同长度的名称覆盖它们来更改条目,或者可能在某处放置索引。如果你改变任何东西的长度,你可能会破坏指针和元数据。

你不给任何理由想要这样做。如果是为了好玩,那么它比你想象的要难。如果你还有其他原因,你最好得到源代码,或者让一个有源代码重新命名和重建。

相关问题