Partitioner::RegionStats * Partitioner::region_statistics() { MemoryMap mymap = *map; mymap.prune(MemoryMap::MM_PROT_EXEC); return region_statistics(mymap.va_extents()); }
// Obtain a memory map for disassembly MemoryMap *disassembly_map(RSIM_Process *proc) { MemoryMap *map = new MemoryMap(proc->get_memory(), MemoryMap::COPY_SHALLOW); map->prune(MemoryMap::MM_PROT_READ); // don't let the disassembler read unreadable memory, else it will segfault // Removes execute permission for any segment whose debug name does not contain the name of the executable. When // comparing two different executables for clones, we probably don't need to compare code that came from dynamically // linked libraries since they will be identical in both executables. struct Pruner: MemoryMap::Visitor { std::string exename; Pruner(const std::string &exename): exename(exename) {} virtual bool operator()(const MemoryMap*, const Extent&, const MemoryMap::Segment &segment_) { MemoryMap::Segment *segment = const_cast<MemoryMap::Segment*>(&segment_); if (segment->get_name().find(exename)==std::string::npos) { unsigned p = segment->get_mapperms(); p &= ~MemoryMap::MM_PROT_EXEC; segment->set_mapperms(p); } return true; } } pruner(proc->get_exename()); map->traverse(pruner); return map; }