Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdint.h>
- #include <elf.h>
- int
- main (int argc, char **argv)
- {
- FILE *f_in = fopen(argv[1], "rb");
- Elf32_Ehdr hdr;
- Elf32_Shdr cur, name_sh;
- char *name_section = NULL;
- int ind;
- if (!f_in) {
- fprintf(stderr, "Couldn't open input file\n");
- return 1;
- }
- if ((fread(&hdr, sizeof(hdr), 1, f_in)) < 1) {
- fprintf(stderr, "Error while reading ELF Header\n");
- fclose(f_in);
- return 1;
- }
- if (hdr.e_ident[0] != '\x7f' || hdr.e_ident[1] != 'E' ||
- hdr.e_ident[2] != 'L' || hdr.e_ident[3] != 'F') {
- fprintf(stderr, "Not an ELF file\n");
- fclose(f_in);
- return 1;
- }
- if (hdr.e_ident[4] != 1 || hdr.e_ident[5] != 2 || hdr.e_ident[6] != 1) {
- fprintf(stderr, "Not supported ELF file\n");
- fclose(f_in);
- return 1;
- }
- printf("TYPE: ");
- switch (hdr.e_type) {
- case 1:
- printf("REL\n");
- break;
- case 2:
- printf("EXEC\n");
- break;
- case 3:
- printf("DYN\n");
- break;
- case 4:
- printf("CORE\n");
- break;
- default:
- printf("NONE\n");
- break;
- }
- printf(" NAME ADDR OFFSET SIZE ALGN\n");
- fseek(f_in, hdr.e_shoff + hdr.e_shstrndx * sizeof(cur), SEEK_SET);
- fread(&name_sh, sizeof(name_sh), 1, f_in);
- name_section = (char *) calloc(name_sh.sh_size, sizeof(char));
- fseek(f_in, name_sh.sh_offset, SEEK_SET);
- fread(name_section, name_sh.sh_size, 1, f_in);
- fseek(f_in, hdr.e_shoff + sizeof(cur), SEEK_SET);
- for (ind = 1; ind < hdr.e_shnum; ind++) {
- fread(&cur, sizeof(cur), 1, f_in);
- printf("%20s 0x%08x %10d %10d 0x%04x\n", name_section + cur.sh_name,
- cur.sh_addr, cur.sh_offset, cur.sh_size, cur.sh_addralign);
- }
- free(name_section);
- fclose(f_in);
- return 0;
- }
Add Comment
Please, Sign In to add comment