Пример #1
0
    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
Пример #2
0
    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
Пример #3
0
    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)
Пример #4
0
    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)
Пример #5
0
    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)
Пример #6
0
    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)
Пример #7
0
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
Пример #8
0
    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)
Пример #9
0
    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)
Пример #10
0
    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)
Пример #11
0
    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)
Пример #12
0
    def parseSubStuff(self, lc):
        name = strip(self._f.read(lc.getSize() - 8))
        lc.addData('name', name)

        self._macho.addLC(lc)
Пример #13
0
    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)
Пример #14
0
    def parse_sub_stuff(self, lc):
        name = strip(self.f.read(lc.size - 8))
        lc.add_data('name', name)

        self.macho.add_lc(lc)
Пример #15
0
    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)
Пример #16
0
    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)
Пример #17
0
    def parseSubStuff(self, lc):
        name = strip(self._f.read(lc.getSize() - 8))
        lc.addData('name', name)

        self._macho.addLC(lc)
Пример #18
0
    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)
Пример #19
0
    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)
Пример #20
0
    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)
Пример #21
0
    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)
Пример #22
0
    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)
Пример #23
0
    def parse_sub_stuff(self, lc):
        name = strip(self.f.read(lc.size - 8))
        lc.add_data('name', name)

        self.macho.add_lc(lc)