PYTHON 7,264 characters • 205 lines
import sys
import os
import time
import subprocess
import concurrent.futures
import requests
import math
import threading
from requests.packages.urllib3.exceptions import InsecureRequestWarning

# --- CONFIG OPTIMASI SERVER 2012 (16GB RAM, 8 CPU) ---
DEFAULT_THREADS = 300      # Dikurangi biar ga overload
TOTAL_WINDOWS = 5          # 5 PART untuk 1GB domain
CHUNK_SIZE_MB = 500        # 200MB per part (total 1GB)

# Disable SSL & Error Warnings
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

if os.name == "nt":
    os.system("cls")
    if len(sys.argv) > 1 and sys.argv[1] == "--worker":
        os.system(f"title WP+JOOMLA WORKER PART {sys.argv[4]}/5 - {sys.argv[5]}")
    else:
        os.system("title MASTER LAUNCHER (5 PART MODE)")
else:
    os.system("clear")

class bcolors:
    OKGREEN = '\033[92m'
    OKCYAN = '\033[96m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    MAGENTA = '\033[95m'  # Joomla
    ENDC = '\033[0m'

# ==========================================
# JOOMLA DETECTION FUNCTION
# ==========================================
JOOMLA_KEYWORDS = [
    'content="joomla', 'joomla! administration', 'option=com_login',
    '/administrator/templates/', 'name="task" value="login"', 
    'id="form-login"', 'joomla-version', 'mod-login-username'
]
ADMIN_PATHS = ['/administrator/', '/administrator/index.php']

def check_joomla(url, joomla_file):
    """Fast Joomla Detection"""
    try:
        url = url.strip()
        if not url: return
        
        target = url if url.startswith("http") else "http://" + url
        clean_domain = target.replace('http://', '').replace('https://', '').split('/')[0]
        
        # Test Admin Paths
        for path in ADMIN_PATHS:
            test_url = f"http://{clean_domain}{path}"
            try:
                with requests.Session() as s:
                    s.verify = False
                    resp = s.get(test_url, timeout=(3, 7), allow_redirects=True)
                    
                    if resp.status_code == 200:
                        content = resp.text[:15000].lower()
                        for keyword in JOOMLA_KEYWORDS:
                            if keyword in content:
                                print(f"{bcolors.MAGENTA}[JOOMLA HIT] {test_url}{bcolors.ENDC}")
                                with open(joomla_file, "a", encoding='utf-8') as f:
                                    f.write(test_url + "\n")
                                return
            except:
                continue
    except:
        pass

# ==========================================
# WORKER LOGIC (WP + JOOMLA)
# ==========================================
def worker_mode():
    try:
        filename = sys.argv[2]
        total_parts = int(sys.argv[3])
        current_part = int(sys.argv[4])
        threads = int(sys.argv[5])
    except:
        print("Usage error!")
        sys.exit()

    wp_file = f"wordpress_part{current_part}.txt"
    joomla_file = f"joomla_part{current_part}.txt"
    
    print(bcolors.OKCYAN + f"""
 [⚡] HYBRID SCANNER PART {current_part}/{total_parts}
 [⚡] Target: {filename}
 [⚡] Threads: {threads}
 [⚡] WP Results: {wp_file}
 [⚡] Joomla Results: {joomla_file}
    """ + bcolors.ENDC)

    # Smart Byte Splitting (1GB = 5x200MB)
    file_size = os.path.getsize(filename)
    chunk_size = file_size // total_parts
    start_byte = (current_part - 1) * chunk_size
    end_byte = start_byte + chunk_size
    if current_part == total_parts: 
        end_byte = file_size

    def check_wordpress(url):
        try:
            url = url.strip()
            if not url: return
            
            target = url if url.startswith("http") else "http://" + url
            with requests.Session() as s:
                s.verify = False
                resp = s.get(target + "/license.txt", timeout=(3, 7), allow_redirects=True)
                
                if 'WordPress' in resp.text:
                    print(f"{bcolors.OKGREEN}[WP HIT] {target}{bcolors.ENDC}")
                    with open(wp_file, "a", encoding='utf-8') as f:
                        f.write(target + "\n")
        except:
            pass

    def process_line(line):
        """Process single line: Check WP first, then Joomla"""
        url = line.strip()
        if not url: return
        
        check_wordpress(url)
        check_joomla(url, joomla_file)

    # Memory Efficient Processing
    pool = concurrent.futures.ThreadPoolExecutor(max_workers=threads)
    futures = []
    processed = 0

    with open(filename, 'r', encoding='utf-8', errors='ignore') as f:
        f.seek(start_byte)
        if current_part > 1: 
            f.readline()  # Skip partial line

        while f.tell() < end_byte:
            line = f.readline()
            if not line: 
                break
                
            futures.append(pool.submit(process_line, line))
            processed += 1
            
            # Batch processing (anti-memory leak)
            if len(futures) >= threads * 2:
                concurrent.futures.wait(futures[:threads], timeout=10)
                futures = futures[threads:]

    # Cleanup
    concurrent.futures.wait(futures)
    
    print(bcolors.OKGREEN + f"\n[✓] PART {current_part} FINISHED | Processed: {processed:,}" + bcolors.ENDC)
    print(f"[✓] WP Results: {wp_file}")
    print(f"[✓] Joomla Results: {joomla_file}")
    input("Press Enter to exit...")

# ==========================================
# MASTER LAUNCHER (5 PART AUTOMATIC)
# ==========================================
def master_mode():
    print(bcolors.WARNING + f"""
  ==================================================
   HYBRID WP+JOOMLA SCANNER (5 PART - SERVER 2012)
   5 CMD Windows x {DEFAULT_THREADS} Threads each
   Total: 1000 Threads | Separate WP/Joomla Results
  ==================================================
    """ + bcolors.ENDC)

    filename = input("Enter domain list filename: ").strip()
    if not os.path.exists(filename):
        print(bcolors.FAIL + "File not found!" + bcolors.ENDC)
        sys.exit()

    file_size_mb = os.path.getsize(filename) / (1024*1024)
    print(f"\n[+] File: {filename} ({file_size_mb:.1f} MB)")
    print(f"[+] Launching {TOTAL_WINDOWS} CMD windows...")
    time.sleep(2)

    # Launch 5 Workers
    script_path = os.path.abspath(sys.argv[0])
    for i in range(1, TOTAL_WINDOWS + 1):
        cmd = f'start "Hybrid-Part{i}" /min cmd /k python "{script_path}" --worker "{filename}" {TOTAL_WINDOWS} {i} {DEFAULT_THREADS}'
        os.system(cmd)
        print(f"[+] Launched Part {i}/5")
        time.sleep(1)

    print(bcolors.OKGREEN + "\n[✓] All 5 windows launched! Check taskbar." + bcolors.ENDC)
    print("Results will be saved as:")
    print("- wordpress_part1.txt ... wordpress_part5.txt")
    print("- joomla_part1.txt ... joomla_part5.txt")
    input("Master will stay open. Press Enter to close...")

if __name__ == "__main__":
    if len(sys.argv) > 1 and sys.argv[1] == "--worker":
        worker_mode()
    else:
        master_mode()