- 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()