Как можно вычислить смещение точки входа в ELF-файле?
Изучая ELF формат я пока этого не понял. В заголовке есть только адрес.
Заметил, что смещение точки входа иногда совпадает с началом кодовой секции .text и в секционном заголовке есть ее смещение, но так ведь не всегда.
Как с помощью информации выданной readelf узнать о том, что функция импортируемая?
Можно ли сделать об этом вывод если символ имеет тип FUNC и индекс UND?
Например
Num: Value Size Type Bind Vis Ndx Name
59: 00000000 0 FUNC GLOBAL DEFAULT UND _ZN11QMessageBoxC1EP7QWid
Может есть какие-то другие признаки импортируемых функций?
Конечно когда имя функции тебе знакомо и об импорте можно догадаться из названия. А как быть в противном случае?
В одной из секций ELF-файла хранятся имена остальных секций.
Индекс этой секции в секционном заголовке указан в ELF-заголовке.
Допустим я знаю адрес этой секции и смещение в этой секции по которому находится нужное мне имя.
Вопрос в том, где хранится число определяющее длину этого имени?
В случаях которые я раньше встречал длина строки была прямо перед самой строкой. Тогда я просто считывал сначала длину, а затем имя.
Как быть с именами секций 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.
Что это? Я неправильно определяю количество записей в таблице программного заголовка или эти числа тоже имеют свое значение?
Вообще есть проверенные анализаторы, чтобы я мог сверить с ними и проверить адекватность данных, выдаваемых моей программой?