diff --git a/tools/others/android_attack.py b/tools/others/android_attack.py index 5b56a2a..8e536ef 100644 --- a/tools/others/android_attack.py +++ b/tools/others/android_attack.py @@ -2,6 +2,16 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class Keydroid(HackingTool): TITLE = "Keydroid" @@ -65,3 +75,62 @@ class AndroidAttackTools(HackingToolsCollection): Droidcam(), EvilApp() ] + + def pretty_print(self): + table = Table(title="Android Attack Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Android Attack Tools Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "—") + table.add_row(str(i + 1), title, desc or "—") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = AndroidAttackTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/others/email_verifier.py b/tools/others/email_verifier.py index 5969bd0..672df51 100644 --- a/tools/others/email_verifier.py +++ b/tools/others/email_verifier.py @@ -2,6 +2,15 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class KnockMail(HackingTool): TITLE = "Knockmail" @@ -17,4 +26,62 @@ class KnockMail(HackingTool): class EmailVerifyTools(HackingToolsCollection): TITLE = "Email Verify tools" TOOLS = [KnockMail()] - + + def pretty_print(self): + table = Table(title="Email Verify Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Email Verify Tools Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "—") + table.add_row(str(i + 1), title, desc or "—") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = EmailVerifyTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/others/hash_crack.py b/tools/others/hash_crack.py index 60a7289..96651e7 100644 --- a/tools/others/hash_crack.py +++ b/tools/others/hash_crack.py @@ -2,6 +2,16 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class HashBuster(HackingTool): TITLE = "Hash Buster" @@ -19,3 +29,62 @@ class HashBuster(HackingTool): class HashCrackingTools(HackingToolsCollection): TITLE = "Hash cracking tools" TOOLS = [HashBuster()] + + def pretty_print(self): + table = Table(title="Hash Cracking Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Hash Cracking Tools Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "—") + table.add_row(str(i + 1), title, desc or "—") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = HashCrackingTools() + tools.pretty_print() + tools.show_options() diff --git a/tools/others/homograph_attacks.py b/tools/others/homograph_attacks.py index 1ff2207..4d9943d 100644 --- a/tools/others/homograph_attacks.py +++ b/tools/others/homograph_attacks.py @@ -2,6 +2,16 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class EvilURL(HackingTool): TITLE = "EvilURL" @@ -15,3 +25,62 @@ class EvilURL(HackingTool): class IDNHomographAttackTools(HackingToolsCollection): TITLE = "IDN Homograph Attack" TOOLS = [EvilURL()] + + def pretty_print(self): + table = Table(title="IDN Homograph Attack Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]IDN Homograph Attack Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "—") + table.add_row(str(i + 1), title, desc or "—") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = IDNHomographAttackTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/others/mix_tools.py b/tools/others/mix_tools.py index 9608302..5f54f92 100644 --- a/tools/others/mix_tools.py +++ b/tools/others/mix_tools.py @@ -2,6 +2,16 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class TerminalMultiplexer(HackingTool): TITLE = "Terminal Multiplexer" @@ -37,3 +47,61 @@ class MixTools(HackingToolsCollection): Crivo() ] + def pretty_print(self): + table = Table(title="Mix Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Mix Tools Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "—") + table.add_row(str(i + 1), title, desc or "—") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = MixTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/others/payload_injection.py b/tools/others/payload_injection.py index 92ab146..b5c89b2 100644 --- a/tools/others/payload_injection.py +++ b/tools/others/payload_injection.py @@ -2,6 +2,16 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class DebInject(HackingTool): TITLE = "Debinject" @@ -23,9 +33,6 @@ class Pixload(HackingTool): PROJECT_URL = "https://github.com/chinarulezzz/pixload" def __init__(self): - # super(Pixload, self).__init__([ - # ('How To Use', self.show_project_page) - # ], runnable = False) super(Pixload, self).__init__(runnable = False) @@ -35,3 +42,62 @@ class PayloadInjectorTools(HackingToolsCollection): DebInject(), Pixload() ] + + def pretty_print(self): + table = Table(title="Payload Injector Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Payload Injector Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "—") + table.add_row(str(i + 1), title, desc or "—") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = PayloadInjectorTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/others/socialmedia.py b/tools/others/socialmedia.py index 3a1d0a2..542f73a 100644 --- a/tools/others/socialmedia.py +++ b/tools/others/socialmedia.py @@ -6,6 +6,16 @@ import subprocess from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class InstaBrute(HackingTool): TITLE = "Instagram Attack" @@ -49,7 +59,6 @@ class Faceshell(HackingTool): def run(self): name = input("Enter Username >> ") wordlist = input("Enter Wordlist >> ") - # Ignore a FileNotFoundError if we are already in the Brute_Force directory with contextlib.suppress(FileNotFoundError): os.chdir("Brute_Force") subprocess.run( @@ -75,3 +84,62 @@ class SocialMediaBruteforceTools(HackingToolsCollection): Faceshell(), AppCheck() ] + + def pretty_print(self): + table = Table(title="Social Media Bruteforce Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Social Media Bruteforce Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "—") + table.add_row(str(i + 1), title, desc or "—") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = SocialMediaBruteforceTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/others/socialmedia_finder.py b/tools/others/socialmedia_finder.py index 405f8ab..8172086 100644 --- a/tools/others/socialmedia_finder.py +++ b/tools/others/socialmedia_finder.py @@ -5,6 +5,16 @@ import subprocess from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class FacialFind(HackingTool): TITLE = "Find SocialMedia By Facial Recognation System" @@ -85,3 +95,62 @@ class SocialMediaFinderTools(HackingToolsCollection): Sherlock(), SocialScan() ] + + def pretty_print(self): + table = Table(title="Social Media Finder Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Social Media Finder Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "—") + table.add_row(str(i + 1), title, desc or "—") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = SocialMediaFinderTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/others/web_crawling.py b/tools/others/web_crawling.py index 8d7989c..7cb610f 100644 --- a/tools/others/web_crawling.py +++ b/tools/others/web_crawling.py @@ -2,6 +2,16 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class GoSpider(HackingTool): TITLE = "Gospider" @@ -16,3 +26,62 @@ class GoSpider(HackingTool): class WebCrawlingTools(HackingToolsCollection): TITLE = "Web crawling" TOOLS = [GoSpider()] + + def pretty_print(self): + table = Table(title="Web Crawling Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Web Crawling Tools Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "—") + table.add_row(str(i + 1), title, desc or "—") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = WebCrawlingTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/others/wifi_jamming.py b/tools/others/wifi_jamming.py index e2c5933..55b20b8 100644 --- a/tools/others/wifi_jamming.py +++ b/tools/others/wifi_jamming.py @@ -2,6 +2,16 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class WifiJammerNG(HackingTool): TITLE = "WifiJammer-NG" @@ -35,3 +45,62 @@ class WifiJammingTools(HackingToolsCollection): WifiJammerNG(), KawaiiDeauther() ] + + def pretty_print(self): + table = Table(title="Wifi Jamming Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Wifi Jamming Tools Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "—") + table.add_row(str(i + 1), title, desc or "—") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = WifiJammingTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file