Exemple #1
0
def run_solidity_analysis(inputs):
    results = {}
    exit_code = 0
    num = 0
    for inp in inputs:

        logging.info("contract %s:", inp['contract'])
        with open(inp['disasm_file'], 'r') as f:
            lines = f.readlines()
            last_line = lines[-1]
            num = num + int(last_line.split(":")[0])
    logging.info("the total number:")
    logging.info(num)

    for inp in inputs:
        logging.info("contract %s:", inp['contract'])
        result, return_code = symExec.run(disasm_file=inp['disasm_file'],
                                          source_map=inp['source_map'],
                                          source_file=inp['source'])

        try:
            c_source = inp['c_source']
            c_name = inp['c_name']
            results[c_source][c_name] = result
        except:
            results[c_source] = {c_name: result}

        if return_code == 1:
            exit_code = 1
    return results, exit_code
Exemple #2
0
def analyze_bytecode():
    global args

    x = dtimer()
    helper = InputHelper(InputHelper.BYTECODE, source=args.source,evm = args.evm)
    inp = helper.get_inputs()[0]
    y = dtimer()
    print("*************************************************************")
    print("Compilation time: "+str(y-x)+"s")
    print("*************************************************************")

    r = check_c_translation_dependencies()
    
    if r:
        svc_options={}
        if args.verify:
            svc_options["verify"]=args.verify
        if args.invalid:
            svc_options["invalid"]=args.invalid
        
        result, exit_code = symExec.run(disasm_file=inp['disasm_file'],cfg = args.control_flow_graph,saco = args.saco,debug = args.debug,evm_version = evm_version_modifications,cfile = args.cfile,svc=svc_options,go = args.goto)
        helper.rm_tmp_files()
    else:
        exit_code = -1
        print("Option Error: --verify option is only applied to c translation.\n")
    if global_params.WEB:
        six.print_(json.dumps(result))

    return exit_code
Exemple #3
0
def analyze_disasm_bytecode():
    global args

    r = check_c_translation_dependencies()

    if r:
        svc_options = {}
        if args.verify:
            svc_options["verify"] = args.verify
        if args.invalid:
            svc_options["invalid"] = args.invalid

        result, exit_code = symExec.run(disasm_file=args.source,
                                        cfg=args.control_flow_graph,
                                        saco=args.saco,
                                        debug=args.debug,
                                        evm_version=evm_version_modifications,
                                        cfile=args.cfile,
                                        svc=svc_options,
                                        go=args.goto)
    else:
        exit_code = -1
        print(
            "Option Error: --verify, --goto or --invalid options are only applied to c translation.\n"
        )
    if global_params.WEB:
        six.print_(json.dumps(result))

    return exit_code
Exemple #4
0
def run_solidity_analysis_optimized(inp, hashes):
    results = {}
    exit_code = 0

    opt_info = {}
    svc_opt = {}
    opt_info["block"] = args.block

    fields = process_fields(inp['source_map'])

    opt_info["fields"] = fields

    opt_info["c_source"] = inp['c_source'].split("/")[-1]

    # print fields
    # print opt_info["c_source"]

    function_names = hashes[inp["c_name"]]

    try:
        result, return_code = symExec.run(
            disasm_file=inp['disasm_file'],
            source_map=inp['source_map'],
            source_file=inp['source'],
            cfg=args.control_flow_graph,
            saco=args.saco,
            execution=0,
            cname=inp["c_name"],
            hashes=function_names,
            debug=args.debug,
            evm_version=evm_version_modifications,
            cfile=args.cfile,
            svc=svc_opt,
            go=args.goto,
            opt=opt_info)

        try:
            c_source = inp['c_source']
            c_name = inp['c_name']
            results[c_source][c_name] = result
        except:
            results[c_source] = {c_name: result}

    except Exception as e:
        traceback.print_exc()

        if len(e.args) > 1:
            return_code = e.args[1]
        else:
            return_code = 1

        result = []
        #return_code = -1
        print("\n Exception: " + str(return_code) + "\n")
        exit_code = return_code

    return results, exit_code
Exemple #5
0
def run_solidity_analysis(inputs, hashes):
    results = {}
    exit_code = 0

    i = 0
    if len(inputs) == 1:
        inp = inputs[0]
        function_names = hashes[inp["c_name"]]
        result, return_code = symExec.run(disasm_file=inp['disasm_file'],
                                          source_map=inp['source_map'],
                                          source_file=inp['source'],
                                          cfg=args.control_flow_graph,
                                          nop=args.evm_opcodes,
                                          saco=args.saco,
                                          execution=0,
                                          cname=inp["c_name"],
                                          hashes=function_names)
        if return_code == 1:
            exit_code = 1
    else:
        for inp in inputs:
            #print hashes[inp["c_name"]]
            function_names = hashes[inp["c_name"]]
            #logging.info("contract %s:", inp['contract'])
            result, return_code = symExec.run(disasm_file=inp['disasm_file'],
                                              source_map=inp['source_map'],
                                              source_file=inp['source'],
                                              cfg=args.control_flow_graph,
                                              nop=args.evm_opcodes,
                                              saco=args.saco,
                                              execution=i,
                                              cname=inp["c_name"],
                                              hashes=function_names)
            i += 1
            try:
                c_source = inp['c_source']
                c_name = inp['c_name']
                results[c_source][c_name] = result
            except:
                results[c_source] = {c_name: result}

            if return_code == 1:
                exit_code = 1
    return results, exit_code
def analyze_bytecode():
    global args

    helper = InputHelper(InputHelper.BYTECODE, source=args.source)
    inp = helper.get_inputs()[0]

    result, exit_code = symExec.run(disasm_file=inp['disasm_file'])
    helper.rm_tmp_files()

    return exit_code
Exemple #7
0
def analyze_disasm_bytecode():
    global args

    result, exit_code = symExec.run(disasm_file=args.source,
                                    cfg=args.control_flow_graph,
                                    nop=args.evm_opcodes,
                                    saco=args.saco)
    if global_params.WEB:
        six.print_(json.dumps(result))

    return exit_code
Exemple #8
0
def analyze_bytecode():
    global args

    helper = InputHelper(InputHelper.BYTECODE, source=args.source)
    inp = helper.get_inputs()[0]

    result, exit_code = symExec.run(disasm_file=inp['disasm_file'])
    helper.rm_tmp_files()

    if global_params.WEB:
        six.print_(json.dumps(result))

    return exit_code
Exemple #9
0
def analyze_bytecode():
    global args

    helper = InputHelper(InputHelper.BYTECODE, source=args.source,evm=args.evm)
    inp = helper.get_inputs()[0]

    result, exit_code = symExec.run(disasm_file=inp['disasm_file'])
    helper.rm_tmp_files()

    if global_params.WEB:
        six.print_(json.dumps(result))

    return exit_code
def run_solidity_analysis(inputs):
    results = {}
    exit_code = 0
    for inp in inputs:
        logging.info("contract %s:", inp['contract'])
        result, return_code = symExec.run(disasm_file=inp['disasm_file'], source_map=inp['source_map'], source_file=inp['source'])

        try:
            c_source = inp['c_source']
            c_name = inp['c_name']
            results[c_source][c_name] = result
        except:
            results[c_source] = {c_name: result}

        if return_code == 1:
            exit_code = 1
    return results, exit_code
Exemple #11
0
def run_solidity_analysis(inputs):
    results = {}
    exit_code = 0

    for inp in inputs:
        logging.info("contract %s:", inp['contract'])
        result, return_code = symExec.run(disasm_file=inp['disasm_file'], source_map=inp['source_map'], source_file=inp['source'])

        try:
            c_source = inp['c_source']
            c_name = inp['c_name']
            results[c_source][c_name] = result
        except:
            results[c_source] = {c_name: result}

        if return_code == 1:
            exit_code = 1
    return results, exit_code
Exemple #12
0
def analyze_bytecode():
    global args

    x = dtimer()
    helper = InputHelper(InputHelper.BYTECODE,
                         source=args.source,
                         evm=args.evm)
    inp = helper.get_inputs()[0]
    y = dtimer()
    print("Compilation time: " + str(y - x) + "s")

    result, exit_code = symExec.run(disasm_file=inp['disasm_file'],
                                    cfg=args.control_flow_graph,
                                    nop=args.evm_opcodes,
                                    saco=args.saco)
    helper.rm_tmp_files()

    if global_params.WEB:
        six.print_(json.dumps(result))

    return exit_code
Exemple #13
0
def run_solidity_analysis(inputs,hashes):
    results = {}
    exit_code = 0
    returns = []
    
    i = 0
    r = check_c_translation_dependencies()
    svc_options={}
    if args.verify:
        svc_options["verify"]=args.verify
    if args.invalid:
        svc_options["invalid"]=args.invalid

    if len(inputs) == 1 and r:
        inp = inputs[0]
        function_names = hashes[inp["c_name"]]
        # result, return_code = symExec.run(disasm_file=inp['disasm_file'], source_map=inp['source_map'], source_file=inp['source'],cfg = args.control_flow_graph,saco = args.saco,execution = 0, cname = inp["c_name"],hashes = function_names,debug = args.debug,evm_version = evm_version_modifications,cfile = args.cfile,svc=svc_options,go = args.goto)
        try:

            result, return_code = symExec.run(disasm_file=inp['disasm_file'], source_map=inp['source_map'], source_file=inp['source'],cfg = args.control_flow_graph,saco = args.saco,execution = 0, cname = inp["c_name"],hashes = function_names,debug = args.debug,evm_version = evm_version_modifications,cfile = args.cfile,svc=svc_options,go = args.goto)
            
        except Exception as e:
            #traceback.print_exc()

            if len(e.args)>1:
                return_code = e.args[1]
            else:
                return_code = 1
            result = []
            #return_code = -1
            print ("\n Exception: "+str(return_code)+"\n")
            exit_code = return_code
            
    elif len(inputs)>1 and r:
        for inp in inputs:
            #print hashes[inp["c_name"]]
            function_names = hashes[inp["c_name"]]
            #logging.info("contract %s:", inp['contract'])
            try:            
                result, return_code = symExec.run(disasm_file=inp['disasm_file'], source_map=inp['source_map'], source_file=inp['source'],cfg = args.control_flow_graph,saco = args.saco,execution = i,cname = inp["c_name"],hashes = function_names,debug = args.debug,t_exs = args.source,evm_version = evm_version_modifications,cfile = args.cfile,svc=svc_options,go = args.goto)
                
            except Exception as e:
                #traceback.print_exc()
                if len(e.args)>1:
                    return_code = e.args[1]
                else:
                    return_code = 1
                    
                result = []
                # return_code = -1
                print ("\n Exception: "+str(return_code)+"\n")
            # result, return_code = symExec.run(disasm_file=inp['disasm_file'], source_map=inp['source_map'], source_file=inp['source'],cfg = args.control_flow_graph,saco = args.saco,execution = i,cname = inp["c_name"],hashes = function_names,debug = args.debug,t_exs = args.source,evm_version = evm_version_modifications,cfile = args.cfile,svc=svc_options,go = args.goto)
            i+=1
            returns.append(return_code)
            try:
                c_source = inp['c_source']
                c_name = inp['c_name']
                results[c_source][c_name] = result
            except:
                results[c_source] = {c_name: result}

            if return_code == 1:
                exit_code = 1
    else:
        exit_code = 1
        print("Option Error: --verify option is only applied to c translation. Use -c flag\n")


    '''
    Exception management:
    1- Oyente Error
    2- Oyente TimeOut
    3- Cloning Error
    4- RBR generation Error
    5- SACO Error
    6- C Error
    '''
        
    if (1 in returns):
        exit_code = 1
    elif (2 in returns):
        exit_code = 2
    elif (3 in returns):
        exit_code = 3
    elif (7 in returns):
        exit_code = 7
    elif (4 in returns):
        exit_code = 4
    elif (5 in returns):
        exit_code = 5
    elif (6 in returns):
        exit_code = 6
    
#    print exit_code
    return results, exit_code