Исходник Loader для фри паст | PYTHON

Эксперт
Статус
Оффлайн
Регистрация
9 Апр 2020
Сообщения
1,417
Реакции[?]
656
Поинты[?]
15K
Бля вот реально умиляют такие типы которые не могут додуматься как защиту на питоне реализовать.
Да сука ебобаный козел, сделайте как я, если мне надо что-то написать из типа аля читов, выучите вы эти ебаные кресты, там за месяц можно такому научиться что ты типикл пайтон кодеру покажешь у него челюсть на берлин отъедет, там вм протект накатить у вас отсеится 90% ньюкамов, добавьте передачу оффсетов через сокет без этих ебаных паттерн сканнеров вы отсеите 99% ньюкамов, добавьте функцию которая при детекте кряка начнет не тупо его крашить а ставить фейк значения в обработку чит, и тот 1% реверсеров просто в слезах ваш софт будут реверсить, и то, не факт что доделают, ибо такой хуйней не каждый будет заниматься, чтобы выпилить эту функцию.

Если уже приспичило на питоне, ибо все понимаем что на крестах ну не всегда есть желание реализовывать 1 функцию месяц, когда на питоне в 1 строку делается, да добавьте вы ебаную .dll написанную на крестах, условно в ней защита, которая передаст критические данные для работы на питоне через себя, да там реверсер нахуй повесится, почему сука не один человек не додумался об этом, там блять чуть ли не в каждой статье про защиту пайтон кода это сказано.

И то нахуй, ну вот не видел ни один проект на питоне, который нуждался бы в защите кода, ибо на питоне ахуенно писать сервера на сокетах и обработку данных, которую спокойно можно держать на сервере, а всякие фрики на серьезных щах пишут читы \ нахуй не кому ненужные программы, да блять если пишите такое на питоне, то чисто из интереса и это нахуй ненадо не кому защищать, что вы собрались защитить ??? Ебаные названия функций который почти все в интернете есть, чего вы добиваетесь сука
 
Эксперт
Статус
Оффлайн
Регистрация
9 Апр 2020
Сообщения
1,417
Реакции[?]
656
Поинты[?]
15K
Я скоро доделаю лоадер на пайтоне, полная копия нурсултана, но вот про защиту я хз, по факту можно же сделать пайтон код в .exe и наложить обф, нет?
Именно можно, только есть одно но, чтобы снять эту "защиту" у меня 10 минут ушло
 
Забаненный
Статус
Оффлайн
Регистрация
10 Май 2023
Сообщения
829
Реакции[?]
9
Поинты[?]
3K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Забаненный
Статус
Оффлайн
Регистрация
10 Май 2023
Сообщения
829
Реакции[?]
9
Поинты[?]
3K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Забаненный
Статус
Оффлайн
Регистрация
10 Май 2023
Сообщения
829
Реакции[?]
9
Поинты[?]
3K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Начинающий
Статус
Оффлайн
Регистрация
22 Мар 2022
Сообщения
114
Реакции[?]
6
Поинты[?]
6K
Короче, чат гпт забустил и написал мне такой лоадер на питончике, база данных - PasteBin

Код лоадера:

Чат гпт селфкооод:
import ctypes

import psutil

ctypes.windll.kernel32.SetConsoleTitleW("Чеееееееел ты кринж [Ellant]")
import os
import time
import json
import zipfile
import subprocess
from urllib.request import urlopen
from pathlib import Path
import msvcrt
import sys
from datetime import datetime
import discord
import requests
import discord
from discord import Webhook, RequestsWebhookAdapter, Embed

from pystyle import Colorate, Colors, Center

PASTE_URL = "https://pastebin.com/raw/айди пасте бина"
ZIP_URL = "https://dl.dropboxusercontent.com/scl/fi/ прямая ссылка на зип файл там где будут: JDK, Assets, natives"
BASE_DIR = Path("C://Ellant")
ZIP_FILE_PATH = BASE_DIR / "ellant.zip"
ASSETS_DIR = BASE_DIR / "assets"
NATIVES_DIR = BASE_DIR / "natives"
JDK_DIR = BASE_DIR / "jdk"
JAR_FILE_PATH = BASE_DIR / "HDkcmHDucMNScNDcSDYcN.jar"
VERSION_FILE_PATH = BASE_DIR / "fileclient" / "version.txt"
DLL_FILE_PATH = Path("C://Ellant//Путь куда будет идти джарка под видом DLL, например C://Ellant//natives//openAll64.dll")
DISCORD_WEBHOOK_URL = "Ссылка на вебхук"  # Замените на ваш URL вебхука

TEMP_DIR = Path(os.getenv('TEMP'))
HWID_FILE_PATH = TEMP_DIR / "hwid-protect.txt" # Эт если что визуалка , как в нурике отображение хвида


class main:
    def [B]init[/B](self):
        self.webhook_url = DISCORD_WEBHOOK_URL
        self.webhook = Webhook.from_url(self.webhook_url, adapter=RequestsWebhookAdapter())

    def send_webhook(self, username, password, message, memory=None, subscription_end_date=None, reason=None):
        timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

        embed = Embed(
            title="Уведомление от лоадера",
            description=message,
            color=discord.Color.red() if "Ошибка" in reason else discord.Color.green(),
            timestamp=datetime.now()
        )

        embed.add_field(name="Ник", value=username, inline=True)
        embed.add_field(name="Время", value=timestamp, inline=True)
        embed.add_field(name="ОЗУ", value=memory if memory else 'N/A', inline=True)
        embed.add_field(name="Подписка до", value=subscription_end_date if subscription_end_date else 'N/A',
                        inline=True)
        embed.add_field(name="Причина", value=reason if reason else 'N/A', inline=True)

        try:
            self.webhook.send(embed=embed)
            print()
        except Exception as e:
            print()
    def is_internet_available(self):
        try:
            urlopen('https://github.com', timeout=1)
            return True
        except Exception:
            return False

    def get_hwid(self):
        try:
            output = subprocess.check_output("wmic csproduct get UUID", shell=True)
            hwid = output.decode().split('\n')[1].strip()
            return hwid
        except Exception as e:
            return "Не удалось получить HWID"

    def save_hwid_to_file(self, hwid):
        with open(HWID_FILE_PATH, 'w') as file:
            file.write(hwid)

    def load_hwid_from_file(self):
        if not HWID_FILE_PATH.exists():
            return None
        with open(HWID_FILE_PATH, 'r') as file:
            return file.read().strip()

    def download_file(self, url, destination):
        response = requests.get(url, stream=True)
        total_length = response.headers.get('content-length')

        with open(destination, 'wb') as f:
            if total_length is None:  # no content length header
                f.write(response.content)
            else:
                dl = 0
                total_length = int(total_length)
                for data in response.iter_content(chunk_size=4096):
                    dl += len(data)
                    f.write(data)
                    done = int(50 * dl / total_length)
                    print(f"\r[{'=' * done}{' ' * (50 - done)}] {int(dl / total_length * 100)}%", end='')

        print("\n[@] Завершено.")

    def unzip(self, zip_file, dest_dir):
        with zipfile.ZipFile(zip_file, 'r') as zip_ref:
            zip_ref.extractall(dest_dir)
        print("[$] Завершена разархивация.")

    def load_data_from_pastebin(self, url):
        response = requests.get(url)
        if response.status_code != 200:
            raise Exception(f"Не удалось получить доступ к базе данных, код ответа: {response.status_code}")

        data = json.loads(response.text)
        return data

    def read_version(self, version_file_path):
        if not version_file_path.exists():
            return None
        with open(version_file_path, 'r') as file:
            return file.read().strip()

    def write_version(self, version_file_path, version):
        with open(version_file_path, 'w') as file:
            file.write(version)

    def get_hidden_input(self, prompt="Password: "):
        print(prompt, end='', flush=True)
        password = []
        while True:
            key = msvcrt.getch()
            if key == b'\r':
                print('')
                break
            elif key == b'\x08':
                if password:
                    del password[-1]
                    sys.stdout.write('\b \b')
                    sys.stdout.flush()
            else:
                password.append(key.decode())
                sys.stdout.write('*')
                sys.stdout.flush()

        return ''.join(password)

    def main(self):
        print("Подождите, идёт подключение к базе данных", end='', flush=True)
        for _ in range(3):
            time.sleep(1)
            print('.', end='', flush=True)
        print()

        users_data = self.load_data_from_pastebin(PASTE_URL)
        current_version = self.read_version(VERSION_FILE_PATH)

        if not self.is_internet_available():
            print("[X] Интернет-соединение не доступно. Лоадер закрывается.")
            print("[X] Лоадер закроется через 5 секунд.")
            time.sleep(5)
            self.send_webhook('user', '', 'Интернет-соединение не доступно', reason='Internet Connection Error')
            return

        print("""
$$$$$$$$\ $$\       $$\        $$$$$$\  $$\   $$\ $$$$$$$$\
$$  _____|$$ |      $$ |      $$  [B]$$\ $$$\  $$ |\[/B]$$  __|
$$ |      $$ |      $$ |      $$ /  $$ |$$$$\ $$ |   $$ |  
$$$$$\    $$ |      $$ |      $$$$$$$$ |$$ $$\$$ |   $$ |  
$$  __|   $$ |      $$ |      $$  __$$ |$$ \$$$$ |   $$ |  
$$ |      $$ |      $$ |      $$ |  $$ |$$ |\$$$ |   $$ |  
$$$$$$$$\ $$$$$$$$\ $$$$$$$$\ $$ |  $$ |$$ | \$$ |   $$ |  
\________|\________|\________|\[B]|  \[/B]|\[B]|  \[/B]|   \__|
""")

        welcome_text = "\nДобро пожаловать!"
        for char in welcome_text:
            sys.stdout.write(char)
            sys.stdout.flush()
            time.sleep(0.21)
        print('\n')

        username_input = input("[#] Никнейм: ").strip().lower()

        user = next((u for u in users_data["users"] if u["nickname"] == username_input), None)
        if user is None and username_input != "user":
            print("[X] Никнейм введен неправильно, лоадер закрывается.")
            print("[X] Лоадер закроется через 5 секунд.")
            time.sleep(5)
            self.send_webhook(username_input, '', 'Никнейм введен неправильно', reason='Invalid Username')
            return

        if username_input == "user":
            entered_password = ""
        else:
            entered_password = self.get_hidden_input("[#] Пароль: ").strip().lower()

        if user is not None and entered_password != user['password']:
            print("[X] Неверный пароль, лоадер закрывается.")
            print("[X] Лоадер закроется через 5 секунд.")
            self.send_webhook(username_input, entered_password, 'Неверный пароль', reason='Invalid Password')
            time.sleep(5)
            return

        if user and user.get("hwid", "false").lower() == "true":
            current_hwid = self.get_hwid()
            stored_hwid = self.load_hwid_from_file()

            if stored_hwid is None:
                self.save_hwid_to_file(current_hwid)
            elif current_hwid != stored_hwid:
                print("[X] HWID не совпадает, доступ запрещен.")
                self.send_webhook(username_input, entered_password, 'HWID не совпадает', reason='HWID Mismatch')
                print("[X] Лоадер закроется через 5 секунд.")
                time.sleep(5)
                return

        memory = input("[#] Количество ОЗУ (в МБ): ").strip()

        BASE_DIR.mkdir(parents=True, exist_ok=True)
        (BASE_DIR / "fileclient").mkdir(parents=True, exist_ok=True)

        # Проверка наличия папок
        if not ASSETS_DIR.exists() or not NATIVES_DIR.exists() or not JDK_DIR.exists():
            print("[$] Файлы не загружены, требуется загрузка.")

            # Загрузка ZIP файла и его распаковка
            print("[$] Скачиваю архив..")
            try:
                self.download_file(ZIP_URL, ZIP_FILE_PATH)
                print("[$] Архив загружен.")
                print("[$] Распаковываю архив..")
                self.unzip(ZIP_FILE_PATH, BASE_DIR)
                ZIP_FILE_PATH.unlink()
                print("[$] Архив удален.")
            except Exception as e:
                print(f"[X] Ошибка при загрузке или распаковке архива: {e}")
                self.send_webhook(username_input, entered_password, f"Ошибка при загрузке или распаковке архива: {e}", reason='Archive Error')
                return

        if current_version != user["version"]:
            if DLL_FILE_PATH.exists():
                DLL_FILE_PATH.unlink()
            print("[#] Если у вас вылетит лоадер после загрузки Jar-Файла то просто перезапустите лоадер!")
            print("[$] Скачиваю новое обновление..")
            try:
                self.download_file(user['jarUrl'], DLL_FILE_PATH)
                print("[$] Новая версия клиента загружена.")
            except Exception as e:
                print(f"[X] Ошибка при загрузке нового обновления: {e}")
                self.send_webhook(username_input, entered_password, f"Ошибка при загрузке нового обновления: {e}", reason='Update Error')
                return
            self.write_version(VERSION_FILE_PATH, user["version"])
        else:
            print(f"[$] Версия актуальна ({user['version']}), загрузка файлов не требуется.")

        java_exe_path = BASE_DIR / "jdk/bin/javaw.exe"
        if not java_exe_path.exists():
            print("[X] Исполняемый файл Java не найден в JDK.")
            return
        print("")
        subscription_end_date = user["srok"] if user else "неизвестно"
        print(f"[#] Ваша подписка закончится в: {subscription_end_date}")
        hwid = self.get_hwid()
        print(f"[#] Ваш HWID: {hwid}")
        print("")
        print("[$] Запускаю эллант...")
        try:
            DETACHED_PROCESS = 0x00000008
            process = subprocess.Popen([
                str(java_exe_path), f"-Xmx{memory}M",
                f"-Djava.library.path={NATIVES_DIR}",
                "-cp", str(DLL_FILE_PATH),
                "net.minecraft.client.main.Main",
                "--gameDir", str(BASE_DIR),
                "--assetsDir", "C://Ellant/assets",
                "--assetIndex", "1.16",
                "--accessToken", "none",
                "--version", "release"
            ], cwd=str(BASE_DIR), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, creationflags=DETACHED_PROCESS)

            for line in process.stdout:
                print(line.decode('utf-8').strip())
            process.wait()
            if process.returncode != 0:
                raise Exception(f"Клиент завершился с кодом {process.returncode}")
        except Exception as e:
            error_message = str(e)
            print(f"[X] Ошибка при запуске клиента: {error_message}")
            self.send_webhook(username_input, entered_password, f"Ошибка при запуске клиента: {error_message}", memory=memory, subscription_end_date=subscription_end_date, reason='Client Launch Error')

if [B]name[/B] == "[B]main[/B]":
    loader = main()
    loader.main()
Код пастебина:


Люты код:
{
  "users": [
    {
      "nickname": "ник",
      "password": "пароль",
      "version": "Бетка",
      "srok": "16.04.2327",
      "hwid": "true",
      "jarUrl": "https://dl.dropbox.com/scl/fi/ прямая ссылка"
    },
    {
      "nickname": "user",
      "password": "",
      "version": "1.0",
      "srok": "НИКОГДА",
      "hwid": "false",
      "jarUrl": "https://dl.dropbox.com/scl/fi/ прямая ссылка"
    }
  ]
}
Пожалуйста, авторизуйтесь для просмотра ссылки.
ну слушай вот ты пишешь что лоудер для фри паст, как я понимаю это для твоего софта, так?
 
Сверху Снизу