-
Notifications
You must be signed in to change notification settings - Fork 0
/
readelf.c
70 lines (63 loc) · 3.86 KB
/
readelf.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "tty.h"
#include "file.h"
#include "stdint.h"
#include "printf.h"
#define EI_NIDENT 16
// Заголовок ELF файла
typedef struct {
unsigned char e_ident[EI_NIDENT]; // Сигнатура идентификации
unsigned short e_type; // Тип объектного файла
unsigned short e_machine; // Тип архитектуры
unsigned int e_version; // Версия объектного файла
unsigned int e_entry; // Начальный адрес исполняемого кода
unsigned int e_phoff; // Смещение таблицы программных заголовков
unsigned int e_shoff; // Смещение таблицы секций
unsigned int e_flags; // Флаги
unsigned short e_ehsize; // Размер заголовка
unsigned short e_phentsize; // Размер записи таблицы программных заголовков
unsigned short e_phnum; // Число записей таблицы программных заголовков
unsigned short e_shentsize; // Размер записи таблицы секций
unsigned short e_shnum; // Число записей таблицы секций
unsigned short e_shstrndx; // Индекс секции со строками
} Elf32_Ehdr;
int main(int argc, char* argv[]) {
_tty_puts("ReadELF for SayoriOS\n");
if (argc < 2) {
printf("Использование: %s <elf-файл>\n", argv[0]);
return 1;
}
printf("Попытка открыть файл %s!\n", argv[1]);
int fd = fd_open(argv[1], "r");
if (fd == -1){
printf("Извините, не удалось открыть файл!\n");
return 1;
}
Elf32_Ehdr header;
fd_read(fd, sizeof(Elf32_Ehdr), 1, &header);
fd_close(fd);
if (
header.e_ident[0] != 0x7f ||
header.e_ident[1] != 0x45 ||
header.e_ident[2] != 0x4c ||
header.e_ident[3] != 0x46
) {
printf("Получен следующий ответ: %x | %x | %x | %x\n", header.e_ident[0], header.e_ident[1], header.e_ident[2], header.e_ident[3]);
printf("Извините, но данный файл не является ELF!\n");
return 1;
}
// Выводим информацию из заголовка ELF
printf("Тип: 0x%x\n", header.e_type);
printf("Архитектура: 0x%x\n", header.e_machine);
printf("Версия ELF: 0x%x\n", header.e_version);
printf("Точка входа в ELF-файл: 0x%x\n", header.e_entry);
printf("Флаги: 0x%x\n", header.e_flags);
printf("Смещение начала заголовков программ: %u (от начала файла)\n", header.e_phoff);
printf("Смещение начала заголовков секций: %u (от начала файла)\n", header.e_shoff);
printf("Размер заголовка ELF-файла: %u (байтов)\n", header.e_ehsize);
printf("Размер записи таблицы заголовков программы: %u (байтов)\n", header.e_phentsize);
printf("Количество записей в таблице заголовков программы: %u\n", header.e_phnum);
printf("Размер записи таблицы заголовков секций: %u (байтов)\n", header.e_shentsize);
printf("Количество записей в таблице заголовков секций: %u\n", header.e_shnum);
printf("Индекс таблицы строк в заголовке секции: %u\n", header.e_shstrndx);
return 0;
}