Ejemplo n.º 1
0
 def test_minimal(self):
     for path in (('linux','amd64','static64.llvm.elf'), ('linux','i386','static32.llvm.elf')):
         logger.warn("======== %r ========", path)
         fn = helpers.getTestPath(*path)
         e = Elf.Elf(file(fn))
         vw = viv_cli.VivCli()
         vw.loadFromFile(fn)
Ejemplo n.º 2
0
    def parseBinary(self):
        typemap = {
            Elf.STT_FUNC: vtrace.SYM_FUNCTION,
            Elf.STT_SECTION: vtrace.SYM_SECTION,
            Elf.STT_OBJECT: vtrace.SYM_GLOBAL
        }

        elf = Elf.Elf(self.filename)
        base = self.loadbase

        # Quick pass to see if we need to assume prelink
        for sec in elf.sections:
            if sec.name != ".text":
                continue
            # Try to detect prelinked
            if sec.sh_addr != sec.sh_offset:
                base = 0
            break

        for sec in elf.sections:
            self.addSymbol(sec.name, sec.sh_addr + base, sec.sh_size,
                           vtrace.SYM_SECTION)

        for sym in elf.symbols:
            self.addSymbol(sym.name, sym.st_value + base, sym.st_size,
                           typemap.get((sym.st_info & 0xf), vtrace.SYM_MISC))

        for sym in elf.dynamic_symbols:
            self.addSymbol(sym.name, sym.st_value + base, sym.st_size,
                           typemap.get((sym.st_info & 0xf), vtrace.SYM_MISC))
Ejemplo n.º 3
0
    def test_files(self):
        results = []
        for name, test_data, path in self.data:
            logger.warning("======== %r ========", name)
            fn = helpers.getTestPath(*path)
            e = Elf.Elf(open(fn, 'rb'))
            vw = viv_cli.VivCli()
            vw.loadFromFile(fn)

            do_analyze(vw)

            logger.debug("testing %r (%r)...", name, fn)
            retval = self.do_file(vw, test_data, name)
            results.append(retval)

        failed = 0
        for fidx, tres in enumerate(results):
            for testname, testdata in tres.items():
                if testdata != (0, 0):
                    failed += testdata[0] + testdata[1]
                    fname = self.data[fidx][0]
                    failed_old, failed_new = testdata
                    logger.error('%s:  %s: missing: %r   new: %r (%r)', fname, testname, failed_old, failed_new, fname)

        self.assertEqual(failed, 0, msg="ELF Tests Failed (see error log)")
Ejemplo n.º 4
0
    def platformParseBinary(self, filename, baseaddr, normname):
        typemap = {
            Elf.STT_FUNC: e_resolv.FunctionSymbol,
            Elf.STT_SECTION: e_resolv.SectionSymbol,
        }

        fd = file(filename, 'rb')
        elf = Elf.Elf(fd)
        addbase = 0
        if not elf.isPreLinked() and elf.isSharedObject():
            addbase = baseaddr

        for sec in elf.sections:
            sym = e_resolv.SectionSymbol(sec.name, sec.sh_addr + addbase,
                                         sec.sh_size, normname)
            self.addSymbol(sym)

        for sym in elf.symbols:
            symclass = typemap.get((sym.st_info & 0xf), e_resolv.Symbol)
            sym = symclass(sym.name, sym.st_value + addbase, sym.st_size,
                           normname)
            self.addSymbol(sym)

        for sym in elf.dynamic_symbols:
            symclass = typemap.get((sym.st_info & 0xf), e_resolv.Symbol)
            sym = symclass(sym.name, sym.st_value + addbase, sym.st_size,
                           normname)
            self.addSymbol(sym)
Ejemplo n.º 5
0
 def DISABLEtest_minimal(self):
     '''
     Until we've got soe decent tests for this, all this does is prolong the test time
     '''
     for path in (('linux','amd64','static64.llvm.elf'), ('linux','i386','static32.llvm.elf')):
         logger.warning("======== %r ========", path)
         fn = helpers.getTestPath(*path)
         e = Elf.Elf(open(fn, 'rb'))
         vw = viv_cli.VivCli()
         vw.loadFromFile(fn)
Ejemplo n.º 6
0
def update_elfDict(game, my_elves):
    global elfDict
    if my_elves:  # add new and delete old elves from the dictionary
        for elf in my_elves:  # add new
            if elf.unique_id not in elfDict.keys():
                elfDict[elf.unique_id] = Elf(game, elf)

        for uid in elfDict.keys():  # delete old
            if uid not in [elf.unique_id for elf in my_elves]:
                del elfDict[uid]
    else:  # if we have no elves just clear the dictionary
        elfDict.clear()

    for elf in elfDict.values():  # update game for all elf objects
        elf.game = game
Ejemplo n.º 7
0
    def find_elf_header(self):
        '''
        Find and populate an ELF header structure.
        Will also clear all section header information since it is invalid.
        '''

        self.elf.seek(0, 0)
        self.elf_header = Elf.Elf(self.elf.read(64))
        self.elf_header.myname = "rebuilt elf header"
        self.elf_header.e_shoff = 0
        self.elf_header.e_shentsize = 0
        self.elf_header.e_shnum = 0
        self.elf_header.e_shstrndx = 0

        self.elf.seek(0, 0)
        self.elf.write(self.elf_header.serialize())
Ejemplo n.º 8
0
 def createUnitToBuy(self):
     self.uniteToBuy = [
         Amazon(),
         Dwarf(),
         Elf(),
         Giant(),
         Hobbit(),
         Humans(),
         Mago(),
         Orc(),
         Rats(),
         Skeletton(),
         Triton(),
         Troll(),
         Wizzard(),
         Zombie()
     ]
     shuffle(self.uniteToBuy)
Ejemplo n.º 9
0
    def setUpClass(cls):
        super(ELFTests, cls).setUpClass()

        cls.tests = []
        for test in data:
            name, test_data, path = test
            logger.warn("======== %r ========", name)
            fn = helpers.getTestPath(*path)
            e = Elf.Elf(file(fn))
            vw = viv_cli.VivCli()
            vw.loadFromFile(fn)
            #vw.analyze()
            vae.analyze(vw)
            vagr.analyze(vw)
            vaeep.analyze(vw)
            vagp.analyze(vw)

            cls.tests.append((name, test_data, fn, e, vw))

        cls.maxDiff = None
Ejemplo n.º 10
0
    def platformParseBinary(self, filename, baseaddr, normname):
        typemap = {
            Elf.STT_FUNC: e_resolv.FunctionSymbol,
            Elf.STT_SECTION: e_resolv.SectionSymbol,
        }

        try:
            fd = self.platformOpenFile(filename)
            elf = Elf.Elf(fd)
        except IOError:
            try:
                # it's possible we hit vdso or something similar
                elf = Elf.elfFromMemoryObject(self, baseaddr)
            except:
                raise
        # elf = Elf.Elf(fd)
        addbase = 0
        if not elf.isPreLinked() and elf.isSharedObject():
            addbase = baseaddr

        for sec in elf.sections:
            sym = e_resolv.SectionSymbol(sec.name, sec.sh_addr + addbase,
                                         sec.sh_size, normname)
            self.addSymbol(sym)

        for sym in elf.symbols:
            symclass = typemap.get((sym.st_info & 0xf), e_resolv.Symbol)
            sym = symclass(sym.name, sym.st_value + addbase, sym.st_size,
                           normname)
            self.addSymbol(sym)

        for sym in elf.dynamic_symbols:
            symclass = typemap.get((sym.st_info & 0xf), e_resolv.Symbol)
            sym = symclass(sym.name, sym.st_value + addbase, sym.st_size,
                           normname)
            self.addSymbol(sym)

        if elf.isExecutable():
            sym = e_resolv.Symbol('__entry', elf.e_entry, 0, normname)
            self.addSymbol(sym)
Ejemplo n.º 11
0
    def __init__(self, name, trace=None, verbose=False):
        self.binexe = name.split(os.sep)[-1]
        self.verbose = verbose
        self.locsec = None
        self.bin = None
        self.startaddress = None
        self.eip = 0
        self.lastcall = (0, 0)  # last target and last source address
        if os.name == 'posix':
            self.bin = Elf(argv[1])
            self.startaddress = self.bin.e_entry
        elif os.name == 'nt':
            self.bin = PE(argv[1])
            self.startaddress = self.bin.OPTIONAL_HEADER.AddressOfEntryPoint + self.bin.OPTIONAL_HEADER.ImageBase

        self.me = getTrace()
        self.me.registerNotifier(NOTIFY_EXIT, VerboseNotifier())
        self.me.registerNotifier(NOTIFY_BREAK, VerboseNotifier())
        self.me.registerNotifier(NOTIFY_LOAD_LIBRARY, LibraryNotifier())
        self.me.addBreakpoint(
            Breakpoint(self.startaddress)
        )  # This should get us past the loader code into the actual start of the binary
        self.me.metadata['RUN'] = True
        self.me.execute(argv[1])
Ejemplo n.º 12
0
def parseFd(vw, fd, filename=None, baseaddr=None):
    fd.seek(0)
    elf = Elf.Elf(fd)
    return loadElfIntoWorkspace(vw, elf, filename=filename, baseaddr=baseaddr)
Ejemplo n.º 13
0
def parseBytes(vw, bytes, baseaddr=None):
    fd = StringIO(bytes)
    elf = Elf.Elf(fd)
    return loadElfIntoWorkspace(vw, elf, baseaddr=baseaddr)
Ejemplo n.º 14
0
def parseFile(vw, filename, baseaddr=None):
    fd = open(filename, 'rb')
    elf = Elf.Elf(fd)
    return loadElfIntoWorkspace(vw, elf, filename=filename, baseaddr=baseaddr)
Ejemplo n.º 15
0
def parseBytes(vw, bytes):
    fd = StringIO(bytes)
    elf = Elf.Elf(fd)
    return loadElfIntoWorkspace(vw, elf)
Ejemplo n.º 16
0
def parseFile(vw, filename):
    fd = file(filename, 'rb')
    elf = Elf.Elf(fd)
    return loadElfIntoWorkspace(vw, elf, filename=filename)
Ejemplo n.º 17
0
def load_level():
    global book
    global player
    global timer
    global elements
    global elfs

    values = {}

    file_name = "./Assets/Levels/level1.dat"

    if not os.path.isfile(file_name):
        return False

    else:
        file = open(file_name, "r")

        for line in file.readlines():
            v_n = ""
            v = ""
            s = 0

            for c in line:
                if c == '=':
                    s = 1
                    continue
                elif c == ' ':
                    continue

                if s == 0:
                    v_n = v_n + c
                elif s == 1:
                    v = v + c

            values[v_n] = v.replace('\n', '')

        file.close()

    if not os.path.isfile(values["board"]):
        return False

    else:
        player = Player(int(values["start_x"]), int(values["start_y"]))
        elements = []
        elfs = []

        file = open(values["board"], "r")

        i = 0

        for value in file.readlines():

            nu = ""
            co = ""
            ro = ""
            s = 0

            for c in value:
                if c == '-':
                    s = s + 1
                    continue
                if s == 0:
                    nu = nu + c
                elif s == 1:
                    co = co + c
                elif s == 2:
                    ro = ro + c

            sprite = titles[int(nu)]

            sprite = pygame.transform.rotate(sprite, 90 * int(ro))

            elements.append(
                Element(i % int(values["size_x"]),
                        int(i / int(values["size_x"])), sprite, int(co)))

            i = i + 1

        file.close()

        book = Book(elements)

        for i in range(3):
            elfs.append(Elf(elements, player))

        timer = threading.Thread(target=timer_loop)
        timer.start()