Редактировать библиотеку в редакторе HEX, сохраняя свою целостность

StackOverflow https://stackoverflow.com/questions/3709314

  •  02-10-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top