2010-09-14 1 views
0

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

ответ

4

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

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

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

2

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

+0

Библиотека моя, но я потерял для нее исходный код.Длина меняется, как заставить ее работать с таким изменением? – SharpAffair

2

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

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

+0

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

2

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

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

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

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