2013-05-16 5 views
3

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

У меня есть древний неподдерживаемый инструмент, который берет ELF-файл и связанный с ним файл PLF (частично связанный файл, сгенерированный ранее в процессе сборки) и создает из него настраиваемый перемещаемый файл, который используется на платформе (PPC), с жесткие ограничения памяти. Это прекрасно работает, за исключением того, что содержит около мега кода инициализации, который мы хотим разгрузить после запуска. Поэтому мы поместили весь этот код инициализации в пользовательский раздел, чтобы его выгрузить, но, к сожалению, инструмент не может правильно обрабатывать пользовательские разделы, а файл rel недопустим. Поэтому моя задача - создать новый инструмент, который правильно генерирует этот перемещаемый файл с настраиваемым разделом.

Я получил относительно большое значение с этим инструментом и создал файл rel, но в настоящее время я увяз в попытке выяснить, как обрабатывать данные раздела и строить записи перемещения и т. Д. Я программист высокого уровня выход из моего элемента с этой задачей, поэтому все это обратное инженерное дело для меня новое (спасибо за интернет!).

Я нашел Elf Sharp и использовал это как отправную точку. Это позволяет мне загружать файлы ELF и PLF и взаимодействовать с их содержимым. Оттуда, я изменил структуру заголовка и содержимого файла перемещения, по большей части, но это далеко не точный. Когда я сравниваю версию файла старого инструмента с моим, я обнаружил, что некоторые данные раздела были исправлены, в то время как мой файл использует данные раздела прямо из файла PLF и является простым. Я имею в виду, что данные раздела, которые я скопировал, содержат тонну «48 00 00 01», но все они каким-то образом закреплены старым инструментом. Каково значение этих байтов и что делается с ними? Мне также нужно создать записи перемещения, но я не уверен, как это сделать.

Я нашел несколько примеров обработки переходов эльфа в Интернете, и у меня есть что-то похожее и работает в моем инструменте, но я все еще довольно неясен, что именно я должен делать. У меня есть хороший ресурс для всех типов переселения и их формул (глава 4.12.5 here), но я все еще не совсем уверен, какие смещения, информация о секциях и т. Д. Я должен использовать.

TL; DR

  • Можете ли вы помочь мне визуализировать то, что именно происходит с этими записями переселения, как это все формируется и обрабатывается, и как она используется, когда программа выполняется?

  • Что сделано для всех слов «48 00 00 01» в данных раздела? Я предполагаю, что они были разрешены с соответствующими символами, но как это было сделано? Использование информации .rela?

  • Кроме того, я не уверен, когда я должен использовать содержимое PLF и когда я должен использовать содержимое ELF. Я думаю, мне нужен только ELF, чтобы получить адрес загрузки и информацию о сегментах.

  • Когда я создаю фиксации перемещения (на PPC), как именно я могу оценить уравнения типа перемещения? Примеры, которые я упоминал в Интернете, на этот момент не являются интуитивными. Я смущен смещениями - вы получаете один из Elf32_Rela, но это тот, который вы модифицируете? И каково смещение, которое используется для записи результата исправления? Что такое добавление? Я ничего не нашел в Интернете, это все, что просвещало.

  • Некоторые (фактически большинство) исправлений переселения указывают на один из нескольких .debug_ * разделов или .bss. Должен ли я пропускать исправления .debug или они важны? ,bss - это раздел NoBits, так как я могу это обработать? И когда дело доходит до фактического создания записей перемещения, я понимаю, как они построены, но кто/что на самом деле стоит за внесением записей? Я имею в виду, я готов его построить, но я не знаю, с чего начать - я перебираю какие-то данные где-то или что?

  • Любые другие вопросы, которые я должен задать, но еще не поняли? ;)

Спасибо, что прочитал мой длинный вопрос!

+0

Так как я не хватает респ размещать более двух ссылок, вот два примера я упоминал: Пример 1: http://publib.boulder.ibm.com/infocenter/zos/ v1r12/index.jsp? topic =% 2Fcom.ibm.zos.r12.cbcdu01% 2Fexrelocateelffile.htm Пример 2: http://people.freebsd.org/~grehan/elf_machdep.c – thehelix

+0

Возможный дубликат [Концепция перемещение] (http://stackoverflow.com/questions/16385826/concept-of-relocation) Минимальный вариант с обратной обработкой: http://stackoverflow.com/a/30507725/895245 || https://github.com/cirosantilli/assembly-cheat/blob/9f1be213107922ac21681305440dc5d1799407e5/elf-hello-world.md –

ответ

0

Возможно, инструмент objconv может помочь. Он может отображать типы переселения в файлах ELF x86 в качестве дампа или разборки. http://www.agner.org/optimize/#objconv