94 lines
3.0 KiB
Python
94 lines
3.0 KiB
Python
# path: spyhunter.py
|
|
import os
|
|
import importlib
|
|
import sys
|
|
import traceback
|
|
|
|
STATIC_MENU = {
|
|
"1": "Quick Start",
|
|
"2": "ADB/Device Settings",
|
|
"3": "Detection Setup",
|
|
"4": "Scan"
|
|
}
|
|
|
|
MODULE_MAPPING = {
|
|
"1": "modules.quick_start",
|
|
"2": "modules.adb_settings",
|
|
"3": "modules.detection_setup",
|
|
"4": "modules.scan"
|
|
}
|
|
|
|
BANNER = r"""
|
|
_________ ___ ___ __
|
|
/ _____/_____ ___.__./ | \ __ __ _____/ |_ ___________
|
|
\_____ \\____ < | / ~ \ | \/ \ __\/ __ \_ __ \
|
|
/ \ |_> >___ \ Y / | / | \ | \ ___/| | \/
|
|
/_______ / __// ____|\___|_ /|____/|___| /__| \___ >__|
|
|
|__|
|
|
Version 0.0.1 by SsSnake — Grand Butcher of The DCR
|
|
"""
|
|
|
|
def print_banner():
|
|
os.system('cls' if os.name == 'nt' else 'clear')
|
|
print(BANNER)
|
|
|
|
def load_custom_modules():
|
|
menu = {}
|
|
custom_path = os.path.join(os.path.dirname(__file__), "modules")
|
|
if not os.path.exists(custom_path):
|
|
os.makedirs(custom_path)
|
|
for fname in os.listdir(custom_path):
|
|
if fname.endswith(".py") and fname not in ["__init__.py"]:
|
|
try:
|
|
modname = f"modules.{fname[:-3]}"
|
|
mod = importlib.import_module(modname)
|
|
if hasattr(mod, "MENU_NAME") and hasattr(mod, "main"):
|
|
key = str(len(STATIC_MENU) + len(menu) + 1)
|
|
menu[key] = (mod.MENU_NAME, modname)
|
|
except Exception:
|
|
print(f"[WARN] Failed to load module {fname}: {traceback.format_exc(limit=1)}")
|
|
return menu
|
|
|
|
def show_menu(static_menu, custom_menu):
|
|
for key, name in static_menu.items():
|
|
print(f" {key}) {name}")
|
|
for key, (name, _) in custom_menu.items():
|
|
print(f" {key}) {name}")
|
|
print("\n[INFO] Press 'q' at any time to quit.\n")
|
|
|
|
def main():
|
|
while True:
|
|
try:
|
|
print_banner()
|
|
custom_menu = load_custom_modules()
|
|
show_menu(STATIC_MENU, custom_menu)
|
|
choice = input("Enter your selection: ").strip().lower()
|
|
|
|
if choice == 'q':
|
|
print("[INFO] Exiting SpyHunter...")
|
|
sys.exit(0)
|
|
|
|
if choice in STATIC_MENU:
|
|
module_path = MODULE_MAPPING[choice]
|
|
elif choice in custom_menu:
|
|
module_path = custom_menu[choice][1]
|
|
else:
|
|
print("[ERROR] Invalid choice. Try again.")
|
|
input("Press Enter to continue...")
|
|
continue
|
|
|
|
# Load and run the module
|
|
module = importlib.import_module(module_path)
|
|
module.main()
|
|
|
|
except KeyboardInterrupt:
|
|
print("\n[INFO] User aborted with Ctrl+C.")
|
|
sys.exit(0)
|
|
except Exception as e:
|
|
print(f"[FATAL] An error occurred: {e}")
|
|
traceback.print_exc()
|
|
input("Press Enter to return to main menu...")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|