LINUX.ORG.RU

Сообщения Digan

 

[c++] Смещение точки входа

Приветствую.

Как можно вычислить смещение точки входа в ELF-файле? Изучая ELF формат я пока этого не понял. В заголовке есть только адрес. Заметил, что смещение точки входа иногда совпадает с началом кодовой секции .text и в секционном заголовке есть ее смещение, но так ведь не всегда.

 

Digan
()

[readelf] Импортируемые функции

Как с помощью информации выданной readelf узнать о том, что функция импортируемая?

Можно ли сделать об этом вывод если символ имеет тип FUNC и индекс UND?

Например

Num:    Value  Size Type    Bind   Vis      Ndx Name

59: 00000000     0 FUNC    GLOBAL DEFAULT  UND _ZN11QMessageBoxC1EP7QWid

Может есть какие-то другие признаки импортируемых функций? Конечно когда имя функции тебе знакомо и об импорте можно догадаться из названия. А как быть в противном случае?

Digan
()

[c++] Длина имени секции

В одной из секций ELF-файла хранятся имена остальных секций. Индекс этой секции в секционном заголовке указан в ELF-заголовке. Допустим я знаю адрес этой секции и смещение в этой секции по которому находится нужное мне имя. Вопрос в том, где хранится число определяющее длину этого имени? В случаях которые я раньше встречал длина строки была прямо перед самой строкой. Тогда я просто считывал сначала длину, а затем имя. Как быть с именами секций ELF-файлов? Ведь перед именами секций стоят нули.

 

Digan
()

[C++] ELF - Количество записей в программном заголовке

Занимаюсь анализом Elf-файлов. Возник вопрос по таблице программного заголовка. По смещению 0x1C в ELF-заголовке указано смещение где начинается эта таблица. Далее по смещению 0x2A указан размер одной записи в этой таблице(обычно 32 байта), а по смещению 0x2C количество этих записей в таблице. Первые 4 байта каждой из записей таблицы указывают на тип секции. Судя по документации они могу принимать такие значения:

    file.seek(phOffset + 0x00);
    file.read((char*)&programHeader.p_type, sizeof(int));
    switch(programHeader.p_type)
    {
    case 0: return "Record ignored";
        break;
    case 1: return "Loadable Segment";
        break;
    case 2: return "Dynamic Section";
        break;
    case 3: return "Program Interpreter";
        break;
    case 4: return "Notes";
        break;
    case 5: return "Element of this type do not conform to the ABI";
        break;
    case 6: return "Specifies the location and size of the program header table itself (in file and in memory image of program)";
        break;
    case 0x60000000: return "Values in this inclusive range are reserved for OS-specific semantics.";
        break;
    case 0x6fffffff: return "Values in this inclusive range are reserved for OS-specific semantics.";
        break;
    case 0x70000000: return "Values in this inclusive range are reserved for processor-specific semantics.";
        break;
    case 0x7fffffff: return "Values in this inclusive range are reserved for processor-specific semantics.";
        break;
    default: return "Unknown";
    }

В одном из файлов, судя по числу по смещению 0x2C, 9 записей в таблице программного заголовка. Но смотря все 9 записей тип секций определяется только у первых 6 секций. Шестая имеет тип notes. У остальных трех записей в начале стоит число, которых нет в документации. А именно 50E5, 51E5, 52E5. То есть в свитче срабатывает default. Что это? Я неправильно определяю количество записей в таблице программного заголовка или эти числа тоже имеют свое значение?

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

 

Digan
()

RSS подписка на новые темы