126 lines
4.4 KiB
Python
126 lines
4.4 KiB
Python
# path: modules/quick_start.py
|
|
import subprocess
|
|
import sys
|
|
import os
|
|
import platform
|
|
import time
|
|
from shutil import get_terminal_size
|
|
|
|
MENU_NAME = "Quick Start"
|
|
|
|
GOV_SPYWARE_PACKAGES = {
|
|
"com.nsogroup.pega": "Pegasus - NSO Group",
|
|
"com.nsogroup.pegasus": "Pegasus - NSO Group",
|
|
"com.finfisher.mobile": "FinFisher / FinSpy",
|
|
"com.italtel.hermit": "Hermit - RCS Lab",
|
|
"com.cy4root.predator": "Predator - Cytrox",
|
|
"com.hackingteam.htagent": "Hacking Team RCS"
|
|
}
|
|
|
|
def get_adb_path():
|
|
os_map = {"Windows": "windows", "Linux": "linux", "Darwin": "mac"}
|
|
system = platform.system()
|
|
subdir = os_map.get(system)
|
|
if not subdir:
|
|
return None
|
|
root_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
|
|
adb_filename = "adb.exe" if system == "Windows" else "adb"
|
|
adb_path = os.path.join(root_dir, "tools", subdir, adb_filename)
|
|
return adb_path if os.path.exists(adb_path) else None
|
|
|
|
def start_log():
|
|
timestamp = time.strftime("%Y%m%d-%H%M%S")
|
|
log_path = f"spyhunter_log_{timestamp}.txt"
|
|
return open(log_path, "w")
|
|
|
|
def get_phone_info(adb_path):
|
|
info = {}
|
|
fields = ["ro.product.manufacturer", "ro.product.model", "ro.build.version.release",
|
|
"ro.serialno", "ro.build.version.sdk", "ro.build.display.id"]
|
|
for field in fields:
|
|
result = subprocess.run([adb_path, "shell", "getprop", field], capture_output=True, text=True)
|
|
info[field] = result.stdout.strip()
|
|
return info
|
|
|
|
def get_installed_packages(adb_path):
|
|
result = subprocess.run([adb_path, "shell", "pm", "list", "packages"], capture_output=True, text=True)
|
|
return [line.replace("package:", "").strip() for line in result.stdout.splitlines()]
|
|
|
|
def progress_bar(seconds=10):
|
|
width = get_terminal_size((80, 20)).columns - 20
|
|
for i in range(seconds + 1):
|
|
bar = "#" * int((i / seconds) * width)
|
|
sys.stdout.write(f"\rStarting scan in [{i:2}/{seconds}] seconds: [{bar:<{width}}]")
|
|
sys.stdout.flush()
|
|
time.sleep(1)
|
|
print("\n")
|
|
|
|
def scan(adb_path, log):
|
|
print("\n[SCAN RESULTS]")
|
|
log.write("[SCAN RESULTS]\n")
|
|
packages = get_installed_packages(adb_path)
|
|
found = []
|
|
|
|
for pkg, description in GOV_SPYWARE_PACKAGES.items():
|
|
if pkg in packages:
|
|
print(f"[❌] {description} ({pkg})")
|
|
log.write(f"[DETECTED] {description} ({pkg})\n")
|
|
found.append((pkg, description))
|
|
else:
|
|
print(f"[✅] {description} ({pkg})")
|
|
log.write(f"[OK] {description} ({pkg})\n")
|
|
|
|
if found:
|
|
print("\n[ALERT] Spyware detected!")
|
|
for pkg, desc in found:
|
|
print(f"\nPackage: {pkg}\nDescription: {desc}\nRemoval: Use 'adb uninstall {pkg}' or perform a factory reset if pre-installed.\n")
|
|
log.write(f"\nALERT: {pkg} - {desc}\n")
|
|
else:
|
|
print("\n[INFO] No government spyware detected.")
|
|
log.write("\n[INFO] No spyware found.\n")
|
|
|
|
def main():
|
|
adb_path = get_adb_path()
|
|
if not adb_path:
|
|
print("[ERROR] ADB not found. Make sure it is in tools/{windows,linux,mac}/")
|
|
return
|
|
|
|
log = start_log()
|
|
log.write("SpyHunter Quick Start Log\n")
|
|
|
|
print("\n[Quick Start] Android Government Spyware Scanner\n")
|
|
print("Make sure USB Debugging is enabled on your Android device.")
|
|
print("1. Go to 'Settings' > 'About Phone' > tap 'Build Number' 7 times to enable Developer Options.")
|
|
print("2. Return to 'Settings' > 'Developer Options'.")
|
|
print("3. Enable 'USB Debugging'.\n")
|
|
|
|
choice = input("Press Enter when ready, or type 'esc' to return to the main menu: ").strip().lower()
|
|
if choice == 'esc':
|
|
log.close()
|
|
return
|
|
|
|
print("\n[INFO] Gathering device information...\n")
|
|
phone_info = get_phone_info(adb_path)
|
|
print("[DEVICE INFORMATION]\n")
|
|
|
|
readable = {
|
|
"ro.product.manufacturer": "Manufacturer",
|
|
"ro.product.model": "Model",
|
|
"ro.build.version.release": "Android Version",
|
|
"ro.serialno": "Serial Number",
|
|
"ro.build.version.sdk": "SDK Level",
|
|
"ro.build.display.id": "Build ID"
|
|
}
|
|
|
|
for prop, label in readable.items():
|
|
value = phone_info.get(prop, "Unknown")
|
|
print(f"{label:<15}: {value}")
|
|
log.write(f"{label}: {value}\n")
|
|
|
|
print("\n[INFO] Initializing scan...")
|
|
progress_bar(10)
|
|
|
|
scan(adb_path, log)
|
|
log.close()
|
|
input("\nPress Enter to return to main menu...")
|