def get_code(disassembler: MythrilDisassembler, args: argparse.Namespace): address = None if args.code: # Load from bytecode code = args.code[2:] if args.code.startswith("0x") else args.code address, _ = disassembler.load_from_bytecode(code, args.bin_runtime) elif args.codefile: bytecode = "".join([l.strip() for l in args.codefile if len(l.strip()) > 0]) bytecode = bytecode[2:] if bytecode.startswith("0x") else bytecode address, _ = disassembler.load_from_bytecode(bytecode, args.bin_runtime) elif args.address: # Get bytecode from a contract address address, _ = disassembler.load_from_address(args.address) elif args.solidity_file: # Compile Solidity source file(s) if args.graph and len(args.solidity_file) > 1: exit_with_error( args.outform, "Cannot generate call graphs from multiple input files. Please do it one at a time.", ) address, _ = disassembler.load_from_solidity( args.solidity_file ) # list of files else: exit_with_error( args.outform, "No input bytecode. Please provide EVM code via -c BYTECODE, -a ADDRESS, or -i SOLIDITY_FILES", ) return address
def test_fire_lasers(mock_sym, mock_fire_lasers, mock_code_info): disassembler = MythrilDisassembler(eth=None) disassembler.load_from_solidity( [ str( ( Path(__file__).parent.parent / "testdata/input_contracts/origin.sol" ).absolute() ) ] ) analyzer = MythrilAnalyzer(disassembler, strategy="dfs") issues = analyzer.fire_lasers(modules=[]).sorted_issues() mock_sym.assert_called() mock_fire_lasers.assert_called() mock_code_info.assert_called() assert len(issues) == 1 assert issues[0]["swc-id"] == "101"
def load_code(disassembler: MythrilDisassembler, args: Namespace): """ Loads code into disassembly and returns address :param disassembler: :param args: :return: Address """ address = None if args.__dict__.get("code", False): # Load from bytecode code = args.code[2:] if args.code.startswith("0x") else args.code address, _ = disassembler.load_from_bytecode(code, args.bin_runtime) elif args.__dict__.get("codefile", False): bytecode = "".join( [l.strip() for l in args.codefile if len(l.strip()) > 0]) bytecode = bytecode[2:] if bytecode.startswith("0x") else bytecode address, _ = disassembler.load_from_bytecode(bytecode, args.bin_runtime) elif args.__dict__.get("address", False): # Get bytecode from a contract address address, _ = disassembler.load_from_address(args.address) elif args.__dict__.get("solidity_file", False): # Compile Solidity source file(s) if args.command in ANALYZE_LIST and args.graph and len( args.solidity_file) > 1: exit_with_error( args.outform, "Cannot generate call graphs from multiple input files. Please do it one at a time.", ) address, _ = disassembler.load_from_solidity( args.solidity_file) # list of files else: exit_with_error( args.__dict__.get("outform", "text"), "No input bytecode. Please provide EVM code via -c BYTECODE, -a ADDRESS, -f BYTECODE_FILE or <SOLIDITY_FILE>", ) return address