elf 格式解析 代码如下,欢迎大家拍砖。
/*
============================================================================
Name : Elf.c
Author : 小E QQ 5926022
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;
}
运行:
输入结果如下:
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务