first commit
This commit is contained in:
93
spyhunter.py
Normal file
93
spyhunter.py
Normal file
@@ -0,0 +1,93 @@
|
||||
# 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()
|
||||
Reference in New Issue
Block a user