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; }
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); }