我试图编辑十六进制编辑器中的库,插入模式。重点是重新命名其中的一些条目。如果我使用“Otherwrite”模式,一切正常,但每次尝试在“插入”模式下向字符串末尾添加几个符号时,库无法加载。我在这里错过的任何东西?在十六进制编辑器中编辑库,同时保持其完整性
回答
是的,你错过了很多。一个库遵循PE/COFF格式,这在整个文件中的指针非常繁重。 (例如,朝文件的开头是一个表格,指向文件中每个部分的位置)。
如果您正在编辑资源,如果您确定修改任何指向修改后的指针和大小的任何指针和大小,就可以在不破坏内容的情况下执行此操作,但我怀疑这很容易。在编辑.text段(即代码)的情况下,我怀疑你会完成它,因为函数调用和跳转的操作数是它们在代码中的位置的相对位置 - 您需要更新整个代码来解释编辑。
解决此问题的一种技术是“代码洞穴”,您可以使用显式JMP指令将一段现有代码替换为某个空白位置(您可以在运行时执行此操作,您可以在其中创建新的内存) - 您可以在其中定义一些可以是任意长度的新代码 - 然后您可以显式地将JMP返回到您调用的位置(对于JMP操作码+操作数,则为+5字节)。
你改变它们的名字与旧名称的长度相同吗?如果不是,那么所有的偏移量都会被移位。并且做任何函数互相调用?这可能是另一个问题。获得源代码会更容易(如果项目的网站不是内部的,或者来自供应商,如果它已关闭,则从项目的网站获取)并更改它们,然后重新编译它。无论如何,我很好奇你为什么要改名字。
DLL是一个复杂的二进制格式(即编译代码)。编译过程将命名函数调用转换为硬连接引用,以指向文件中的特定位置(“偏移量”)。因此,如果将字符插入文件的中间,那么在该点之后的偏移将不再与它们引用的位置实际上匹配,这意味着库中的函数调用将运行错误的代码(如果它们设法运行任何东西完全)。
基本上,底线是你正在做的事情总是打破东西。如果你不走运,它甚至可能破坏真的,并造成严重的损害。
如果您所做的只是编辑文件中的资源('.text'之外),那么“函数调用的位置”实际上不是问题 - 因为调用操作数是带符号整数,相对于它们的当前位置 - 只要整个代码块一致地移动,他们将仍然在呼叫正确的地方。 – 2010-09-14 13:55:38
当然 - 详细的格式知识以及必须改变的内容。如果您想知道为什么某些编辑会导致加载失败,那么您就错过了这些知识。
库旨在由链接器编写以使用链接器。它们遵循定义明确的格式,旨在使连接器易于编写和阅读。他们不需要像编译器那样容忍人类输入。
很简单,图书馆不打算由十六进制编辑器修改。可以通过用相同长度的名称覆盖它们来更改条目,或者可能在某处放置索引。如果你改变任何东西的长度,你可能会破坏指针和元数据。
你不给任何理由想要这样做。如果是为了好玩,那么它比你想象的要难。如果你还有其他原因,你最好得到源代码,或者让一个有源代码重新命名和重建。
- 1. .NET中的十六进制编辑
- 2. 在MFC中编写一个十六进制编辑器
- 3. 在十六进制编辑器中编写注释
- 4. 十六进制编辑与C++
- 5. 十六进制汇编编辑器命令入门?
- 6. 如何制作固定的十六进制编辑器?
- 7. 我可以在Visual Studio中十六进制编辑文件吗?
- 8. 蟒蛇十六进制编辑器二元变化
- 9. 使用十六进制编辑器打开.dat文件
- 10. 十六进制编辑器如何快速显示数据?
- 11. 为C#推荐十六进制编辑器类?
- 12. 奇怪的记事本++十六进制编辑器插件
- 13. 使用十六进制数字在新十六进制编辑器中打开文件
- 14. 使用十六进制编辑器修改库中的env变量名称?
- 15. 我如何从十六进制编辑器保护我的程序?
- 16. DataGridView的细胞编辑问题与十进制/十六进制格式
- 17. 哪个脚本编辑器可以编码十六进制颜色值?
- 18. 祝福十六进制编辑器 - 比较2个二进制文件
- 19. 注册表编辑:如何计算DWord十六进制值
- 20. 十六进制编辑dll以更改依赖项名称?
- 21. 如何以十六进制编辑.dll文件
- 22. Python - 如何编辑字节的十六进制文件字节
- 23. UCS2十六进制编码
- 24. 在vim编辑器中上下导航时保持同一列
- 25. PIC的十六进制反编译器
- 26. 十进制编辑问题ASP.NET MVC
- 27. 十六进制斌逻辑运算后
- 28. 寻找一个简单的编辑器,允许我直观地编辑十六进制颜色值
- 29. Froala编辑器在粘贴代码时保持缩进
- 30. 如何使用C编辑二进制文件的十六进制值#
该库是我的,但我失去了它的源代码。长度的变化,如何使它与这种转变一起工作? – SharpAffair 2010-09-14 13:38:03