elf 格式解析

来源:互联网 发布:淘宝注册开网店流程 编辑:程序博客网 时间:2024/05/30 23:01

  elf 格式解析 代码如下,欢迎大家拍砖。

/* ============================================================================ Name        : Elf.c Author      : 小E  QQ 592646022 Version     : v0.1 Copyright   :  Description : Hello World in C, Ansi-style ============================================================================ */#include <stdio.h>#include <stdlib.h>#include <elf.h>#include <sys/stat.h>char cache[512];FILE *fp;Elf32_Ehdr ehdr;Elf32_Phdr phdrs[20];Elf32_Shdr shdrs[20];void print_hex_file(char* name) {char buffer[512];FILE* f = fopen(name, "rb");if (!f) {printf("Open %s failed.\n", name);return;}fseek(f, 0, SEEK_SET);fread(&buffer, 512, sizeof(char), f);fclose(f);int i;for (i = 0; i < 512; i++) {if (i % 16 == 0)printf("\n0x%04x ", i);int b = buffer[i] & 0x00ff;printf(" %02X ", b);}}void print_buffer() {int i;for (i = 0; i < 512; i++) {if (i % 16 == 0)printf("\n0x%04x ", i);int b = cache[i] & 0x00ff;printf(" %02X ", b);}}void print_ident(unsigned char * ch) {int i;for (i = 0; i < 16; i++) {printf("%02X ", ch[i]);}printf("\n");}void print_ehdr(Elf32_Ehdr *ehdr) {printf("ELF Header\n");printf("e_ident: ");print_ident(ehdr->e_ident);printf("e_type: %02X\n", ehdr->e_type);printf("e_machine: %02X\n", ehdr->e_machine);printf("e_version: %04X\n", ehdr->e_version);printf("e_entry: %04X\n", ehdr->e_entry);printf("e_phoff: %04X\n", ehdr->e_phoff);printf("e_shoff: %04X\n", ehdr->e_shoff);printf("e_flags: %04X\n", ehdr->e_flags);printf("e_ehsize: %02X\n", ehdr->e_ehsize);printf("e_phentsize: %02X\n", ehdr->e_phentsize);printf("e_phnum: %02X\n", ehdr->e_phnum);printf("e_shentsize: %02X\n", ehdr->e_shentsize);printf("e_shnum: %02X\n", ehdr->e_shnum);printf("e_shstrndx: %02X\n", ehdr->e_shstrndx);}void print_phdr(Elf32_Phdr *phdr) {printf("p_type: %04X\n", phdr->p_type);printf("p_offset: %04X\n", phdr->p_offset);printf("p_vaddr: %04X\n", phdr->p_vaddr);printf("p_paddr: %04X\n", phdr->p_paddr);printf("p_filesz: %04X\n", phdr->p_filesz);printf("p_memsz: %04X\n", phdr->p_memsz);printf("p_flags: %04X\n", phdr->p_flags);printf("p_align: %04X\n", phdr->p_align);}void print_str_table_name(long int index){char buffer[32];long int table=shdrs[ehdr.e_shstrndx].sh_offset;fseek(fp,table+index,SEEK_SET);fread(buffer,32,1,fp);//printf("size:%d %04X",size,table+index*size);printf("%s\n",buffer);}void print_shdr(Elf32_Shdr *shdr) {//printf("aaaaoffset: %04X\n",shdrs[ehdr.e_shstrndx].sh_offset);if(shdr->sh_type==SHT_STRTAB){printf("Table\n");}printf("sh_name: %04X ", shdr->sh_name);if(ehdr.e_shstrndx!=SHN_UNDEF)print_str_table_name(shdr->sh_name);printf("sh_type: %04X\n", shdr->sh_type);printf("sh_flags: %04X\n", shdr->sh_flags);printf("sh_addr: %04X\n", shdr->sh_addr);printf("sh_offset: %04X\n", shdr->sh_offset);printf("sh_size: %04X\n", shdr->sh_size);printf("sh_link: %04X\n", shdr->sh_link);printf("sh_info: %04X\n", shdr->sh_info);printf("sh_addralign: %04X\n", shdr->sh_addralign);printf("sh_entsize: %04X\n", shdr->sh_entsize);}void print_phdrs(Elf32_Phdr *phdrs) {int i;for (i = 0; i < ehdr.e_phnum; i++) {printf("Programe Header%i\n", i);print_phdr(&phdrs[i]);printf("\n");}}void print_shdrs(Elf32_Shdr *shdrs) {int i;for (i = 0; i < ehdr.e_shnum; i++) {printf("Section Header%i\n", i);print_shdr(&shdrs[i]);printf("\n");}}void read_ehdr(Elf32_Ehdr *ehdr) {fseek(fp, 0, SEEK_SET);fread(ehdr, sizeof(Elf32_Ehdr), 1, fp);}void read_phdr(Elf32_Phdr *phdr,long int offset) {fseek(fp, ehdr.e_phoff+offset, SEEK_SET);fread(phdr, sizeof(Elf32_Phdr), 1, fp);}void read_shdr(Elf32_Shdr *shdr,long int offset) {fseek(fp, ehdr.e_shoff+offset, SEEK_SET );fread(shdr, sizeof(Elf32_Shdr), 1, fp);}void read_phdrs(Elf32_Phdr *phdrs) {int i,offset=0;for (i = 0; i < ehdr.e_phnum; i++) {read_phdr(&phdrs[i],offset);offset+=ehdr.e_phentsize;}}void read_shdrs(Elf32_Shdr *shdrs) {int i,offset=0;for (i = 0; i < ehdr.e_shnum; i++) {read_shdr(&shdrs[i],offset);offset+=ehdr.e_shentsize;}}int main(int argc, char *argv[]) {char* fileName = "/home/cty/os/out/kernel.bin";struct stat st;if (stat(fileName, &st) < 0) {printf("size erro.\n");return 0;} else {printf("File size is:%ld\n", (unsigned long) st.st_size);}fp = fopen(fileName, "rb");if (fp == NULL) {printf("Open failed.\n");} else {printf("Open success\n");read_ehdr(&ehdr);print_ehdr(&ehdr);read_phdrs(phdrs);print_phdrs(phdrs);read_shdrs(shdrs);print_shdrs(shdrs);fclose(fp);}//print_hex_file(fileName);return EXIT_SUCCESS;}


运行:

cty@HP-201011261546:~/workspace/Elf/Debug$ ./Elf Elf

输入结果如下: