SgAsmGenericSectionPtrList SgAsmGenericFile::get_sections_by_va(rose_addr_t va) const { SgAsmGenericSectionPtrList retval; /* Holes (probably not mapped anyway) */ for (SgAsmGenericSectionPtrList::iterator i=p_holes->get_sections().begin(); i!=p_holes->get_sections().end(); ++i) { rose_addr_t rva = va; /* Holes don't belong to any header and therefore have a zero base_va */ if ((*i)->is_mapped() && rva >= (*i)->get_mapped_preferred_rva() && rva < (*i)->get_mapped_preferred_rva() + (*i)->get_mapped_size()) retval.push_back(*i); } /* Headers and their sections */ for (SgAsmGenericHeaderPtrList::iterator i=p_headers->get_headers().begin(); i!=p_headers->get_headers().end(); ++i) { /* Headers probably aren't mapped, but just in case... */ rose_addr_t rva = va; /* Headers don't belong to any header and therefore have a zero base_va */ if ((*i)->is_mapped() && rva >= (*i)->get_mapped_preferred_rva() && rva < (*i)->get_mapped_preferred_rva() + (*i)->get_mapped_size()) retval.push_back(*i); /* Header sections */ const SgAsmGenericSectionPtrList &recurse = (*i)->get_sections_by_va(va, true); retval.insert(retval.end(), recurse.begin(), recurse.end()); } return retval; }
SgAsmGenericSectionPtrList SgAsmGenericFile::get_sections_by_id(int id) const { SgAsmGenericSectionPtrList retval; /* Holes */ for (SgAsmGenericSectionPtrList::iterator i=p_holes->get_sections().begin(); i!=p_holes->get_sections().end(); ++i) { if ((*i)->get_id()==id) retval.push_back(*i); } /* Headers and their sections */ for (SgAsmGenericHeaderPtrList::iterator i=p_headers->get_headers().begin(); i!=p_headers->get_headers().end(); ++i) { if ((*i)->get_id()==id) retval.push_back(*i); const SgAsmGenericSectionPtrList &recurse = (*i)->get_sections_by_id(id); retval.insert(retval.end(), recurse.begin(), recurse.end()); } return retval; }
/** Returns sections in this header that have the specified ID. */ SgAsmGenericSectionPtrList SgAsmGenericHeader::get_sections_by_id(int id) const { SgAsmGenericSectionPtrList retval; for (SgAsmGenericSectionPtrList::iterator i=p_sections->get_sections().begin(); i!=p_sections->get_sections().end(); ++i) { if ((*i)->get_id() == id) { retval.push_back(*i); } } return retval; }
SgAsmGenericSectionPtrList SgAsmGenericFile::get_mapped_sections() const { SgAsmGenericSectionPtrList retval; SgAsmGenericSectionPtrList all = get_sections(true); for (size_t i=0; i<all.size(); i++) { if (all[i]->is_mapped()) retval.push_back(all[i]); } return retval; }
/** Returns the list of sections that are memory mapped */ SgAsmGenericSectionPtrList SgAsmGenericHeader::get_mapped_sections() const { SgAsmGenericSectionPtrList retval; for (SgAsmGenericSectionPtrList::iterator i=p_sections->get_sections().begin(); i!=p_sections->get_sections().end(); ++i) { if ((*i)->is_mapped()) { retval.push_back(*i); } } return retval; }
/** Get the list of sections defined in the ELF Segment Table */ SgAsmGenericSectionPtrList SgAsmElfFileHeader::get_segtab_sections() { SgAsmGenericSectionPtrList retval; SgAsmGenericSectionPtrList sections = get_sections()->get_sections(); for (size_t i=0; i<sections.size(); i++) { SgAsmElfSection *elfsec = dynamic_cast<SgAsmElfSection*>(sections[i]); if (elfsec && elfsec->get_segment_entry()!=NULL) retval.push_back(elfsec); } return retval; }
/* Same as parent, but also includes sections that aren't mapped but which contain code. */ SgAsmGenericSectionPtrList BinaryLoaderElfObj::get_remap_sections(SgAsmGenericHeader *header) { SgAsmGenericSectionPtrList retval = BinaryLoaderElf::get_remap_sections(header); const SgAsmGenericSectionPtrList §ions = header->get_sections()->get_sections(); for (SgAsmGenericSectionPtrList::const_iterator si=sections.begin(); si!=sections.end(); ++si) { SgAsmGenericSection *section = *si; if (!section->is_mapped() && section->get_contains_code()) retval.push_back(section); } return retval; }
SgAsmGenericSectionPtrList SgAsmGenericFile::get_sections_by_name(std::string name, char sep/*or NUL*/) const { SgAsmGenericSectionPtrList retval; /* Truncate name */ if (sep) { size_t pos = name.find(sep); if (pos!=name.npos) name.erase(pos); } /* Holes */ for (SgAsmGenericSectionPtrList::iterator i=p_holes->get_sections().begin(); i!=p_holes->get_sections().end(); ++i) { std::string secname = (*i)->get_name()->get_string(); if (sep) { size_t pos = secname.find(sep); if (pos!=secname.npos) secname.erase(pos); } if (0==secname.compare(name)) retval.push_back(*i); } /* Headers and their sections */ for (SgAsmGenericHeaderPtrList::iterator i=p_headers->get_headers().begin(); i!=p_headers->get_headers().end(); ++i) { std::string secname = (*i)->get_name()->get_string(); if (sep) { size_t pos = secname.find(sep); if (pos!=secname.npos) secname.erase(pos); } if (0==secname.compare(name)) retval.push_back(*i); const SgAsmGenericSectionPtrList &recurse = (*i)->get_sections_by_name(name, sep); retval.insert(retval.end(), recurse.begin(), recurse.end()); } return retval; }
SgAsmGenericSectionPtrList SgAsmGenericFile::get_sections_by_rva(rose_addr_t rva) const { SgAsmGenericSectionPtrList retval; /* Holes (probably not mapped anyway) */ for (SgAsmGenericSectionPtrList::iterator i=p_holes->get_sections().begin(); i!=p_holes->get_sections().end(); ++i) { if ((*i)->is_mapped() && rva >= (*i)->get_mapped_preferred_rva() && rva < (*i)->get_mapped_preferred_rva() + (*i)->get_mapped_size()) retval.push_back(*i); } /* Headers and their sections */ for (SgAsmGenericHeaderPtrList::iterator i=p_headers->get_headers().begin(); i!=p_headers->get_headers().end(); ++i) { if ((*i)->is_mapped() && rva >= (*i)->get_mapped_preferred_rva() && rva < (*i)->get_mapped_preferred_rva() + (*i)->get_mapped_size()) retval.push_back(*i); const SgAsmGenericSectionPtrList &recurse = (*i)->get_sections_by_rva(rva); retval.insert(retval.end(), recurse.begin(), recurse.end()); } return retval; }
/* Returns sections to be mapped */ SgAsmGenericSectionPtrList BinaryLoaderPe::get_remap_sections(SgAsmGenericHeader *header) { SgAsmGenericSectionPtrList retval; /* The NT loader always loads the PE header, so we include that first in the list. */ retval.push_back(header); /* Add the sections in the order they appear in the section table */ const SgAsmGenericSectionPtrList §ions = header->get_sections()->get_sections(); std::map<int, SgAsmGenericSection*> candidates; for (size_t i=0; i<sections.size(); i++) { if (sections[i]->get_id()>=0) { ROSE_ASSERT(candidates.find(sections[i]->get_id())==candidates.end()); candidates.insert(std::make_pair(sections[i]->get_id(), sections[i])); } } for (std::map<int, SgAsmGenericSection*>::iterator ci=candidates.begin(); ci!=candidates.end(); ++ci) { retval.push_back(ci->second); } return retval; }
/** Returns sections that have a preferred mapping that includes the specified relative virtual address. */ SgAsmGenericSectionPtrList SgAsmGenericHeader::get_sections_by_rva(rose_addr_t rva) const { SgAsmGenericSectionPtrList retval; for (SgAsmGenericSectionPtrList::iterator i = p_sections->get_sections().begin(); i!=p_sections->get_sections().end(); ++i) { SgAsmGenericSection *section = *i; if (section->is_mapped() && rva >= section->get_mapped_preferred_rva() && rva < section->get_mapped_preferred_rva() + section->get_mapped_size()) { retval.push_back(section); } } return retval; }
/** Returns sectons in this header that contain all of the specified portion of the file. */ SgAsmGenericSectionPtrList SgAsmGenericHeader::get_sections_by_offset(rose_addr_t offset, rose_addr_t size) const { SgAsmGenericSectionPtrList retval; for (SgAsmGenericSectionPtrList::iterator i=p_sections->get_sections().begin(); i!=p_sections->get_sections().end(); ++i) { SgAsmGenericSection *section = *i; if (offset >= section->get_offset() && offset < section->get_offset()+section->get_size() && offset-section->get_offset() + size <= section->get_size()) retval.push_back(section); } return retval; }
SgAsmGenericSectionPtrList SgAsmGenericFile::get_sections_by_offset(rose_addr_t offset, rose_addr_t size) const { SgAsmGenericSectionPtrList retval; /* Holes */ for (SgAsmGenericSectionPtrList::iterator i=p_holes->get_sections().begin(); i!=p_holes->get_sections().end(); ++i) { if (offset >= (*i)->get_offset() && offset < (*i)->get_offset()+(*i)->get_size() && offset-(*i)->get_offset() + size <= (*i)->get_size()) retval.push_back(*i); } /* Headers and their sections */ for (SgAsmGenericHeaderPtrList::iterator i=p_headers->get_headers().begin(); i!=p_headers->get_headers().end(); ++i) { if (offset >= (*i)->get_offset() && offset < (*i)->get_offset()+(*i)->get_size() && offset-(*i)->get_offset() + size <= (*i)->get_size()) retval.push_back(*i); const SgAsmGenericSectionPtrList &recurse = (*i)->get_sections_by_offset(offset, size); retval.insert(retval.end(), recurse.begin(), recurse.end()); } return retval; }
/* Parser */ SgAsmPESectionTable* SgAsmPESectionTable::parse() { SgAsmGenericSection::parse(); SgAsmPEFileHeader *fhdr = dynamic_cast<SgAsmPEFileHeader*>(get_header()); ROSE_ASSERT(fhdr!=NULL); /* Parse section table and construct section objects, but do not parse the sections yet. */ SgAsmGenericSectionPtrList pending; const size_t entsize = sizeof(SgAsmPESectionTableEntry::PESectionTableEntry_disk); for (size_t i=0; i<fhdr->get_e_nsections(); i++) { SgAsmPESectionTableEntry::PESectionTableEntry_disk disk; if (entsize!=read_content_local(i * entsize, &disk, entsize, false)) fprintf(stderr, "SgAsmPESectionTable::parse: warning: section table entry %" PRIuPTR " at file offset 0x%08"PRIx64 " extends beyond end of defined section table.\n", i, get_offset()+i*entsize); SgAsmPESectionTableEntry *entry = new SgAsmPESectionTableEntry(&disk); SgAsmPESection *section = NULL; if (entry->get_name() == ".idata") { section = new SgAsmPEImportSection(fhdr); } else { section = new SgAsmPESection(fhdr); } section->init_from_section_table(entry, i+1); pending.push_back(section); } /* Build the memory mapping like the real loader would do. This is the same code used by * SgAsmExecutableFileFormat::parseBinaryFormat() except we're doing it here early because we need it in the rest of the * PE parser. */ ROSE_ASSERT(NULL==fhdr->get_loader_map()); BinaryLoader *loader = BinaryLoader::lookup(fhdr); /*no need to clone; we're not changing any settings*/ ROSE_ASSERT(loader!=NULL); MemoryMap *loader_map = new MemoryMap; loader->remap(loader_map, fhdr); fhdr->set_loader_map(loader_map); /* Parse each section after the loader map is created */ for (size_t i=0; i<pending.size(); i++) pending[i]->parse(); return this; }
/** Returns sections having a preferred or actual mapping that includes the specified virtual address. If @p use_preferred is * set, then the condition is evaluated by looking at the section's preferred mapping, otherwise the actual mapping is used. * If an actual mapping is used, the specified virtual address must be part of the actual mapped section, not merely in the * memory region that was also mapped to satisfy alignment constraints. */ SgAsmGenericSectionPtrList SgAsmGenericHeader::get_sections_by_va(rose_addr_t va, bool use_preferred) const { if (use_preferred) { if (va < get_base_va()) return SgAsmGenericSectionPtrList(); rose_addr_t rva = va - get_base_va(); return get_sections_by_rva(rva); } SgAsmGenericSectionPtrList retval; for (size_t i=0; i<p_sections->get_sections().size(); i++) { SgAsmGenericSection *section = p_sections->get_sections()[i]; if (section->is_mapped() && va>=section->get_mapped_actual_va() && va<section->get_mapped_actual_va()+section->get_mapped_size()) retval.push_back(section); } return retval; }
/** Returns sections in this header that have the specified name. If 'SEP' is a non-null string then ignore any part of name at * and after SEP. */ SgAsmGenericSectionPtrList SgAsmGenericHeader::get_sections_by_name(std::string name, char sep/*or NUL*/) const { if (sep) { size_t pos = name.find(sep); if (pos!=name.npos) name.erase(pos); } SgAsmGenericSectionPtrList retval; for (SgAsmGenericSectionPtrList::iterator i=p_sections->get_sections().begin(); i!=p_sections->get_sections().end(); ++i) { std::string secname = (*i)->get_name()->get_string(); if (sep) { size_t pos = secname.find(sep); if (pos!=secname.npos) secname.erase(pos); } if (0==secname.compare(name)) retval.push_back(*i); } return retval; }