Пример #1
0
/**
 * 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); 
}
Пример #2
0
/**
 * 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);
}
Пример #3
0
/**
 * 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);
}
Пример #4
0
/**
 * 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 = &sect->parent->symhash;
      break;
    case SHT_DYNSYM:
      uptable = &sect->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);
}