void load_strtab(Elf_Ehdr * pehdr, char *pexe) { Elf_Shdr *pshdr; char *shname; int i; strtab = NULL; for (i = 0; i < pehdr->e_shnum; i++) { pshdr = (Elf_Shdr *) (pexe + pehdr->e_shoff + (i * pehdr->e_shentsize)); shname = get_shstr(pshdr->sh_name); if (strcmp(".strtab", shname) == 0) break; } #ifdef DEBUG fprint_shstr(stdout, pshdr->sh_name); printf("\n"); #endif strtab = (char *) (pexe + pshdr->sh_offset); strtabsize = pshdr->sh_size; #ifdef DEBUG dump_strtab(); #endif }
Elf32_Half find_section_index(char *name, Elf32_Ehdr *elf_h) { int i; Elf32_Shdr *sect_hdr = (Elf32_Shdr *)((u_int32_t)elf_h + elf_h->e_shoff); Elf32_Shdr *shstr_hdr = §_hdr[elf_h->e_shstrndx]; for (i = 0; i < elf_h->e_shnum; i++) { char *a = get_shstr(elf_h, shstr_hdr, sect_hdr[i].sh_name); if (strcmp(a, name) == 0) return i; } return 0; }
int find_symbol_in_elfhs(Elf32_Sym *in_symbol, Elf32_Sym **out_symbol, task_register_cons **out_symbol_trc, task_register_cons *app_trc, Elf32_Ehdr *sys_elfh, task_register_tree *other_trcs) { Elf32_Sym *final_symbol = NULL; task_register_cons *final_symbol_trc = NULL; Elf32_Shdr *strtab_sect = find_section(".dynstr", app_trc->elfh); char *symbol_name = get_shstr(app_trc->elfh, strtab_sect, in_symbol->st_name); INFO_MSG("Relocating symbol %s\n", symbol_name); if (in_symbol->st_shndx == SHN_UNDEF) { /* * Find the symbol elsewhere. */ if (other_trcs) { task_register_cons *trcp; TASK_ACQUIRE_TR_LOCK(); RB_FOREACH(trcp, task_register_tree_t, other_trcs) { if (trcp == app_trc) continue; DEBUG_MSG("looking for symbol \"%s\" in \"%s\"\n", symbol_name, trcp->name); final_symbol = find_symbol(symbol_name, trcp->elfh); if (final_symbol == NULL) continue; if (final_symbol->st_shndx == SHN_UNDEF) final_symbol = NULL; if (final_symbol != NULL) { final_symbol_trc = trcp; break; } } TASK_RELEASE_TR_LOCK(); } if (final_symbol == NULL) { final_symbol = find_symbol(symbol_name, sys_elfh); /* * If the symbol is found in the system elfh, * let the symbol trc be NULL. */ final_symbol_trc = NULL; } } else {
Elf32_Sym *find_symbol(char *name, Elf32_Ehdr *elf_h) { int i; char *tname; Elf32_Shdr *symtab_sect = find_section(".symtab", elf_h); Elf32_Shdr *strtab_sect = find_section(".strtab", elf_h); DEBUG_MSG("Searching for symbol %s in elf @ 0x%x\n", name, (npi_t)elf_h); if (symtab_sect == NULL) { ERROR_MSG("Found no .symtab section\n"); return NULL; } if (strtab_sect == NULL) { ERROR_MSG("Found no .strtab section\n"); return NULL; } if (symtab_sect->sh_entsize != sizeof(Elf32_Sym)) { ERROR_MSG("Wrong .symtab entry size\n"); return NULL; } Elf32_Sym *syms = (Elf32_Sym *)((u_int32_t)elf_h + symtab_sect->sh_offset); u_int32_t n = symtab_sect->sh_size / symtab_sect->sh_entsize; INFO_MSG("Found %i entries in .symtab (sect at address 0x%x)\n", n, (unsigned int)syms); for (i = 0; i < n; i++) { tname = get_shstr(elf_h, strtab_sect, syms[i].st_name); if (strcmp(tname, name) == 0) { return &syms[i]; } } return NULL; }
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); }