您好,欢迎来到年旅网。
搜索
您的当前位置:首页elf 格式解析

elf 格式解析

来源:年旅网

  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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务