コード例 #1
0
ファイル: ir.py プロジェクト: xxtxiaofeng/miasm
## Immutability
try:
    assignblk1[id_a] = id_a
except RuntimeError:
    pass
else:
    raise RuntimeError("An error was expected")
try:
    del assignblk1[id_a]
except RuntimeError:
    pass
else:
    raise RuntimeError("An error was expected")

## Basic APIs
assert assignblk1.get_r() == set([id_b])
assert assignblk1.get_w() == set([id_a])
assert assignblk1.get_rw() == {id_a: set([id_b])}
assert assignblk1.keys() == [id_a]
assert dict(assignblk1) == {id_a: id_b}
assert assignblk1[id_a] == id_b
assert list(assignblk1.iteritems()) == assignblk1.items()

## Simplify
assignblk3 = AssignBlock({id_a: id_b - id_b})
assert assignblk3[id_a] != int0
assignblk4 = assignblk3.simplify(expr_simp)
assert assignblk3[id_a] != int0
assert assignblk4[id_a] == int0
コード例 #2
0
ファイル: sem.py プロジェクト: manwefm/miasm
    def do_it_block(self, loc, index, block, assignments, gen_pc_updt):
        instr = block.lines[index]
        it_hints, it_cond = self.parse_itt(instr)
        cond_num = cond_dct_inv[it_cond.name]
        cond_eq = tab_cond[cond_num]

        if not index + len(it_hints) <= len(block.lines):
            raise NotImplementedError("Split IT block non supported yet")

        ir_blocks_all = []

        # Gen dummy irblock for IT instr
        loc_next = self.get_next_loc_key(instr)
        dst = ExprAssign(self.IRDst, ExprLoc(loc_next, 32))
        dst_blk = AssignBlock([dst], instr)
        assignments.append(dst_blk)
        irblock = IRBlock(loc, assignments)
        ir_blocks_all.append([irblock])

        loc = loc_next
        assignments = []
        for hint in it_hints:
            irblocks = []
            index += 1
            instr = block.lines[index]

            # Add conditionnal jump to current irblock
            loc_do = self.loc_db.add_location()
            loc_next = self.get_next_loc_key(instr)

            if hint:
                local_cond = ~cond_eq
            else:
                local_cond = cond_eq
            dst = ExprAssign(
                self.IRDst,
                ExprCond(local_cond, ExprLoc(loc_do, 32),
                         ExprLoc(loc_next, 32)))
            dst_blk = AssignBlock([dst], instr)
            assignments.append(dst_blk)
            irblock = IRBlock(loc, assignments)

            irblocks.append(irblock)

            it_instr_irblocks = []
            assignments = []
            loc = loc_do

            split = self.add_instr_to_current_state(instr, block, assignments,
                                                    it_instr_irblocks,
                                                    gen_pc_updt)
            if split:
                raise NotImplementedError(
                    "Unsupported instr in IT block (%s)" % instr)

            if it_instr_irblocks:
                assert len(it_instr_irblocks) == 1
                it_instr_irblocks = it_instr_irblocks.pop()
            # Remove flags assignment if instr != [CMP, CMN, TST]
            if instr.name not in ["CMP", "CMN", "TST"]:
                # Fix assignments
                out = []
                for assignment in assignments:
                    assignment = AssignBlock(
                        {
                            dst: src
                            for (dst, src) in assignment.iteritems()
                            if dst not in [zf, nf, of, cf]
                        }, assignment.instr)
                    out.append(assignment)
                assignments = out
                # Fix extra irblocksx
                new_irblocks = []
                for irblock in it_instr_irblocks:
                    out = []
                    for tmp_assignment in irblock:
                        assignment = AssignBlock(
                            {
                                dst: src
                                for (dst, src) in assignment.iteritems()
                                if dst not in [zf, nf, of, cf]
                            }, assignment.instr)
                        out.append(assignment)
                    new_irblock = IRBlock(irblock.loc_key, out)
                    new_irblocks.append(new_irblock)
                it_instr_irblocks = new_irblocks

            irblocks += it_instr_irblocks
            dst = ExprAssign(self.IRDst, ExprLoc(loc_next, 32))
            dst_blk = AssignBlock([dst], instr)
            assignments.append(dst_blk)
            irblock = IRBlock(loc, assignments)
            irblocks.append(irblock)
            loc = loc_next
            assignments = []
            ir_blocks_all.append(irblocks)
        return index, ir_blocks_all