範例列表:loader v0.3
/* * Copyright(c) 2003,2006 www.jollen.org * * ELF programming. ver 0.3 * */ #include <stdio.h> #include <unistd.h> #include <elf.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> int elf_ident(char *ident) { if (*(ident+EI_MAG0) != ELFMAG0) return 0; if (*(ident+EI_MAG1) != ELFMAG1) return 0; if (*(ident+EI_MAG2) != ELFMAG2) return 0; if (*(ident+EI_MAG3) != ELFMAG3) return 0; return -1; } void parse_ident(char *ident) { printf("ELF Identification\n"); printf(" Class: "); switch (*(ident+EI_CLASS)) { case ELFCLASSNONE: printf("Invalid class\n"); break; case ELFCLASS32: printf("32-bit objects\n"); break; case ELFCLASS64: printf("64-bit objects\n"); break; } } void parse_machine(Elf32_Half machine) { printf("Machine: "); switch (machine) { case EM_NONE: printf("No machine\n"); break; case EM_M32: printf("AT&T WE 32100\n"); break; case EM_SPARC: printf("SPARC\n"); break; case EM_386: printf("Intel 80386\n"); break; case EM_68K: printf("Motorola 68000\n"); break; case EM_88K: printf("Motorola 88000\n"); break; case EM_860: printf("Intel 80860\n"); break; case EM_MIPS: printf("MIPS RS3000 Big-Endian\n"); break; default: printf("Unknow\n"); } } void parse_sections(Elf32_Ehdr *hdr, int fd) { int i; Elf32_Shdr header[40]; Elf32_Shdr *strtab; /* point to string table */ printf("Num of secionts: %d\n", hdr->e_shnum); /* file offset of section header table */ lseek(fd, hdr->e_shoff, SEEK_SET); for (i = 0; i < hdr->e_shnum; i++) { read(fd, &header[i], sizeof(Elf32_Shdr)); /* find out string table ! */ if (header[i].sh_type == SHT_STRTAB) strtab = &header[i]; } } int main(int argc, char *argv[]) { int fd; Elf32_Ehdr f_header; if (argc != 2) { printf("Usage: loader [filename]\n"); return -1; } fd = open(argv[1], S_IRUSR); if (fd < 0) { printf("\nfile open error\n"); return -1; } /* Read ELF Header */ read(fd, &f_header, sizeof(Elf32_Ehdr)); /* Parse header information */ if (elf_ident(f_header.e_ident)) { parse_ident(f_header.e_ident); parse_machine(f_header.e_machine); parse_sections(&f_header, fd); } else { printf("not a ELF binary file\n"); } close(fd); }
執行結果
$ ./loader-0.3 ./loader-0.3 ELF Identification Class: 32-bit objects Machine: Intel 80386 Num of secionts: 34
Also See |
Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue
您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw