mirror of https://github.com/crytic/slither
parent
0e83e91936
commit
fba467e480
@ -0,0 +1,72 @@ |
|||||||
|
import os |
||||||
|
import argparse |
||||||
|
from slither import Slither |
||||||
|
from slither.utils.colors import red |
||||||
|
import logging |
||||||
|
from .possible_paths import find_target_paths, resolve_functions, ResolveFunctionException |
||||||
|
|
||||||
|
logging.basicConfig() |
||||||
|
logging.getLogger("Slither").setLevel(logging.INFO) |
||||||
|
|
||||||
|
def parse_args(): |
||||||
|
""" |
||||||
|
Parse the underlying arguments for the program. |
||||||
|
:return: Returns the arguments for the program. |
||||||
|
""" |
||||||
|
parser = argparse.ArgumentParser(description='PossiblePaths', |
||||||
|
usage='possible_paths.py filename [contract.function targets]') |
||||||
|
|
||||||
|
parser.add_argument('filename', |
||||||
|
help='The filename of the contract or truffle directory to analyze.') |
||||||
|
|
||||||
|
parser.add_argument('targets', nargs='+') |
||||||
|
|
||||||
|
parser.add_argument('--solc', help='solc path', default='solc') |
||||||
|
|
||||||
|
return parser.parse_args() |
||||||
|
|
||||||
|
|
||||||
|
def main(): |
||||||
|
# ------------------------------ |
||||||
|
# PossiblePaths.py |
||||||
|
# Usage: python3 possible_paths.py filename targets |
||||||
|
# Example: python3 possible_paths.py contract.sol contract1.function1 contract2.function2 contract3.function3 |
||||||
|
# ------------------------------ |
||||||
|
# Parse all arguments |
||||||
|
args = parse_args() |
||||||
|
|
||||||
|
# Perform slither analysis on the given filename |
||||||
|
slither = Slither(args.filename, is_truffle=os.path.isdir(args.filename), solc=args.solc, disable_solc_warnings=True) |
||||||
|
|
||||||
|
try: |
||||||
|
targets = resolve_functions(slither, args.targets) |
||||||
|
except ResolveFunctionException as r: |
||||||
|
print(red(r)) |
||||||
|
exit(-1) |
||||||
|
|
||||||
|
# Print out all target functions. |
||||||
|
print(f"Target functions:") |
||||||
|
for target in targets: |
||||||
|
print(f"- {target.contract.name}.{target.full_name}") |
||||||
|
print("\n") |
||||||
|
|
||||||
|
# Obtain all paths which reach the target functions. |
||||||
|
reaching_paths = find_target_paths(slither, targets) |
||||||
|
reaching_functions = set([y for x in reaching_paths for y in x if y not in targets]) |
||||||
|
|
||||||
|
# Print out all function names which can reach the targets. |
||||||
|
print(f"The following functions reach the specified targets:") |
||||||
|
for function_desc in sorted([f"{f.contract.name}.{f.full_name}" for f in reaching_functions]): |
||||||
|
print(f"- {function_desc}") |
||||||
|
print("\n") |
||||||
|
|
||||||
|
# Format all function paths. |
||||||
|
reaching_paths_str = [' -> '.join([f"{f.contract.name}.{f.full_name}" for f in reaching_path]) for reaching_path in reaching_paths] |
||||||
|
|
||||||
|
# Print a sorted list of all function paths which can reach the targets. |
||||||
|
print(f"The following paths reach the specified targets:") |
||||||
|
for reaching_path in sorted(reaching_paths_str): |
||||||
|
print(f"{reaching_path}\n") |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
main() |
Loading…
Reference in new issue