/** * Add a symbol name in .strtab * @param file * @param name * @return */ int elfsh_insert_in_strtab(elfshobj_t *file, char *name) { elfshsect_t *sect; u_int len; u_int index; int ret; PROFILER_IN(__FILE__, __FUNCTION__, __LINE__); if (file == NULL || name == NULL) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Invalid NULL parameter", -1); sect = elfsh_get_strtab(file, -1); if (sect == NULL) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Unable to get STRTAB", -1); len = strlen(name); if (!len) for (index = 0; index < sect->shdr->sh_size; index++) if (*(char *) sect->data + index == 0x00) PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, (index)); ret = elfsh_append_data_to_section(sect, name, len + 1); if (ret < 0) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Failed to append data to strtab", -1); PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, ret); }
/** * Add a section name in runtime section string table * @param file * @param name * @return */ int elfsh_insert_in_rshstrtab(elfshobj_t *file, char *name) { int ret; PROFILER_IN(__FILE__, __FUNCTION__, __LINE__); if (name == NULL || file == NULL || file->secthash[ELFSH_SECTION_RSHSTRTAB] == NULL) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Invalid NULL parameter", -1); ret = elfsh_append_data_to_section(file->secthash[ELFSH_SECTION_RSHSTRTAB], name, strlen(name) + 1); if (ret < 0) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Failed to append data to rshstrtab", -1); else PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, ret); }
/** * Add a symbol name in .dynstr * @param file * @param name * @return */ int elfsh_insert_in_dynstr(elfshobj_t *file, char *name) { elfshsect_t *sect; int ret; PROFILER_IN(__FILE__, __FUNCTION__, __LINE__); if (file == NULL || name == NULL) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Invalid NULL parameter", -1); sect = elfsh_get_section_by_name(file, ELFSH_SECTION_NAME_DYNSTR, NULL, NULL, NULL); if (sect == NULL) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Unable to find DYNSTR by name", -1); ret = elfsh_append_data_to_section(sect, name, strlen(name) + 1); if (ret < 0) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Failed to append data to dynstr", -1); else PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, ret); }
/** * Insert a symbol in the given symbol table * This function is not e2dbg safe * @param sect * @param sym * @param name * @return */ int elfsh_insert_symbol(elfshsect_t *sect, elfsh_Sym *sym, char *name) { elfsh_Sym *orig; int index; int mode; hash_t *uptable; PROFILER_IN(__FILE__, __FUNCTION__, __LINE__); //fprintf(stderr, "Adding symbol %s \n", name); /* Sanity checks */ if (sect == NULL || sect->shdr == NULL || (sect->shdr->sh_type != SHT_SYMTAB && sect->shdr->sh_type != SHT_DYNSYM)) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Input section is not SYMTAB", -1); if (name == NULL) name = ELFSH_NULL_STRING; /* Check if symbol already exists */ orig = elfsh_get_symbol_by_name(sect->parent, name); if (orig != NULL && sym->st_value == orig->st_value) PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, (((char *) orig - (char *) sect->data) / ELFSH_SYMTAB_ENTRY_SIZE)); /* Shift some special symbols */ //if (sect->shdr->sh_type == SHT_DYNSYM) //fprintf(stderr, "Shifting usual symbols\n"); mode = elfsh_get_mode(); elfsh_set_static_mode(); elfsh_shift_usualsyms(sect, sym); elfsh_set_mode(mode); //fprintf(stderr, "Shifted usual symbols\n"); /* Insert symbol name in .shstrtab */ index = elfsh_insert_in_strtab(sect->parent, name); if (index < 0) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Unable to insert in SHSTRTAB", -1); #if __DEBUG_RELADD__ fprintf(stderr, "[DEBUG_RELADD] Injected symbol %-20s [" AFMT "] \n", name, (eresi_Addr) sym->st_value); #endif /* Insert symbol in .symtab */ sym->st_name = index; index = elfsh_append_data_to_section(sect, sym, sizeof(elfsh_Sym)); /* Update hashtable */ switch(sect->shdr->sh_type) { case SHT_SYMTAB: uptable = §->parent->symhash; break; case SHT_DYNSYM: uptable = §->parent->dynsymhash; break; default: uptable = NULL; break; } if (uptable && uptable->ent) hash_add(uptable, strdup(name), (void *) index); PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, sym->st_name); }