#c #elf #sections
#c #elf #разделы
Вопрос:
Привет, итак, я пытаюсь закодировать программу, которая анализирует ELF, а затем создает его копию, используя проанализированную информацию. Я смог скопировать заголовок elf и заголовки program файлов elf (readelf -l и -h идентичны оригинальным). Но я борюсь с разделами
int parse64elfsec(t_elf_file ef)
{
Elf64_Shdr shdr;
unsigned char *ptr = (unsigned char *)ef.file ef.elf64header.e_shoff;
unsigned int i = 0;
while (i < ef.elf64header.e_shnum)
{
memcpy(amp;shdr, ptr, sizeof(Elf64_Shdr));
ptr = sizeof(Elf64_Shdr);
if (shdr.sh_type != SHT_NOBITS)
{
write(ef.wfd, (unsigned char *)ef.file shdr.sh_offset, shdr.sh_size);
}
i ;
}
return (0);
}
Это то, что я сейчас делаю, но я не получаю все разделы, которые кажутся, потому что двоичный файл продукта вдвое меньше исходного и имеет ошибки.
Кто-нибудь может увидеть, что я здесь упускаю?
Редактировать :
Вот мой репозиторий, если кто-то хочет получить полный контекст / попробуйте.
Все используемые здесь макросы и структуры определяются elf.h (man 5 elf). Кроме t_elf_file, это содержит
- ef.file -> исходный исполняемый файл, отображенный в памяти
- ef.wfd -> дескриптор файла создаваемого исполняемого файла
- ef.elf64header -> Elf64_Ehdr (заголовок) исполняемого файла, который мы анализируем
редактировать 2: после некоторых дополнительных исследований я напечатал смещения, с которых начинается и заканчивается каждый раздел:
Finished to parse ph, they finish at : 2a8
Starting to parse section start: 0 | end : 0
Starting to parse section start: 2a8 | end : 2c4
Starting to parse section start: 2c4 | end : 2e4
Starting to parse section start: 2e4 | end : 308
Starting to parse section start: 308 | end : 32c
Starting to parse section start: 330 | end : 3d8
Starting to parse section start: 3d8 | end : 45a
Starting to parse section start: 45a | end : 468
Starting to parse section start: 468 | end : 488
Starting to parse section start: 488 | end : 548
Starting to parse section start: 548 | end : 560
Starting to parse section start: 1000 | end : 1017
Starting to parse section start: 1020 | end : 1040
Starting to parse section start: 1040 | end : 1048
Starting to parse section start: 1050 | end : 11b1
Starting to parse section start: 11b4 | end : 11bd
Starting to parse section start: 2000 | end : 2010
Starting to parse section start: 2010 | end : 204c
Starting to parse section start: 2050 | end : 2158
Starting to parse section start: 2de8 | end : 2df0
Starting to parse section start: 2df0 | end : 2df8
Starting to parse section start: 2df8 | end : 2fd8
Starting to parse section start: 2fd8 | end : 3000
Starting to parse section start: 3000 | end : 3020
Starting to parse section start: 3020 | end : 3030
Starting to parse section start: 3030 | end : 3038
Starting to parse section start: 3030 | end : 304c
Starting to parse section start: 3050 | end : 3650
Starting to parse section start: 3650 | end : 3852
Starting to parse section start: 3852 | end : 3959
First section header at : 3960
Мы видим несколько странных вещей :
1)
Starting to parse section start: 3030 | end : 3038
Starting to parse section start: 3030 | end : 304c
-> эти два раздела начинаются с одного и того же смещения
2)
Starting to parse section start: 308 | end : 32c
Starting to parse section start: 330 | end : 3d8
-> эти два раздела не следуют друг за другом, поэтому каковы эти байты между этими двумя разделами?
Чтобы получить этот результат, я просто добавил этот printf над if в данном коде
printf("Starting to parse section start: %lx | end : %lxn", shdr.sh_offset, shdr.sh_offset shdr.sh_size);
Комментарии:
1. Вы должны предоставить нам компилируемую программу. Таким образом, мы можем понять, что мы видим. Лично я не знаю, что такое «Elf64_Shdr». С полной программой я мог бы понять, по крайней мере, предоставляется ли она библиотекой или вы написали ее самостоятельно.
2. Я думаю, что «for ()» было бы лучше вместо «while ()».
3. Хорошо, спасибо за руководство, я обновлю свой вопрос этой дополнительной информацией. Кстати, Elf64_Shdr определяется elf.h (man 5 elf).
4. Вы должны проверить, соответствует ли
e_shentsize
файлsizeof(Elf64_Shdr);
на вашем компьютере. Если этот ELF был скомпилирован для другой arch, возможно, вы неправильно читаете заголовки разделов.5. Да, они оба по 64 байта, двоичный файл, на котором я это тестирую, был скомпилирован в той же среде, что и моя среда разработки. Я ценю помощь, хотя спасибо! Также я почти уверен, что правильно прочитал заголовки разделов, потому что, если я проанализирую заголовок проанализирую заголовки программы заполню все байты до заголовков разделов, а затем проанализирую заголовки разделов. Я получаю идеальную копию исполняемого файла.