예제 #1
0
파일: main.c 프로젝트: bdolgov/pract
int main(int argc, char** argv)
{
	ElfFile* f = elf_open(argv[1]);
	stabinfo_t *s = stab_load(f);
	if (!s)
	{
		printf("No debug info");
		return 0;
	}

	char* addr;
	while (scanf("%x", (unsigned int*)&addr) == 1)
	{
		stab_line_t *r = stab_find(s, (char*)addr);
		if (s->fns[r->fn].begin <= addr && addr < s->fns[r->fn].end)
		{
			printf("0x%08x:%s:%s:%x:%d\n",
				(unsigned int)addr, s->srcs[s->fns[r->fn].src].name,
				s->fns[r->fn].name, addr - s->fns[r->fn].begin, r->line);
		}
		else
		{
			printf("0x%08x::::\n", (unsigned int)addr);
		}
	}

	stab_delete(s);
	elf_close(f);
}
예제 #2
0
void kernel_binary_analyze_inner_elf(char *file_name)
{
	struct elf_file_t *elf;
	char *section_name;
	char file_name_dest[MAX_STRING_SIZE];
	void *section_buf;
	int i;

	elf = elf_open(file_name);
	if (!elf)
		return;

	for (i = 0; i < elf_section_count(elf); i++)
	{
		uint32_t addr, offset, size, flags;

		/* Get section info */
		elf_section_info(elf, i, &section_name, &addr, &offset, &size, &flags);
		if (!*section_name)
			continue;

		/* Read section */
		section_buf = elf_section_read(elf, i);
		snprintf(file_name_dest, MAX_STRING_SIZE, "%s.%d%s", file_name, i, section_name);
		write_buffer(file_name_dest, section_buf, size);
		elf_section_free(section_buf);

		/* Info */
		printf("\t  %s: inner section '%s' dumped\n", file_name_dest, section_name);
	}
}
예제 #3
0
int lua_elf_t_new (lua_State * L)
{
    char * filename;
    struct lua_elf_t ** new_elf;
    
    filename = (char *) luaL_checkstring(L, 1);
    lua_pop(L, 1);
    
    new_elf = lua_newuserdata(L, sizeof(struct lua_elf_t **));
    luaL_getmetatable(L, "rop_tools.elf_t");
    lua_setmetatable(L, -2);
    
    *new_elf = (struct lua_elf_t *) malloc(sizeof(struct lua_elf_t));
    (*new_elf)->ref_count = 1;
    
    (*new_elf)->elf = elf_open(filename);
    if ((*new_elf)->elf == NULL)
        luaL_error(L, "error opening elf file %s", filename);
    
    return 1;
}
예제 #4
0
파일: elf.c 프로젝트: DIKU-EDU/DiMS
int
elf_dump(const char *path, uint32_t *entry,
    unsigned char *mem, size_t memsz) {
  struct elf_file file;
  int retval = 0;

  retval = elf_open(&file, path);
  if (retval != 0) {
    error(0, 0, "couldn't get started on the ELF file.");
    return retval;
  }

  *entry = file.ehdr.e_entry;

  retval = copy_all_segments(&file, mem, memsz);
  if (retval != 0) {
    error(0, 0, "couldn't read prog segments.");
    return retval;
  }

  return elf_close(&file);
}
예제 #5
0
void kernel_binary_analyze(char *file_name)
{
	struct elf_file_t *elf;
	struct elf_symbol_t *sym;
	int i;

	char file_name_prefix[MAX_STRING_SIZE];
	char subdir[MAX_STRING_SIZE];
	int len;

	char file_name_dest[MAX_STRING_SIZE];
	void *section_buf;
	uint32_t section_size;
	char *section_name;

	/* Get file name prefix */
	strcpy(file_name_prefix, file_name);
	len = strlen(file_name);
	if (len > 4 && !strcmp(file_name + len - 4, ".bin"))
		file_name_prefix[len - 4] = '\0';

	/* Create subdirectory */
	snprintf(subdir, sizeof subdir, "%s_files", file_name_prefix);
	mkdir(subdir, 0755);

	/* Analyze ELF file */
	elf_debug_file = fopen("/dev/null", "wt");
	elf = elf_open(file_name);
	if (!elf)
		fatal("%s: cannot open ELF file", file_name);
	
	/* List ELF sections */
	printf("ELF sections:\n");
	for (i = 0; i < elf_section_count(elf); i++)
	{
		uint32_t addr, offset, size, flags;
		elf_section_info(elf, i, &section_name, &addr, &offset, &size, &flags);
		if (!size)
			continue;

		/* Dump to file */
		section_buf = elf_section_read(elf, i);
		sprintf(file_name_dest, "%s/%s.%s", subdir, file_name_prefix,
			*section_name == '.' ? section_name + 1 : section_name);
		write_buffer(file_name_dest, section_buf, size);
		elf_section_free(section_buf);

		/* Info */
		printf("  section '%s': addr=0x%x, offset=0x%x, size=%d, flags=0x%x\n",
			section_name, addr, offset, size, flags);
	}
	
	/* Get symbols */
	for (i = 0; i < elf->symtab_count; i++)
	{
		char kernel_func_name[MAX_STRING_SIZE];
		int kernel_func_len;
		int sym_len;

		sym = &elf->symtab[i];
		if (strncmp(sym->name, "__OpenCL_", 9))
			continue;
		sym_len = strlen(sym->name);
		if (!sym->size)
			continue;

		/* Read section */
		elf_section_info(elf, sym->section, &section_name, NULL, NULL, &section_size, NULL);
		section_buf = elf_section_read(elf, sym->section);
		assert(sym->value + sym->size <= section_size);

		/* Dump to files */
		if (str_suffix(sym->name, "_metadata"))
		{
			kernel_func_len = sym_len - 18;
			strncpy(kernel_func_name, sym->name + 9, kernel_func_len);
			kernel_func_name[kernel_func_len] = '\0';

			sprintf(file_name_dest, "%s/%s.%s.metadata", subdir, file_name_prefix, kernel_func_name);
			write_buffer(file_name_dest, section_buf + sym->value, sym->size);
			printf("\t%s: meta data dumped\n", file_name_dest);

		}
		else if (str_suffix(sym->name, "_kernel"))
		{
			kernel_func_len = sym_len - 16;
			strncpy(kernel_func_name, sym->name + 9, kernel_func_len);
			kernel_func_name[kernel_func_len] = '\0';

			sprintf(file_name_dest, "%s/%s.%s.kernel", subdir, file_name_prefix, kernel_func_name);
			write_buffer(file_name_dest, section_buf + sym->value, sym->size);
			printf("\t%s: inner ELF file dumped\n", file_name_dest);
			
			kernel_binary_analyze_inner_elf(file_name_dest);
		}

		/* Free section */
		elf_section_free(section_buf);
	}

	/* Close file */
	elf_close(elf);
}
예제 #6
0
int elf_enumerate_symbols (Context * ctx, const char * file_name, EnumerateSymbols ** enum_syms, EnumerateBatchSymbolsCallBack * call_back, void * args) {
    Trap trap;
    ELF_File * file;
    unsigned sec_idx;
    int has_more = 0;

    if (!set_trap(&trap)) {
        loc_free (*enum_syms);
        *enum_syms = NULL;
        return -1;
    }

    if (ctx == NULL && file_name == NULL) {
        assert (*enum_syms != NULL);

        file = elf_open ((*enum_syms)->file_name);
        if (file == NULL) exception (errno);

        /*
         * Check that the file is identical to the initial file and the context
         * still exists.
         */

        if (file->ino != (*enum_syms)->ino || file->dev != (*enum_syms)->dev || file->mtime != (*enum_syms)->mtime) {
            str_exception(ERR_OTHER, "The elf symbol file has changed");
        }
        else {
            ctx = id2ctx((*enum_syms)->ctxId);
            if (ctx == NULL) exception (ERR_INV_CONTEXT);
            else if (ctx->exited) exception (ERR_ALREADY_EXITED);
        }
        sec_idx = (*enum_syms)->sec_idx;
    }
    else {
        unsigned symtab_idx = 0;
        unsigned dynsym_idx = 0;
        unsigned ix;

        assert (file_name != NULL && enum_syms != NULL && *enum_syms == NULL);

        file = elf_open (file_name);
        if (file == NULL) exception (errno);

        if (file->sections == NULL) str_exception(ERR_OTHER, "The file does not have sections");

        /* Look for the symbol table sections */

        for (ix = 0; ix < file->section_cnt && (symtab_idx == 0 || dynsym_idx == 0); ix++) {
            ELF_Section * sec = file->sections + ix;
            if (sec->type == SHT_SYMTAB) symtab_idx = ix;
            else if (sec->type == SHT_DYNSYM) dynsym_idx = ix;
        }

        if (symtab_idx == 0 && dynsym_idx == 0) str_exception(ERR_OTHER, "The file does not have a symbol table");

       /* Set priority to the symbol table */

        if (symtab_idx != 0) sec_idx = symtab_idx;
        else sec_idx = dynsym_idx;

        *enum_syms = (EnumerateSymbols *)loc_alloc_zero (sizeof (EnumerateSymbols));
        strlcpy ((*enum_syms)->file_name, file_name, sizeof ((*enum_syms)->file_name));
        if (strlen (file_name) != strlen ((*enum_syms)->file_name)) str_exception (ERR_OTHER, "File pathname too long");

        strlcpy ((*enum_syms)->ctxId, ctx->id, sizeof ((*enum_syms)->ctxId));
        (*enum_syms)->dev = file->dev;
        (*enum_syms)->ino = file->ino;
        (*enum_syms)->mtime = file->mtime;
        (*enum_syms)->sec_idx = sec_idx;
    }

    has_more = enumerate_symbol_table(ctx, file->sections + sec_idx, *enum_syms, call_back, args);

    clear_trap(&trap);

    if (has_more == 0) {
        loc_free (*enum_syms);
        *enum_syms = NULL;
    }

    return has_more;
}