Редактировать библиотеку в шестнадцатеричном редакторе, сохраняя ее целостность - PullRequest
0 голосов
/ 14 сентября 2010

Я пытаюсь редактировать библиотеку в шестнадцатеричном редакторе, режим вставки.Суть в том, чтобы переименовать несколько записей в нем.Если я сделаю это в режиме «Otherwrite», все работает нормально, но каждый раз, когда я пытаюсь добавить несколько символов в конец строки в режиме «Insert», библиотека не загружается.Что-то мне здесь не хватает?

Ответы [ 4 ]

4 голосов
/ 14 сентября 2010

Да, вам не хватает много. Библиотека следует формату PE / COFF , что довольно сильно влияет на указатели по всему файлу. (Например, в начале файла находится таблица, которая указывает на расположение каждого раздела в файле).

В случае, если вы редактируете ресурсы, есть возможность сделать это без поломок, если вы убедитесь, что вы исправили любые указатели и размеры для всего, на что указывают после ваших правок, но я сомневаюсь, что это будет легко. В случае, если вы редактируете секцию .text (т. Е. Код), то я сомневаюсь, что вы это сделаете, поскольку операнды вызовов функций и переходы являются относительными позициями относительно их позиции в коде - вам необходимо обновить весь код для учета правок.

Одним из способов преодоления этой проблемы является «пещера кода», в которой часть существующего кода заменяется явной инструкцией JMP на какое-то пустое место (это можно сделать во время выполнения, когда у вас есть возможность создать новую память). ) - где вы определяете некоторый новый код, который может иметь произвольную длину, - то вы явно возвращаете JMP туда, откуда вы вызывали (+5 байтов, скажем, для опкода JMP + операнд).

2 голосов
/ 14 сентября 2010

Конечно - детальное знание формата и того, что должно измениться.Если вам интересно, почему некоторые из ваших изменений приводят к сбою загрузки, вам не хватает этих знаний.

Библиотеки предназначены для написания компоновщиком для использования компоновщиком.Они следуют четко определенному формату, который предназначен для того, чтобы компоновщик мог легко писать и читать.Им не нужен допуск для человеческого ввода, как это делает компилятор.

Очень просто, библиотеки не предназначены для изменения шестнадцатеричными редакторами.Может быть возможно изменить записи, перезаписав их именами одинаковой длины, или это может испортить индекс где-то.Если вы изменяете длину чего-либо, вы, вероятно, нарушаете указатели и метаданные.

У вас нет никаких причин желать этого.Если это ради развлечения, то это сложнее, чем вы ожидали.Если у вас есть другая причина, вам лучше получить источник или найти кого-то, у кого есть источник, чтобы переименовать и восстановить.

2 голосов
/ 14 сентября 2010

DLL - это сложный двоичный формат (т. Е. Скомпилированный код).Процесс компиляции превращает вызовы именованных функций в жестко привязанные ссылки на определенные позиции в файле («смещения»).Поэтому, если вы вставите символы в середину файла, смещения после этой точки больше не будут совпадать с тем, что на самом деле находится в позиции, на которую они ссылаются, а это означает, что вызовы функций в вашей библиотеке будут выполнять неправильный код (если им удастся запустить что-либовообще).

По сути, суть в том, что вы делаете, всегда будете ломать вещи.Если вам не повезет, он может даже сломать его очень и нанести серьезный урон.

2 голосов
/ 14 сентября 2010

Имена, которые вы меняете, имеют ту же длину, что и старые имена? Если нет, то смещения всего смещены. И какие-нибудь функции вызывают друг друга? Это может быть еще один проблемный момент. Было бы проще получить исходный код (с веб-сайта проекта, если он не является внутренним, или у поставщика, если он закрыт), изменить его в нем и затем перекомпилировать. Мне любопытно, почему вы все равно меняете имена.

...