مضى على الشبكة و يوم من العطاء.
  • السلام عليكم ورحمة الله وبركاته، نرجوا كتابة طلبك او سؤالك باللغة العربية مع ارفاق صورة عن الخطأ او توضيح كافي للمشكلة.

[ غير مُجاب ] مساعدة في كسر برنامج

huntersliver

./عضو جديد

السمعة:

السلام عليكم ورحمة الله وبركاته

احتاج مساعده في كسر برنامج.
البرنامج مبني على بايثون و تم استخدام pyinstaller فيه و بناءه ك ملف واحد هو مكون من عدة ملفات بايثون ولكن في النهاية بعد التجميع exe واحد و شامل
طيب وين المشكله؟
1- لما احاول ابحث عن نصوص الموجوده في الواجهه ما تظهر لي ابد
2-بحثت بشكل يدوي ولكن ما وصلت لاي نتيجه

ولكن كل الي عرفته انه عمليه التحقق تكون ان البرنامج يرسل المعلومات الي دخلها المستخدم - والي هي فقط سيريال- الى api معين ويتم التحقق اذا كان السيريال موجود ام لا

هل فيه طريقه لكسره؟
ام مستحيل؟ ام مثلا فيه برامج مخصصه لهذه الامر لاني فقط جربت ida pro مع xd64 و باينري نينجا (:

-للعلم وصلت للسورس كامل؛ لذلك عندي المعلومات كلها لكن مارح يفيد لانه الهدف منه يفك تشفير ملف و ف اي وقت ممكن تغيير key في النسخ الجايه و مايكون عندي السورس الي يحتوي على key المستخدم-

البرنامج مع السورس كامل والخ : اضغط هنا للتنزيل
للعلم اني قاعد استهدف GameInstaller.exe لان عن طريقه يتم فك تشفير PlayInArabic.exe.enc الى PlayInArabic.exe

و حاب اضيف كذا كم معلومه على السريع
الهدف هو كسر .enc المشفر عن طريق AES لتحويله الى exe و الي قوم بهذه العمليه البرنامج الي قاعد استهدفه.

بعض المعلومات من السورس الي عندي :
تم استخدام خوارزمية AES مع وضع CBC (Cipher Block Chaining) لتشفير البيانات.
المفتاح المستخدم في التشفير يتم اشتقاقه من كلمة المرور عبر استخدام PBKDF2 مع salt ثابت.

تم استخدام PBKDF2 لاشتقاق المفتاح باستخدام كلمة المرور و salt ثابت. تم تحديد salt ثابت بالبايتات:

FIXED_SALT = b'\x2d\xb4\x6a\xe8\x9f\x13\xc5\x71\xf8\x2a\x4d\x17\x86\x5e\xb3\x99'
    • لملف المشفر يحتوي على IV (مصفوفة التهيئة) التي يتم قراءتها من أول 16 بايت من الملف.
    • يتم استخدام AES.MODE_CBC لفك التشفير، وهو يختلف عن أوضاع التشفير الأخرى حيث يعتمد على IV لتوفير أمان إضافي ضد تكرار النصوص.
  • التعامل مع التوسعة (Padding):
    • بعد فك التشفير، يتم إزالة التوسعة (Padding) باستخدام unpad من مكتبة Crypto.Util.Padding لضمان أن البيانات المستخلصة تطابق الحجم الفعلي للبيانات الأصلية.
  • تحقق من الملف بعد فك التشفير:
    • بعد فك التشفير، يتم التحقق مما إذا كان الملف المسترجع يبدو كـ ملف تنفيذي Windows عبر قراءة أول بايتين (والتي تمثل عادةً العلامة "MZ" في الملفات التنفيذية).

ان شاء الله تكون هذه معلومات جيده للمساعدة
 
التعديل الأخير:
  • Like
التفاعلات: BAYAN
اما مايخص تصميم الواجهه مصمم بمكتبة tkinter

Python:
import tkinter as tk
from tkinter import filedialog, scrolledtext
from PIL import Image, ImageTk
import ttkbootstrap as ttk
from ttkbootstrap.constants import *
from decryption import decrypt_file
import subprocess
import requests
import os
from utils import run_and_delete_exe, get_cpu_id, prevent_copy
import sys
from encryption import encrypt_file

password = "PlayInArabic"  # Fixed password for demonstration purposes
support_email = '[email protected]'
# Create main window with modern theme
root = ttk.Window(
    themename="superhero",  # Try other themes: "cosmo", "minty", "darkly"
    title="Modern App",
    size=(800, 600),
    resizable=(True, True)
)


# Function to get the correct path to the resource (image)
# Add this near the top of your script
def resource_path(relative_path):
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

# Then use it for the icon
icon_path = resource_path("resources\encryption.ico")
try:
    root.iconbitmap(icon_path)
except Exception as e:
    print(f"Error loading icon: {e}")

encrypted_path = ""
BASE_URL = 'backendapienctool-production.up.railway.app/'
game_path = ""
game_engine_path = ""
GAME_NAME = "EnderMagnolia"



# Create a modern frame with padding
main_frame = ttk.Frame(root, padding=20)
main_frame.pack(fill=BOTH, expand=YES)

# Header with logo and title
header_frame = ttk.Frame(main_frame)
header_frame.pack(fill=X, pady=(0, 20))



title_label = ttk.Label(
    header_frame,
    text="فك تشفير المثبت",
    font=("Helvetica", 20, "bold"),
    bootstyle=(PRIMARY, INVERSE)
)
title_label.pack(side=LEFT, expand=YES)

# Input Section
input_frame = ttk.Labelframe(
    main_frame,
    text="Serial Number",
    padding=15,
    bootstyle=INFO
)
input_frame.pack(fill=X, pady=10)

serial_entry = ttk.Entry(
    input_frame,
    font=("Helvetica", 12),
    bootstyle=PRIMARY
)
serial_entry.pack(fill=X, pady=5)

# Button Section
button_frame = ttk.Frame(main_frame)
button_frame.pack(fill=X, pady=20)

btn1 = ttk.Button(
    button_frame,
    text="حدد المثبت المشفر",
    command=lambda: button1_action(),
    bootstyle=(OUTLINE, INFO),
    width=20
)
btn1.pack(side=LEFT, padx=5, pady=5, fill=X, expand=YES)

btn4 = ttk.Button(
    button_frame,
    text="حدد مسار اللعبة",
    command=lambda: button4_action(),
    bootstyle=(OUTLINE, WARNING),
    width=20
)
btn4.pack(side=LEFT, padx=5, pady=5, fill=X, expand=YES)

btn2 = ttk.Button(
    button_frame,
    text="تثبيت",
    command=lambda: button2_action(),
    bootstyle=SUCCESS,
    width=20
)
btn2.pack(side=LEFT, padx=5, pady=5, fill=X, expand=YES)

btn3 = ttk.Button(
    button_frame,
    text="التعليمات",
    command=lambda: button3_action(),
    bootstyle=(OUTLINE, SECONDARY),
    width=20
)
btn3.pack(side=LEFT, padx=5, pady=5, fill=X, expand=YES)

# Status Section
status_frame = ttk.Labelframe(
    main_frame,
    text="Status",
    padding=15,
    bootstyle=SECONDARY
)
status_frame.pack(fill=BOTH, expand=YES)

message_label = ttk.Label(
    status_frame,
    text="Ready...",
    font=("Helvetica", 11),
    wraplength=700,
    anchor="center",
    justify=CENTER,
    bootstyle=(INVERSE, SECONDARY)
)
message_label.pack(fill=BOTH, expand=YES)

# Button Actions
def button1_action():
    global encrypted_path
    file_path = filedialog.askopenfilename(
        title="Select an .exe File",
        filetypes=[("Executable Files", "*.enc"), ("All Files", "*.*")]
    )
    if file_path:
        encrypted_path = file_path
        show_message(f"Selected encrypted file: {os.path.basename(file_path)}")

def button4_action():
    global game_path, game_engine_path
    file_path = filedialog.askopenfilename(
        title="Select a Game File",
        filetypes=[("Executable Files", "*.exe"), ("All Files", "*.*")]
    )
    if file_path:
        game_engine_path = file_path
        game_path = os.path.dirname(file_path)
        show_message(f"Selected game: {os.path.basename(file_path)}")

def button2_action():
    user_text = serial_entry.get().strip()
    if not user_text:
        show_message("Please enter a serial number", is_error=True)
        return
    if not game_path:
        show_message("Please select a game file first", is_error=True)
        return
    
    if not encrypted_path:
        show_message("Please select an encrypted file first", is_error=True)
        return
    
    url = f"https://{BASE_URL}/serial/check"
    headers = {"Content-Type": "application/json"}
    data = {"serial_number": user_text}
    
    try:
        show_message("Verifying serial number...")
        response = requests.post(url, headers=headers, json=data)
        if response.status_code == 200:
            if response.json()['exists']:
                serial_game_name = response.json()['game_name']
                if serial_game_name != GAME_NAME:
                    show_message(f"Serial number is not valid for {GAME_NAME}", is_error=True)
                    return
                show_message("Serial number verified, processing...")
                cpu_id = get_cpu_id()
                response2 = requests.post(
                    f"https://{BASE_URL}/submit",
                    headers=headers,
                    json={"serial_number": user_text, "hardware_id": cpu_id, "game_name": GAME_NAME}
                )
                
                if response2.status_code == 200:
                    show_message("Verification successful, decrypting file...")
                    try:
                        success = decrypt_file(encrypted_path, True, password)
                        if success:
                            decrypted_path = encrypted_path[:-4] if encrypted_path.lower().endswith('.enc') else encrypted_path + '.decrypted'
                            try:
                                with open(decrypted_path, 'rb') as f:
                                    if f.read(2) == b'MZ':
                                        try:
                                            subprocess.run(['attrib', '+h', decrypted_path], check=True, shell=True)
                                            show_message("File decrypted successfully and hidden! Installing...")
                                        except Exception as e:
                                            show_message(f"Error setting file attributes: {str(e)}", is_error=True)
                                    else:
                                        show_message("Decrypted file is not a valid executable", is_error=True)
                            except Exception as e:
                                show_message(f"Error verifying decrypted file: {str(e)}", is_error=True)
                            
                            run_and_delete_exe(decrypted_path)
                            
                            try:
                                for root_dir, dirs, files in os.walk(game_path):
                                    for file in files:
                                        if file == f"{GAME_NAME}_playinarabic_p.pak":
                                            target_file = os.path.join(root_dir, file)
                                            subprocess.check_call(['attrib', '+h', target_file])
                                            encrypt_file(target_file, password)
                                            os.remove(target_file)
                                show_message("Installation completed successfully!")
                            except Exception as e:
                                show_message(f"Error during installation: {e}", is_error=True)
                        else:
                            show_message("Decryption failed", is_error=True)
                    except Exception as e:
                        show_message(f"Decryption error: {str(e)}", is_error=True)
                else:
                    show_message(f"Server error: {response2.status_code}", is_error=True)
                    print(f"Error: {response2.content}")
            else:
                show_message("Invalid serial number", is_error=True)
        else:
            show_message(f"Server error: {response.status_code}", is_error=True)
    except requests.exceptions.RequestException as e:
        show_message(f"Connection failed: {str(e)}", is_error=True)

def button3_action():
    popup = ttk.Toplevel(root)
    popup.title("تعليمات")
    popup.geometry("500x300")

    # Configure grid layout for proper resizing
    popup.rowconfigure(0, weight=1)
    popup.rowconfigure(1, weight=0)
    popup.columnconfigure(0, weight=1)

    text_area = scrolledtext.ScrolledText(
        popup,
        wrap=tk.WORD,
        width=60,
        height=15,
        font=("Helvetica", 11),
        padx=10,
        pady=10
    )
    text_area.grid(row=0, column=0, padx=10, pady=10, sticky="nsew")

    instructions = f"""
    السلام عليكم

    : خطوات عمل التطبيق

    تحديد مسار المثبت المشفر *
    ادخال serial number المرفق عند الشراء *
    الضغط علي زر فك المثبت *
    
    : للدعم الفني، يرجى الاتصال بنا على
    {support_email}
    """
    text_area.insert(tk.END, instructions)
    text_area.tag_configure("right", justify="right")
    text_area.tag_add("right", "1.0", "end")
    text_area.configure(state='disabled')

    close_button = ttk.Button(
        popup,
        text="اغلاق",
        bootstyle=DANGER,
        command=popup.destroy,
    )
    close_button.grid(row=1, column=0, pady=10)

# Function to update message label
def show_message(message, is_error=False):
    if is_error:
        message_label.config(text=message, bootstyle=DANGER)
    else:
        message_label.config(text=message, bootstyle=SUCCESS)
    root.update_idletasks()

root.mainloop()
 
عرضلك السيريال نمبر مثلا 1IUE9YM0HX

على العموم البرنامج يجلب ملفات اخرى ربما خاصه بالالعاب ..



بالتوفيق لك
 
تبيه قم بحذف Hardware ID من مشاركتك لا يجب ان يطلع عليه احد

الموقع هذا https://railway.com/ يستخدم خدمات api
backendapienctool-production.up.railway.app
 
عرضلك السيريال نمبر مثلا 1IUE9YM0HX

على العموم البرنامج يجلب ملفات اخرى ربما خاصه بالالعاب ..



بالتوفيق لك
ايه هو لتعريب الالعاب من قبل فرق يتم طرحه بشكل مجاني ثم حصره من قبل البعض و البدأ في بيعه
 
تستطيع التلاعب فيه وستخدامه لكن يحتاج كمبيوتر للتعبث في الاكواد وتغيير مسارات ووضعه مجانا ..

حاول بالعبث فيه بالتوفيق لك
 
تستطيع التلاعب فيه وستخدامه لكن يحتاج كمبيوتر للتعبث في الاكواد وتغيير مسارات ووضعه مجانا ..

حاول بالعبث فيه بالتوفيق لك
بضبط هذه الي صاير حالين و ماقصرت والله لولا لله ثم انت ما وصلت لهذه المعلومات
 

آخر المشاركات

فانوس

رمضان
عودة
أعلى