Security analysis tool for EVM bytecode. Supports smart contracts built for Ethereum, Hedera, Quorum, Vechain, Roostock, Tron and other EVM-compatible blockchains.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mythril/mythril.py

71 lines
2.0 KiB

7 years ago
#!/usr/bin/env python
"""mythril.py: Ethereum VM bytecode assembler/ disassembler
http://www.github.com/b-mueller/mythril
"""
from ether import asm
import sys
7 years ago
import codecs
7 years ago
import argparse
import util
def exitWithError(message):
print(message)
sys.exit()
parser = argparse.ArgumentParser(description='Ethereum VM bytecode assembler/ disassembler')
parser.add_argument('-d', '--disassemble', action='store_true', help='disassemble, use with -c or -t')
parser.add_argument('-a', '--assemble', nargs=1, help='produce bytecode from easm input file', metavar='INPUT FILE')
parser.add_argument('-c', '--code', nargs=1, help='bytecode string ("6060604052...")', metavar='BYTECODE')
parser.add_argument('-t', '--transaction_hash', help='id of contract creation transaction')
7 years ago
parser.add_argument('-o', '--outfile')
7 years ago
parser.add_argument('--rpchost', nargs=1, default='127.0.0.1', help='RPC host')
parser.add_argument('--rpcport', nargs=1, default=8545, help='RPC port')
7 years ago
args = parser.parse_args()
if (args.disassemble):
if (args.code):
7 years ago
encoded_bytecode = args.code[0]
7 years ago
elif (args.transaction_hash):
try:
encoded_bytecode = util.bytecode_from_blockchain(args.transaction_hash, args.rpchost[0], args.rpcport[0])
7 years ago
except Exception as e:
exitWithError("Exception loading bytecode via RPC: " + str(e.message))
else:
exitWithError("Disassembler: Pass either the -c or -t flag to specify the input bytecode")
7 years ago
disassembly = asm.disassemble(util.safe_decode(encoded_bytecode))
7 years ago
easm_text = asm.disassembly_to_easm(disassembly)
if (args.outfile):
util.string_to_file(args.outfile, easm_text)
else:
sys.stdout.write(easm_text)
elif (args.assemble):
easm = util.file_to_string(args.assemble[0])
disassembly = asm.easm_to_disassembly(easm)
7 years ago
assembly = asm.assemble(disassembly)
if (args.outfile):
util.string_to_file(args.outfile, assembly)
else:
print("0x" + codecs.encode(assembly, "hex_codec"))
7 years ago
else:
parser.print_help()