Example #1
0
CodeBlock* load_codeblock(const char *label, const char *fn_prefix)
{
  FILE *f;
  unsigned int v, nops;
  char *fn = NULL;

  // open file for reading
  if (strcmp(label, "") == 0) asprintf(&fn, "%s.sux", fn_prefix);
  else asprintf(&fn, "%s.%s.sux", fn_prefix, label);
  f = fopen(fn, "r");
  if (f == NULL) return NULL;

  // file header: check magic and get number of operations
  fread(&v, sizeof(unsigned int), 1, f);
  if (v != SUX_MAGIC) return NULL;
  fread(&nops, sizeof(unsigned int), 1, f);

  // first read string table
  // string table is located after code
  fseek(f, nops*8, SEEK_CUR);

  Strtab *strtab = load_strtab(f);
  if (strtab == NULL) return NULL;

  // initialize & load codeblock
  CodeBlock *cb = init_codeblock(label);
  cb->elem = nops;
  resize_codeblock(cb);

  fseek(f, 8, SEEK_SET);  // reset file pos to beginning of code
  while (cb->nops < nops) {
    Operation *op = load_operation(f, strtab);
    op->id = cb->nops;
    cb->code[cb->nops++] = *op;
    free(op);
  }

  // cleanup
  fclose(f);
  delete_strtab(strtab);

  return cb;
}
Example #2
0
void
elf_hide(int pfile, char *p)
{
	int             i;
	Elf_Ehdr       *pehdr;
	Elf_Shdr       *pshdr;
	Elf_Phdr       *pphdr;
	struct stat     sb;

	pexe = p;
	pehdr = (Elf_Ehdr *) pexe;

#ifdef DEBUG
	printf("elf header\n");
	printf("e_type %x\n", pehdr->e_type);
	printf("e_machine %x\n", pehdr->e_machine);
	printf("e_version %x\n", pehdr->e_version);
	printf("e_entry %x\n", pehdr->e_entry);
	printf("e_phoff %x\n", pehdr->e_phoff);
	printf("e_shoff %x\n", pehdr->e_shoff);
	printf("e_flags %x\n", pehdr->e_flags);
	printf("e_ehsize %x\n", pehdr->e_ehsize);
	printf("e_phentsize %x\n", pehdr->e_phentsize);
	printf("e_phnum %x\n", pehdr->e_phnum);
	printf("e_shentsize %x\n", pehdr->e_shentsize);
	printf("e_shnum %x\n", pehdr->e_shnum);
	printf("e_shstrndx %x\n", pehdr->e_shstrndx);
#endif

	load_shstr_tab(pehdr, pexe);
#ifdef DEBUG
	for (i = 0; i < pehdr->e_shnum; i++) {
		pshdr = (Elf_Phdr *) (pexe + pehdr->e_shoff +
		    (i * pehdr->e_shentsize));

		printf("section header %d\n", i);
		printf("sh_name %x ", pshdr->sh_name);
		fprint_shstr(stdout, pshdr->sh_name);
		printf("\n");
		printf("sh_type %x\n", pshdr->sh_type);
		printf("sh_flags %x\n", pshdr->sh_flags);
		printf("sh_addr %x\n", pshdr->sh_addr);
		printf("sh_offset %x\n", pshdr->sh_offset);
		printf("sh_size %x\n", pshdr->sh_size);
		printf("sh_link %x\n", pshdr->sh_link);
		printf("sh_info %x\n", pshdr->sh_info);
		printf("sh_addralign %x\n", pshdr->sh_addralign);
		printf("sh_entsize %x\n", pshdr->sh_entsize);
	}
#endif				/* DEBUG */

#ifdef DEBUG
	for (i = 0; i < pehdr->e_phnum; i++) {
		pshdr = (Elf_Phdr *) (pexe + pehdr->e_phoff +
		    (i * pehdr->e_phentsize));

		printf("program header %d\n", i);
		printf("p_type %x\n", pphdr->p_type);
		printf("p_offset %x\n", pphdr->p_offset);
		printf("p_vaddr %x\n", pphdr->p_vaddr);
		printf("p_paddr %x\n", pphdr->p_paddr);
		printf("p_filesz %x\n", pphdr->p_filesz);
		printf("p_memsz %x\n", pphdr->p_memsz);
		printf("p_flags %x\n", pphdr->p_flags);
		printf("p_align %x\n", pphdr->p_align);
	}
#endif				/* DEBUG */
#if 0
	for (i = 0; i < pehdr->e_shnum; i++) {
		pshdr = (Elf_Phdr *) (pexe + pehdr->e_shoff +
		    (i * pehdr->e_shentsize));
		if (strcmp(".strtab", get_shstr(pshdr->sh_name)) == 0)
			break;
	}
	fprint_shstr(stdout, pshdr->sh_name);
	printf("\n");
#endif

	load_strtab(pehdr, pexe);
	load_symtab(pehdr, pexe);

	munmap(pexe, sb.st_size);
	close(pfile);
}