[решено] Как собрать ELF из бинарного кода?

Модератор: Модераторы разделов

max100
Сообщения: 12

[решено] Как собрать ELF из бинарного кода?

Сообщение max100 »

Есть скомпилированный бинарный код
Есть адрес в памяти куда он грузится и откуда стартует
скажем .init : 0xc0008000 (кернел код)
Есть адреса и названия функций в этом коде

Нужно сделать полноценный ELF файл с нужными секциями для отладчика/дизасемблера. Не знаю как наверно через ассемблерный код с описанием секций но как вставить бинарный код вместо асм кода и где как указывать адрес загрузки адреса функций. Описание формата ELF смотрел, не помогло.
Спасибо сказали:
Sleeping Daemon
Сообщения: 1450

Re: [решено] Как собрать ELF из бинарного кода?

Сообщение Sleeping Daemon »

max100 писал(а):
05.08.2013 16:11
Есть скомпилированный бинарный код
Есть адрес в памяти куда он грузится и откуда стартует
скажем .init : 0xc0008000 (кернел код)
Есть адреса и названия функций в этом коде

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

Дизассемблировать, а потом скомпилировать.
Спасибо сказали:
max100
Сообщения: 12

Re: [решено] Как собрать ELF из бинарного кода?

Сообщение max100 »

а. это не правильно
б. это не возможно

правильное решение явно есть
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: [решено] Как собрать ELF из бинарного кода?

Сообщение serzh-z »

max100 писал(а):
05.08.2013 16:11
Есть скомпилированный бинарный код
Задача звучит как "Есть варённое мясо, как сделать из него борщ?". Скомпилированный во что? Если это машинный код, есть информация о выравнивании, наборе используемых инструкций и архитектуре, базовом адресе, относительно которого делаются переходы и нет ссылок на внешние символы, то можно разобраться со структурой раздела ELF, прикрутить к этому коду заголовки, а потом слинковать его с загрузчиком типа ld-linux.so, натравив на него ld.

Можно, в конце концов, сделать приложение, которое будет запускаться, загружать этот код в память по адресу 0xc0008000 и просто передать управление на начало этого кода. Что-то типа:

Код: Выделить всё

int f;
void *a;

f = open("binary", O_RDONLY);
a = mmap(0xc0008000, len, PROT_READ | PROT_EXEC, MAP_PRIVATE, f, 0);

__asm__ ("jmp <a>" ...)


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

Re: [решено] Как собрать ELF из бинарного кода?

Сообщение max100 »

Я же написал - адрес в памяти известен. Код машинный, я думал это и так понятно.
В общем нашел я то что нужно
elf.asm

Код: Выделить всё

format    ELF

section '.text' executable

file '/home/max100/my.bin'


fasm /home/max100/elf.asm elf.o
мне запускать его не нужно, а лишь подготовить для objdump

Можно, в конце концов, сделать приложение, которое будет запускаться, загружать этот код в память по адресу 0xc0008000 и просто передать управление на начало этого кода.

Спасибо, это может пригодиться.

ps. или так, под gas

.text
.incbin "/home/max100/my.bin"

Ну я не программист, но вы то что как партизаны? :)
Спасибо сказали: