2020-08-14 11:11:59 +00:00
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
import webbrowser
|
|
|
|
from platform import system
|
|
|
|
from traceback import print_exc
|
|
|
|
from typing import Callable
|
|
|
|
from typing import List
|
|
|
|
from typing import Tuple
|
|
|
|
|
|
|
|
|
|
|
|
def clear_screen():
|
2022-06-13 10:56:48 +00:00
|
|
|
os.system("cls" if system() == "Windows" else "clear")
|
2020-08-14 11:11:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
def validate_input(ip, val_range):
|
2022-06-13 10:56:48 +00:00
|
|
|
val_range = val_range or []
|
2020-08-14 11:11:59 +00:00
|
|
|
try:
|
|
|
|
ip = int(ip)
|
|
|
|
if ip in val_range:
|
|
|
|
return ip
|
2022-06-13 10:56:48 +00:00
|
|
|
except Exception:
|
2022-06-13 11:02:58 +00:00
|
|
|
return None
|
2022-06-13 10:56:48 +00:00
|
|
|
return None
|
2020-08-14 11:11:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
class HackingTool(object):
|
|
|
|
# About the HackingTool
|
|
|
|
TITLE: str = "" # used to show info in the menu
|
|
|
|
DESCRIPTION: str = ""
|
|
|
|
|
|
|
|
INSTALL_COMMANDS: List[str] = []
|
|
|
|
INSTALLATION_DIR: str = ""
|
|
|
|
|
|
|
|
UNINSTALL_COMMANDS: List[str] = []
|
|
|
|
|
|
|
|
RUN_COMMANDS: List[str] = []
|
|
|
|
|
|
|
|
OPTIONS: List[Tuple[str, Callable]] = []
|
|
|
|
|
|
|
|
PROJECT_URL: str = ""
|
|
|
|
|
|
|
|
def __init__(self, options = None, installable: bool = True,
|
|
|
|
runnable: bool = True):
|
2022-06-13 10:59:39 +00:00
|
|
|
options = options or []
|
2020-08-14 11:11:59 +00:00
|
|
|
if isinstance(options, list):
|
|
|
|
self.OPTIONS = []
|
|
|
|
if installable:
|
|
|
|
self.OPTIONS.append(('Install', self.install))
|
|
|
|
if runnable:
|
|
|
|
self.OPTIONS.append(('Run', self.run))
|
|
|
|
self.OPTIONS.extend(options)
|
|
|
|
else:
|
|
|
|
raise Exception(
|
|
|
|
"options must be a list of (option_name, option_fn) tuples")
|
|
|
|
|
|
|
|
def show_info(self):
|
|
|
|
desc = self.DESCRIPTION
|
|
|
|
if self.PROJECT_URL:
|
|
|
|
desc += '\n\t[*] '
|
|
|
|
desc += self.PROJECT_URL
|
|
|
|
os.system(f'echo "{desc}"|boxes -d boy | lolcat')
|
|
|
|
|
|
|
|
def show_options(self, parent = None):
|
|
|
|
clear_screen()
|
|
|
|
self.show_info()
|
|
|
|
for index, option in enumerate(self.OPTIONS):
|
2020-12-19 01:14:36 +00:00
|
|
|
print(f"[{index + 1}] {option[0]}")
|
2020-08-14 11:11:59 +00:00
|
|
|
if self.PROJECT_URL:
|
2020-12-23 16:56:28 +00:00
|
|
|
print(f"[{98}] Open project page")
|
2020-12-19 01:14:36 +00:00
|
|
|
print(f"[{99}] Back to {parent.TITLE if parent is not None else 'Exit'}")
|
2023-03-04 15:02:23 +00:00
|
|
|
option_index = input("Select an option : ").strip()
|
2020-08-14 11:11:59 +00:00
|
|
|
try:
|
|
|
|
option_index = int(option_index)
|
|
|
|
if option_index - 1 in range(len(self.OPTIONS)):
|
|
|
|
ret_code = self.OPTIONS[option_index - 1][1]()
|
|
|
|
if ret_code != 99:
|
2023-03-04 15:02:23 +00:00
|
|
|
input("\n\nPress ENTER to continue:").strip()
|
2020-08-14 11:11:59 +00:00
|
|
|
elif option_index == 98:
|
|
|
|
self.show_project_page()
|
|
|
|
elif option_index == 99:
|
|
|
|
if parent is None:
|
|
|
|
sys.exit()
|
|
|
|
return 99
|
|
|
|
except (TypeError, ValueError):
|
|
|
|
print("Please enter a valid option")
|
2023-03-04 15:02:23 +00:00
|
|
|
input("\n\nPress ENTER to continue:").strip()
|
2020-08-14 11:11:59 +00:00
|
|
|
except Exception:
|
|
|
|
print_exc()
|
2023-03-04 15:02:23 +00:00
|
|
|
input("\n\nPress ENTER to continue:").strip()
|
2020-08-14 11:11:59 +00:00
|
|
|
return self.show_options(parent = parent)
|
|
|
|
|
|
|
|
def before_install(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def install(self):
|
|
|
|
self.before_install()
|
|
|
|
if isinstance(self.INSTALL_COMMANDS, (list, tuple)):
|
|
|
|
for INSTALL_COMMAND in self.INSTALL_COMMANDS:
|
|
|
|
os.system(INSTALL_COMMAND)
|
|
|
|
self.after_install()
|
|
|
|
|
|
|
|
def after_install(self):
|
|
|
|
print("Successfully installed!")
|
|
|
|
|
|
|
|
def before_uninstall(self) -> bool:
|
|
|
|
""" Ask for confirmation from the user and return """
|
|
|
|
return True
|
|
|
|
|
|
|
|
def uninstall(self):
|
|
|
|
if self.before_uninstall():
|
|
|
|
if isinstance(self.UNINSTALL_COMMANDS, (list, tuple)):
|
|
|
|
for UNINSTALL_COMMAND in self.UNINSTALL_COMMANDS:
|
|
|
|
os.system(UNINSTALL_COMMAND)
|
|
|
|
self.after_uninstall()
|
|
|
|
|
|
|
|
def after_uninstall(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def before_run(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def run(self):
|
|
|
|
self.before_run()
|
|
|
|
if isinstance(self.RUN_COMMANDS, (list, tuple)):
|
|
|
|
for RUN_COMMAND in self.RUN_COMMANDS:
|
|
|
|
os.system(RUN_COMMAND)
|
|
|
|
self.after_run()
|
|
|
|
|
|
|
|
def after_run(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def is_installed(self, dir_to_check = None):
|
|
|
|
print("Unimplemented: DO NOT USE")
|
|
|
|
return "?"
|
|
|
|
|
|
|
|
def show_project_page(self):
|
|
|
|
webbrowser.open_new_tab(self.PROJECT_URL)
|
|
|
|
|
|
|
|
|
|
|
|
class HackingToolsCollection(object):
|
|
|
|
TITLE: str = "" # used to show info in the menu
|
|
|
|
DESCRIPTION: str = ""
|
|
|
|
TOOLS = [] # type: List[Any[HackingTool, HackingToolsCollection]]
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def show_info(self):
|
|
|
|
os.system("figlet -f standard -c {} | lolcat".format(self.TITLE))
|
|
|
|
# os.system(f'echo "{self.DESCRIPTION}"|boxes -d boy | lolcat')
|
|
|
|
# print(self.DESCRIPTION)
|
|
|
|
|
|
|
|
def show_options(self, parent = None):
|
|
|
|
clear_screen()
|
|
|
|
self.show_info()
|
|
|
|
for index, tool in enumerate(self.TOOLS):
|
2020-12-19 01:14:36 +00:00
|
|
|
print(f"[{index} {tool.TITLE}")
|
|
|
|
print(f"[{99}] Back to {parent.TITLE if parent is not None else 'Exit'}")
|
2023-03-04 15:02:23 +00:00
|
|
|
tool_index = input("Choose a tool to proceed: ").strip()
|
2020-08-14 11:11:59 +00:00
|
|
|
try:
|
|
|
|
tool_index = int(tool_index)
|
|
|
|
if tool_index in range(len(self.TOOLS)):
|
|
|
|
ret_code = self.TOOLS[tool_index].show_options(parent = self)
|
|
|
|
if ret_code != 99:
|
2023-03-04 15:02:23 +00:00
|
|
|
input("\n\nPress ENTER to continue:").strip()
|
2020-08-14 11:11:59 +00:00
|
|
|
elif tool_index == 99:
|
|
|
|
if parent is None:
|
|
|
|
sys.exit()
|
|
|
|
return 99
|
|
|
|
except (TypeError, ValueError):
|
|
|
|
print("Please enter a valid option")
|
2023-03-04 15:02:23 +00:00
|
|
|
input("\n\nPress ENTER to continue:").strip()
|
2022-06-13 10:56:48 +00:00
|
|
|
except Exception:
|
2020-08-14 11:11:59 +00:00
|
|
|
print_exc()
|
2023-03-04 15:02:23 +00:00
|
|
|
input("\n\nPress ENTER to continue:").strip()
|
2020-08-14 11:11:59 +00:00
|
|
|
return self.show_options(parent = parent)
|