/** * Get .dynamic entries by type * @param file * @param type * @return */ elfsh_Dyn *elfsh_get_dynamic_entry_by_type(elfshobj_t *file, elfsh_Word type) { u_int index; u_int size; elfsh_Dyn *table; elfsh_Sword res; PROFILER_IN(__FILE__, __FUNCTION__, __LINE__); table = elfsh_get_dynamic(file, &size); if (!table) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Unable to get DYNAMIC", NULL); for (index = 0; index < size; index++) { res = elfsh_get_dynentry_type(table + index); if (res != -1 && res == (elfsh_Sword) type) PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, (table + index)); } PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "No dynamic entry with that type", NULL); }
/** * Shift the .dynamic section in ET_DYN files * * @param file * @param size * @return */ int elfsh_shift_dynamic(elfshobj_t *file, u_int size) { elfsh_Dyn *dyn; u_int nbr; u_int idx; PROFILER_IN(__FILE__, __FUNCTION__, __LINE__); dyn = elfsh_get_dynamic(file, &nbr); if (dyn == NULL) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Cannot find .dynamic in ET_DYN", -1); for (idx = 0; idx < nbr; idx++) if (elfsh_shiftable_dynent(dyn + idx)) elfsh_set_dynentry_val(dyn + idx, elfsh_get_dynentry_val(dyn + idx) + size); PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, (0)); }
/** * Load all the part of the binary. * This function should not be used by e2dbg * @param file * @return */ int elfsh_read_obj(elfshobj_t *file) { elfshsect_t *actual; int index; PROFILER_IN(__FILE__, __FUNCTION__, __LINE__); if (file->read) PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, 0); if (file->sht == NULL && NULL == elfsh_get_sht(file, NULL)) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Unable to grab SHT", -1); if (NULL == elfsh_get_pht(file, NULL) && file->hdr->e_type != ET_REL) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Unable to grab PHT", -1); #if __DEBUG_MAP__ puts("[DEBUG:read_obj] Loading all known typed sections\n"); #endif /* Fill multiple relocation sections */ for (index = 0; NULL != (actual = elfsh_get_reloc(file, index, NULL)); index++); /* ** Load sections placed after symtab ** Added for Solaris */ elfsh_get_comments(file); elfsh_get_dwarf(file); elfsh_get_stab(file, NULL); if (file->hdr->e_type == ET_CORE) { elfsh_get_core_notes(file); goto out; } /* ** We cannot use simply elfsh_get_anonymous_section() here ** because the object's section hash ptrs would not be filled. */ elfsh_get_symtab(file, NULL); /* Fixup stuffs in the SHT */ elfsh_fixup(file); elfsh_get_dynsymtab(file, NULL); elfsh_get_stab(file, NULL); elfsh_get_dynamic(file, NULL); elfsh_get_ctors(file, NULL); elfsh_get_dtors(file, NULL); elfsh_get_got(file, NULL); elfsh_get_interp(file); elfsh_get_versymtab(file, NULL); elfsh_get_verneedtab(file, NULL); elfsh_get_verdeftab(file, NULL); elfsh_get_hashtable(file, NULL); //elfsh_get_comments(file); elfsh_get_plt(file, NULL); /* Fill the multiple notes sections */ for (index = 0; NULL != elfsh_get_notes(file, index); index++); /* Loop on the section header table and load all unknown-typed sections */ for (actual = file->sectlist; actual; actual = actual->next) { /* Fix first section size */ if (actual->shdr->sh_size == 0 && actual->next && actual->next->shdr->sh_offset != actual->shdr->sh_offset && actual->next->shdr->sh_addr != actual->shdr->sh_addr) actual->shdr->sh_size = actual->next->shdr->sh_offset - actual->shdr->sh_offset; /* If the section data has to be loaded, load it */ /* In case of bss, only load if BSS data is inserted in the file */ if (actual->data == NULL && actual->shdr->sh_size) { if ((actual->shdr->sh_type == SHT_NOBITS && actual->shdr->sh_offset == actual->next->shdr->sh_offset) || (actual->next != NULL && actual->next->shdr->sh_offset == actual->shdr->sh_offset)) continue; #if __DEBUG_MAP__ printf("[LIBELFSH] Loading anonymous section %15s \n", elfsh_get_section_name(file, actual)); #endif elfsh_get_anonymous_section(file, actual); } } /* Fixup various symbols like dynamic ones that are NULL */ /* Non fatal error */ if (file->secthash[ELFSH_SECTION_DYNSYM]) elfsh_fixup_dynsymtab(file->secthash[ELFSH_SECTION_DYNSYM]); out: /* We close the file descriptor after file mapping so we can open more files */ if (file->fd >= 0) { #if __DEBUG_MAP__ printf("[LIBELFSH] Closing descriptor %d \n", file->fd); #endif XCLOSE(file->fd, -1); /* neutralize file descriptor */ file->fd = -1; } PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, 0); }