Example #1
0
struct elf_file_t *elf_open(char *path)
{
	struct elf_file_t *elf;

	/* Create structure */
	elf = calloc(1, sizeof(struct elf_file_t));
	if (!elf)
		fatal("elf_open: out of memory\n");
///	printf("\n length = %d\n",strlen(path));
///	printf("\n tryng to open %s\n",path);

	/* Open file */
	elf->f = fopen(path, "rb");
///	printf("\n error no is %d",errno);
	if (!elf->f)
		fatal("%s: cannot open executable file", path);
	if (strlen(path) >= sizeof(elf->path))
		fatal("%s: executable file path too long", path);
	strcpy(elf->path, path);

	/* Get file size */
	fseek(elf->f, 0, SEEK_END);
	elf->size = ftell(elf->f);
	fseek(elf->f, 0, SEEK_SET);

	/* Read header, section headers, and program headers. */
	elf_debug("\n%s: reading ELF file\n", path);
	elf_read_ehdr(elf);
	elf_read_shdr(elf);
	elf_read_phdr(elf);
	
	/* Return elf file structure */
	return elf;
}
Example #2
0
/**
 * elf_read_from_buffer - read ELF file and sets up ELF header and ELF info
 * @buf:	Buffer to read ELF file from.
 * @len:	Size of @buf.
 * @ehdr:	Pointer to existing struct which will be populated.
 * @elf_info:	Pointer to existing struct which will be populated.
 *
 * This function allows reading ELF files with different byte order than
 * the kernel, byte-swapping the fields as needed.
 *
 * Return:
 * On success returns 0, and the caller should call elf_free_info(elf_info) to
 * free the memory allocated for the section and program headers.
 */
int elf_read_from_buffer(const char *buf, size_t len, struct elfhdr *ehdr,
			 struct elf_info *elf_info)
{
	int ret;

	ret = elf_read_ehdr(buf, len, ehdr);
	if (ret)
		return ret;

	elf_info->buffer = buf;
	elf_info->ehdr = ehdr;
	if (ehdr->e_phoff > 0 && ehdr->e_phnum > 0) {
		ret = elf_read_phdrs(buf, len, elf_info);
		if (ret)
			return ret;
	}
	if (ehdr->e_shoff > 0 && ehdr->e_shnum > 0) {
		ret = elf_read_shdrs(buf, len, elf_info);
		if (ret) {
			kfree(elf_info->proghdrs);
			return ret;
		}
	}

	return 0;
}
Example #3
0
int ELFManager::elf_open(const char *filename)
{
	//只读模式打开
	_fd = open(filename, O_RDONLY);
	if (_fd < 0) {
		perror("open fail!");
		return -1;
	}
	_filename = filename;

	int ret = elf_read(0, _ident, sizeof(_ident));
	if (ret < 0) {
		fprintf(stderr, "read e_ident error!\n");
		return -1;
	}
	_is_32_bit = (_ident[EI_CLASS] != ELFCLASS64);

	ret = elf_read_ehdr(_ehdr);
	if(ret != 0) {
		return -1;
	}
	return _fd;
}
Example #4
0
int main(int argc, char *argv[])
{
	if (argc < 2) {
		usage();
		goto exit_failure;
	}

	FILE *fp = fopen(argv[1], "rb");

	Elf32_Ehdr ehdr;
	if (!elf_read_ehdr(fp, &ehdr)) {
		fprintf(stderr, "ERROR: loading ELF\n");
		goto exit_close;
	}

	Elf32_Phdr *phdr;
	if (!elf_load_phdr(fp, &ehdr, &phdr)) {
		fprintf(stderr, "ERROR: loading ELF Program Header\n");
		goto exit_close;
	}

	Elf32_Shdr *shdr;
	if (!elf_load_shdr(fp, &ehdr, &shdr)) {
		fprintf(stderr, "ERROR: loading ELF Section Header\n");
		goto exit_free_phdr;
	}


	// Load entire String Table Section
	char *shstrtab = elf_load_shstrtab(fp, &ehdr, shdr);
	int fstubs_found = 0;
	int vstubs_found = 0;
	int fstubs_idx = 0, vstubs_idx = 0;
	int i;
	for (i = 0; i < ehdr.e_shnum && (!fstubs_found || !vstubs_found); i++) {
		const char *shstr = shstrtab + shdr[i].sh_name;
		if (!fstubs_found) {
			if (strcmp(FSTUBS_SECTION, shstr) == 0) {
				fstubs_found = 1;
				fstubs_idx = i;
			}
		}
		if (!vstubs_found) {
			if (strcmp(VSTUBS_SECTION, shstr) == 0) {
				vstubs_found = 1;
				vstubs_idx = i;
			}
		}
	}

	if (!fstubs_found && !vstubs_found) {
		fprintf(stderr, "ERROR: the requiered sections "
			FSTUBS_SECTION " and " VSTUBS_SECTION
			" were not found.\n");
		goto exit_free_shstrtab;
	} else if (!fstubs_found) {
		printf("WARNING: section: " FSTUBS_SECTION
			" was not found\n");
	} else if (!vstubs_found) {
		printf("WARNING: section: " VSTUBS_SECTION
			" was not found\n");
	}

	unsigned char *fbuf = malloc(shdr[fstubs_idx].sh_size);
	unsigned char *vbuf = malloc(shdr[vstubs_idx].sh_size);

	fseek(fp, shdr[fstubs_idx].sh_offset, SEEK_SET);
	fread(fbuf, 1, shdr[fstubs_idx].sh_size, fp);

	fseek(fp, shdr[vstubs_idx].sh_offset, SEEK_SET);
	fread(vbuf, 1, shdr[vstubs_idx].sh_size, fp);

	printf("fstubs size: 0x%08X\n", shdr[fstubs_idx].sh_size);
	printf("vstubs size: 0x%08X\n", shdr[vstubs_idx].sh_size);

	for (i = 0; i < shdr[fstubs_idx].sh_size; i += 4*4) {
		printf("fstub: Lib NID: 0x%08X\n"
		       "       Mod NID: 0x%08X\n"
		       "       Fun NID: 0x%08X\n\n",
		       *(unsigned int *)(fbuf + i + 0),
		       *(unsigned int *)(fbuf + i + 4),
		       *(unsigned int *)(fbuf + i + 8));
	}
	printf("\n");
	for (i = 0; i < shdr[vstubs_idx].sh_size; i += 4*4) {
		printf("vstub: Lib NID: 0x%08X\n"
		       "       Mod NID: 0x%08X\n"
		       "       Var NID: 0x%08X\n\n",
		       *(unsigned int *)(vbuf + i + 0),
		       *(unsigned int *)(vbuf + i + 4),
		       *(unsigned int *)(vbuf + i + 8));
	}

	free(fbuf);
	free(vbuf);

	free(shstrtab);

	elf_free_shdr(&shdr);
	elf_free_phdr(&phdr);
	fclose(fp);
	return EXIT_SUCCESS;

exit_free_shstrtab:
	free(shstrtab);
exit_free_shdr:
	elf_free_shdr(&shdr);
exit_free_phdr:
	elf_free_phdr(&phdr);
exit_close:
	fclose(fp);
exit_failure:
	return EXIT_FAILURE;
}