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;
- int ind, ind_name;
- char name[21], chr;
- 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);
- 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);
- fseek(f_in, name_sh.sh_offset + cur.sh_name, SEEK_SET);
- ind_name = 0;
- while (fread(&chr, sizeof(chr), 1, f_in)) {
- name[ind_name++] = chr;
- if (chr == '\0') {
- break;
- }
- }
- printf("%20s 0x%08x %10d %10d 0x%04x\n", name, cur.sh_addr, cur.sh_offset, cur.sh_size, cur.sh_addralign);
- fseek(f_in, hdr.e_shoff + sizeof(cur) * ind, SEEK_SET);
- }
- fclose(f_in);
- return 0;
- }
Add Comment
Please, Sign In to add comment