2015-05-22 6 views
1

Возможно ли выполнить сырой двоичный файл, хранящийся в массиве символов? Я пробовал делать это так:c - загрузка исходных двоичных файлов

#include "stdio.h" 
int main(int argc, char **argv) 
{ 
    FILE *f = fopen(argv[1],"r"); 
    if(!f) 
     return 1; 
    fseek(f,0,SEEK_END); 
    long l=ftell(f); 
    rewind(f); 
    char *buf = malloc(l+1); 
    fread(buf,1,l,f); 
    fclose(f); 
    void (*func)() = (void(*))buf; 
    func(); 
} 

но это только дает мои segfaults. Я работаю над своей ОС (с нуля), поэтому я избавляюсь от них.

+0

Вы избавляетесь от кого? –

+0

Segfaults ... :) –

+0

Почему вы 'malloc()' 'l + 1'? –

ответ

1

Вы могли бы быть в состоянии сделать это, но:

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

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

Вы могли бы быть в состоянии сделать это с помощью простой ручной работы программы, которая делает системный вызов к exit(0) Ot гравюр «Hello World».

Возможно, вы скомпилировали код. Для этого вам нужно будет (по крайней мере):

  • составить самостоятельную программу (не импортированных динамических библиотек, связать библиотеки статический и перекомпилировать те статический скомпонованные библиотеки);

  • с положением-независимым кодом (-fpic из -fpie);

  • без какого-либо перемещения (возможно, -fvisibility=hidden может помочь?).

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

Вы можете посмотреть на то, как ld.so компилируется: она как ожидается, будет загружен в любом месте в виртуальном адресном пространстве и имеет подмножество себя, как предполагается, чтобы быть функциональным, прежде чем переездов (потому что ld.so перемещает себя в качестве платы за проезд, как я понимаю) ,

Но вам, вероятно, следует просто попытаться реализовать базовый загрузчик ELF (и правильно обработать перемещение).

5

Извиняюсь, что это не совсем ответ, но это слишком долго, чтобы соответствовать как комментарий ...

Я собираюсь предположить, что намерение файла для чтения с сырым двоичном в буфер получить код байт в ОЗУ, и вы хотите выполнить эти байты. Предположим, что у вас установлен I/O файл, поэтому теперь у вас есть буфер с байтами кода. Есть несколько причин, почему вы все еще можете столкнуться.

Во-первых, выполняет ли ваша O/S виртуальная память с атрибутами страницы, такими как чтение, запись и выполнение? Большинство современных O/S не позволят вам выполнять код на странице, которая не помечена как код. (Маркировка страниц таким образом важна, чтобы знать, что можно поменять местами, а также предотвратить вредоносное кодирование.)

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

В-третьих, является ли двоичный код 100% автономным? Если он обращается к любым внешним функциям, вам также нужно исправлять их.

Наконец, нужен ли двоичный код для доступа к данным? Если это так, все данные также содержатся в двоичном, а также относительном адресе против абсолютного.

+0

Является ли позиция входа по первому адресу? Соответствует ли код ABI вызывающего абонента? Как насчет пространства для переменных? Не только '.data', но и' .bss'? Вопросы, вопросы. Это более чем оптимистический подход. – Olaf

Смежные вопросы