Я пишу небольшой инструмент для экспериментов с объектным кодом ELF-64, который предназначен для анализа и загрузки объектного кода ELF-64 для выполнения в родительском процессе.Я верю, что сейчас на правильном пути, но мне нужны некоторые указатели для последних шагов.
Шаг 1: Я анализирую объектный файл и извлекаю всю необходимую информацию.Я подтвердил, что это правильно, используя инструмент readelf
.
Шаг 2: Я перебираю все заголовки секций с набором SHF_ALLOC
-бит и памятью mmap
.
Шаг 3: Этот, казалось бы, простой и бесполезный объект, состоящий только из main
-программы и оператора return, не требует перемещения символов, насколько я знаю (я дваждыпроверил с readelf
).Я скомпилировал с TinyCC, чтобы избежать выброса .eh_frame
и записей о его перемещении.
Но на этом этапе мне нужно загрузить в память разделы с SHF_ALLOC
-битами, и вот где яподозреваю, что я делаю не так.
offset = 0
foreach section in sections
if section.flags & SHF_ALLOC
memcpy(memory_address + offset, object_code + section.offset, section.size)
offset += section_size
Шаг 4: Последний шаг, в котором я тоже не уверен.Мне нужно позвонить в выделенную память, которую я пометил как исполняемый.
typedef int (main_t)(int argc, char* argv[]);
((main_t)object->address)(0, NULL);
Я был бы очень признателен за некоторую информацию по этому вопросу.Я считаю, что это сводится к отсутствию понимания, что именно содержит .text
-сегмент и как они предназначены для хранения в памяти.
Некоторые мысли:
- - это
main
расположены по смещению 0x0
в .text
-сегменте? - - это выделенные сегменты, предназначенные для последовательного сохранения с правильными выравниваниями?
Что-нибудь, чтобы указать мне правильное направлениепоможет безмерно!Спасибо!
PS.Я собираюсь узнать о перемещении символов в ближайшее время.Один шаг за раз.: -)