import typer import platform import signal import threading import sys from rich.console import Console from rich.table import Table from Modules import CmdInterface from Modules.CmdInterface import is_valid_number from Modules import Worker if platform.system() == "Windows": DEFAULT_COMPORT = "COM1" else: DEFAULT_COMPORT = "/dev/ttyACM0" app = typer.Typer( name="FaultyCat", help="Script to control the FaultyCat and launch faulty attacks.", add_completion=False, no_args_is_help=True, ) faulty_worker = Worker.FaultyWorker() workers = [] def signal_handler(sig, frame): print("You pressed Ctrl+C!") faulty_worker.stop_workers() for work in workers: work.join() sys.exit(0) @app.command("config") def config(): """Get the current configuration of the FaultyCat.""" table_config = Table(title="Board configuration") table_config.add_column("Parameter", style="cyan") table_config.add_column("Value", style="magenta") table_config.add_row( "Pulse time", f"{faulty_worker.board_configurator.BOARD_CONFIG['pulse_time']}" ) table_config.add_row( "Pulse power", f"{faulty_worker.board_configurator.BOARD_CONFIG['pulse_power']}" ) Console().print(table_config) @app.command("devices") def devices(): """Get the list of available devices.""" table_devices = Table(title="Available devices") table_devices.add_column("Device", style="cyan") table_devices.add_column("Description", style="magenta") for device in faulty_worker.board_uart.get_serial_ports(): table_devices.add_row(f"{device.device}", f"{device.description}") Console().print(table_devices) @app.command("fault") def faulty( comport: str = typer.Argument( default=DEFAULT_COMPORT, help="Serial port to use for uploading.", ), pulse_count: int = typer.Option( 1, "--pulse-count", "-p", help="Number of pulses to send.", show_default=True ), pulse_timeout: float = typer.Option( 1.0, "--pulse-timeout", "-t", help="Time in seconds between pulses.", show_default=True, ), cmd: bool = typer.Option( False, "--cmd", "-c", help="Launch the CMD Interface.", show_default=True ), ): """Setting up the FaultyCat. With this command you can configure the FaultyCat and launch faulty attacks.""" typer.echo("Configuring the FaultyCat...") table_config = Table(title="Board configuration") table_config.add_column("Parameter", style="cyan") table_config.add_column("Value", style="magenta") table_config.add_row("Serial port", f"{comport}") table_config.add_row( "Pulse time", f"{faulty_worker.board_configurator.BOARD_CONFIG['pulse_time']}" ) table_config.add_row( "Pulse power", f"{faulty_worker.board_configurator.BOARD_CONFIG['pulse_power']}" ) table_config.add_row("Pulse count", f"{pulse_count}") table_config.add_row("Pulse timeout", f"{pulse_timeout}") Console().print(table_config) faulty_worker.set_serial_port(comport) if cmd: CmdInterface.CMDInterface(faulty_worker).cmdloop() return if not faulty_worker.validate_serial_connection(): typer.secho( f"FaultyCMD could not stablish connection withe the board on: {comport}.", fg=typer.colors.RED, ) return faulty_worker.set_pulse_count(is_valid_number(pulse_count)) faulty_worker.set_pulse_time(is_valid_number(pulse_timeout)) faulty_worker.start_faulty_attack() if __name__ == "__main__": print( """\x1b[36;1m .@@@%@*%+ -@@+ #@@: @@% =@@@@%- %@% %+ @= | .@@-.-.#@+=@@* %@@- .@@@.@@%:@@@ @@@ %+ :+++- @*+++- | FaultyCat v0.0.1 .@*.=.+@@:=@@* %@@- .@@@.@@% @@@ @@@ %+ #%:.:## @%:.:## | by JahazielLem .@@%*+*=. :@@%==@@@#-*@@#.@@% @@@-@@@ %+ @+ =@.@+ =@. | Company: PWNLabs - Electronics Cats %@% :#@@@%*#@@@%+ %@* :#@@@#: =%#**=.*####@..*####: | \x1b[0m""" ) signal.signal(signal.SIGINT, signal_handler) app()