def parse_section(self): name = strip(self.f.read(16)) segname = strip(self.f.read(16)) addr = get_int(self.f) if self.macho.is_32_bit() else get_ll(self.f) size = get_int(self.f) if self.macho.is_32_bit() else get_ll(self.f) offset = get_int(self.f) align = get_int(self.f) reloff = get_int(self.f) nreloc = get_int(self.f) flags = get_int(self.f) self.f.read(8) if self.macho.is_32_bit() else self.f.read(12) if self.macho.is_little(): addr = little(addr, 'I') if self.macho.is_32_bit() \ else little(addr, 'Q') size = little(size, 'I') if self.macho.is_32_bit() \ else little(size, 'Q') offset = little(offset, 'I') align = little(align, 'I') reloff = little(reloff, 'I') nreloc = little(nreloc, 'I') flags = little(flags, 'I') section = Section(name=name, segname=segname, addr=addr, offset=offset, align=align, reloff=reloff, nreloc=nreloc, size=size) self.parse_section_flags(section, flags) return section
def parse_load_dylib(self, lc): offset = get_int(self.f) timestamp = get_int(self.f) current_version = get_int(self.f) compatibility_version = get_int(self.f) if self.macho.is_little(): offset = little(offset, 'I') timestamp = little(timestamp, 'I') current_version = little(current_version, 'I') compatibility_version = little(compatibility_version, 'I') timestamp = datetime.fromtimestamp(timestamp) current_version = Version(version=current_version) compatibility_version = Version(version=compatibility_version) dylib = strip(self.f.read(lc.size - 24)) self.macho.add_dylib(dylib) lc.add_data('timestamp', str(timestamp)) lc.add_data('current_version', current_version.version) lc.add_data('compatibility_version', compatibility_version.version) lc.add_data('dylib', dylib) self.macho.add_lc(lc)
def parse_segment(self, lc): name = strip(self.f.read(16)) vmaddr = get_int(self.f) if self.macho.is_32_bit() else get_ll(self.f) vmsize = get_int(self.f) if self.macho.is_32_bit() else get_ll(self.f) offset = get_int(self.f) if self.macho.is_32_bit() else get_ll(self.f) segsize = get_int(self.f) if self.macho.is_32_bit() else get_ll(self.f) maxprot = get_int(self.f) initprot = get_int(self.f) nsects = get_int(self.f) flags = get_int(self.f) if self.macho.is_little(): vmaddr = little(vmaddr, 'I') if self.macho.is_32_bit() \ else little(vmaddr, 'Q') vmsize = little(vmsize, 'I') if self.macho.is_32_bit() \ else little(vmsize, 'Q') offset = little(offset, 'I') if self.macho.is_32_bit() \ else little(offset, 'Q') segsize = little(segsize, 'I') if self.macho.is_32_bit() \ else little(segsize, 'Q') maxprot = little(maxprot, 'I') initprot = little(initprot, 'I') nsects = little(nsects, 'I') flags = little(flags, 'I') maxprot = dictionary.protections[maxprot & 0b111] initprot = dictionary.protections[initprot & 0b111] entropy = self.get_segment_entropy(offset, segsize) segment = Segment(cmd=lc.cmd, size=lc.size, name=name, vmaddr=vmaddr, vmsize=vmsize, offset=offset, segsize=segsize, maxprot=maxprot, initprot=initprot, nsects=nsects, entropy=entropy) if self.macho.is_32_bit(): sect_size = 68 else: sect_size = 80 for i in range(segment.nsects): if self.f.tell() + sect_size > self.file_size: data = {'offset': self.f.tell(), 'file_size': self.file_size} a = Abnormality(title='SECTION OUT OF BOUNDS', data=data) break sect = self.parse_section() segment.add_sect(sect) self.parse_segment_flags(segment, flags) self.macho.add_lc(segment)
def parseSegment(self, lc): name = strip(self._f.read(16)) vmaddr = getInt(self._f) if self._macho.is32Bit() else getLL(self._f) vmsize = getInt(self._f) if self._macho.is32Bit() else getLL(self._f) offset = getInt(self._f) if self._macho.is32Bit() else getLL(self._f) segsize = getInt(self._f) if self._macho.is32Bit() else getLL(self._f) maxprot = getInt(self._f) initprot = getInt(self._f) nsects = getInt(self._f) flags = getInt(self._f) if self._macho.isLittle(): vmaddr = little(vmaddr, 'I') if self._macho.is32Bit() \ else little(vmaddr, 'Q') vmsize = little(vmsize, 'I') if self._macho.is32Bit() \ else little(vmsize, 'Q') offset = little(offset, 'I') if self._macho.is32Bit() \ else little(offset, 'Q') segsize = little(segsize, 'I') if self._macho.is32Bit() \ else little(segsize, 'Q') maxprot = little(maxprot, 'I') initprot = little(initprot, 'I') nsects = little(nsects, 'I') flags = little(flags, 'I') maxprot = dictionary.protections[maxprot & 0b111] initprot = dictionary.protections[initprot & 0b111] segment = Segment(cmd=lc.getCmd(), size=lc.getSize(), name=name, vmaddr=vmaddr, vmsize=vmsize, offset=offset, segsize=segsize, maxprot=maxprot, initprot=initprot, nsects=nsects) if self._macho.is32Bit(): sect_size = 68 else: sect_size = 80 for i in range(segment.getNSects()): if self._f.tell() + sect_size > self._file_size: data = {'offset': self._f.tell(), 'file_size': self._file_size} a = Abnormality(title='SECTION OUT OF BOUNDS', data=data) break sect = self.parseSection() segment.addSect(sect) self.parseSegmentFlags(segment, flags) self._macho.addLC(segment)
def parse_segment(self, lc): name = strip(self.f.read(16)) vmaddr = get_int(self.f) if self.macho.is_32_bit() else get_ll(self.f) vmsize = get_int(self.f) if self.macho.is_32_bit() else get_ll(self.f) offset = get_int(self.f) if self.macho.is_32_bit() else get_ll(self.f) segsize = get_int(self.f) if self.macho.is_32_bit() else get_ll(self.f) maxprot = get_int(self.f) initprot = get_int(self.f) nsects = get_int(self.f) flags = get_int(self.f) if self.macho.is_little(): vmaddr = little(vmaddr, 'I') if self.macho.is_32_bit() \ else little(vmaddr, 'Q') vmsize = little(vmsize, 'I') if self.macho.is_32_bit() \ else little(vmsize, 'Q') offset = little(offset, 'I') if self.macho.is_32_bit() \ else little(offset, 'Q') segsize = little(segsize, 'I') if self.macho.is_32_bit() \ else little(segsize, 'Q') maxprot = little(maxprot, 'I') initprot = little(initprot, 'I') nsects = little(nsects, 'I') flags = little(flags, 'I') maxprot = dictionary.protections[maxprot & 0b111] initprot = dictionary.protections[initprot & 0b111] entropy = self.get_segment_entropy(offset, segsize) segment = Segment(cmd=lc.cmd, size=lc.size, name=name, vmaddr=vmaddr, vmsize=vmsize, offset=offset, segsize=segsize, maxprot=maxprot, initprot=initprot, nsects=nsects, entropy=entropy) if self.macho.is_32_bit(): sect_size = 68 else: sect_size = 80 for i in range(segment.nsects): if self.f.tell() + sect_size > self.file_size: data = { 'offset': self.f.tell(), 'file_size': self.file_size } a = Abnormality(title='SECTION OUT OF BOUNDS', data=data) break sect = self.parse_section() segment.add_sect(sect) self.parse_segment_flags(segment, flags) self.macho.add_lc(segment)
def readProfile(profileFile, testVar): ''' Read a profile file with x y pairs # 2 x0 y0 x1 y1 ... & With units of kilometers. Return results in meters along with distance along profile. Parameters ---------- profileFile : str path of file with profile. testVar: firedrake function any function with meshdomain used to test if points in domain. Points not in domain are discarded. Returns ------- xyProf : np array (npts, 2) xy array with points in m. d : np array (npts) Distance alogn profile in km. ''' xyProf = u.strip(profileFile) # read file # Compute distance along profile i = 0 xyEdited = [] xyLast = None for xy in xyProf: # use try in case profile has points outside of mesh xy[0] *= 1000. # In meters xy[1] *= 1000. try: if i == 0: d = [0] else: _ = testVar((xy[0], xy[1])) # Cause exception if outside mesh d.append(d[i - 1] + np.sqrt((xy[0] - xyLast[0])**2 + (xy[1] - xyLast[1])**2)) xyLast = xy xyEdited.append(xy) i += 1 except Exception: continue d = np.array(d) * 0.001 # In km # xyProf = np.array(xyEdited) return xyProf, d
def parseSegment(self, lc): name = strip(self._f.read(16)) vmaddr = getInt(self._f) if self._macho.is32Bit() else getLL(self._f) vmsize = getInt(self._f) if self._macho.is32Bit() else getLL(self._f) offset = getInt(self._f) if self._macho.is32Bit() else getLL(self._f) segsize = getInt(self._f) if self._macho.is32Bit() else getLL(self._f) maxprot = getInt(self._f) initprot = getInt(self._f) nsects = getInt(self._f) flags = getInt(self._f) if self._macho.isLittle(): vmaddr = little(vmaddr, 'I') if self._macho.is32Bit() \ else little(vmaddr, 'Q') vmsize = little(vmsize, 'I') if self._macho.is32Bit() \ else little(vmsize, 'Q') offset = little(offset, 'I') if self._macho.is32Bit() \ else little(offset, 'Q') segsize = little(segsize, 'I') if self._macho.is32Bit() \ else little(segsize, 'Q') maxprot = little(maxprot, 'I') initprot = little(initprot, 'I') nsects = little(nsects, 'I') flags = little(flags, 'I') maxprot = dictionary.protections[maxprot & 0b111] initprot = dictionary.protections[initprot & 0b111] segment = Segment(cmd=lc.getCmd(), size=lc.getSize(), name=name, vmaddr=vmaddr, vmsize=vmsize, offset=offset, segsize=segsize, maxprot=maxprot, initprot=initprot, nsects=nsects) if self._macho.is32Bit(): sect_size = 68 else: sect_size = 80 for i in range(segment.getNSects()): if self._f.tell() + sect_size > self._file_size: data = { 'offset': self._f.tell(), 'file_size': self._file_size } a = Abnormality(title='SECTION OUT OF BOUNDS', data=data) break sect = self.parseSection() segment.addSect(sect) self.parseSegmentFlags(segment, flags) self._macho.addLC(segment)
def parseLoadDylib(self, lc): offset = getInt(self._f) if self._macho.isLittle(): offset = little(offset, 'I') # skip to dylib self._f.read(offset - 12) dylib = strip(self._f.read(lc.getSize() - 24)) self._macho.addDylib(dylib) lc.addData('dylib', dylib) self._macho.addLC(lc)
def parse_load_dylib(self, lc): offset = get_int(self.f) if self.macho.is_little(): offset = little(offset, 'I') # skip to dylib self.f.read(offset - 12) dylib = strip(self.f.read(lc.size - 24)) self.macho.add_dylib(dylib) lc.add_data('dylib', dylib) self.macho.add_lc(lc)
def parseSubStuff(self, lc): name = strip(self._f.read(lc.getSize() - 8)) lc.addData('name', name) self._macho.addLC(lc)
def parse_rpath(self, lc): # first char is \n path = strip(self.f.read(lc.size - 8)[1:]) lc.add_data('path', path) self.macho.add_lc(lc)
def parse_sub_stuff(self, lc): name = strip(self.f.read(lc.size - 8)) lc.add_data('name', name) self.macho.add_lc(lc)
def parse_load_dylinker(self, lc): # first char is \n name = strip(self.f.read(lc.size - 8)[1:]) lc.add_data('name', name) self.macho.add_lc(lc)
def parseLoadDylinker(self, lc): # first char is \n name = strip(self._f.read(lc.getSize() - 8)[1:]) lc.addData('name', name) self._macho.addLC(lc)
def parseRPath(self, lc): # first char is \n path = strip(self._f.read(lc.getSize() - 8)[1:]) lc.addData('path', path) self._macho.addLC(lc)