Merhaba TürkHackTeam üyeleri,
Önceki konuda temel hatlarıyla nasıl hile uygulaması geliştirebileceğimizi öğrenmiştik. Bugün ise, bu projeyi detaylı olarak adım adım inceleyeceğiz. Kodun her bir bölümünü yukarıdan aşağıya, önemli yerleri vurgulayarak anlatacağım. Amacımız; Python kullanarak oyun süreçlerine müdahale edebileceğimiz, bellek okuma/yazma işlemlerini gerçekleştiren ve modern bir GUI ile kullanıcının etkileşimine sunan bir araç geliştirmek. Tekrar hatırlatıyorum: Bu örnek sadece eğitim amaçlıdır.
1. Gerekli Kütüphanelerin Dahil Edilmesi
Python:
import pymem
import pymem.process
import customtkinter as ctk
from tkinter import messagebox
- pymem & pymem.process: Oyun süreçlerinin belleğine erişim sağlamak ve bu bellek üzerinde değişiklikler yapabilmek için kullanılır.
- customtkinter (ctk): Standart Tkinter yerine daha modern ve şık arayüzler oluşturabilmenize olanak tanır.
- tkinter.messagebox: Kullanıcıya hata veya bilgi mesajları gösterebilmek için kullanılır.
2. Global Değişkenler
Python:
pm = None # pymem nesnesi, oyun süreciyle etkileşim için kullanılacak
base_address = None # Oyun sürecinin temel adresi
- pm: Hedef oyun sürecine bağlanmak ve bellek işlemleri gerçekleştirmek için oluşturduğumuz pymem nesnesini tutar.
- base_address: Bellek işlemleri sırasında referans alınacak olan, oyunun temel adresidir.
3. Oyun Sürecini Bulma (get_process_id Fonksiyonu)
Python:
def get_process_id(process_name):
"""Belirtilen oyun sürecinin ID'sini alır."""
try:
pm = pymem.Pymem(process_name)
return pm.process_id
except pymem.exception.ProcessNotFound:
messagebox.showerror("Hata", f"{process_name} süreci bulunamadı!")
return None
except Exception as e:
messagebox.showerror("Hata", f"Hata oluştu: {e}")
return None
- Bu fonksiyon, hedef oyunun sürecine bağlanmaya çalışır.
- Eğer süreç bulunamazsa ya da başka bir hata meydana gelirse, kullanıcıya uygun hata mesajları gösterilir.
4. Pointer Zincirini Okuma (read_pointer_chain Fonksiyonu)
Python:
def read_pointer_chain(pm, base_address, offsets):
"""Pointer zincirini okur ve nihai adresi bulur."""
address = base_address
for offset in offsets:
address = pm.read_ulonglong(address) + offset
return address
- Pointer Zinciri: Bellekte veriler genellikle tek bir adreste saklanmaz; birbirine bağlı adres zincirleri şeklinde yer alır.
- Bu fonksiyon, base_address'ten başlayıp, her offseti sırasıyla ekleyerek nihai hedef adrese ulaşmamızı sağlar.
5. Hile Uygulama (apply_cheat Fonksiyonu)
Python:
def apply_cheat(pm, base_address, base_offset, offsets, value, cheat_name):
"""Offsetleri kullanarak hileyi uygular."""
try:
final_address = read_pointer_chain(pm, base_address + base_offset, offsets)
pm.write_float(final_address, value)
messagebox.showinfo("Başarılı", f"{cheat_name} başarıyla uygulandı: {value}")
except Exception as e:
messagebox.showerror("Hata", f"{cheat_name} uygulanırken hata: {e}")
- base_offset: İlgili hileye ait başlangıç adresine eklenen sabit bir değer.
- offsets: Base adresine eklenen ara offsetler dizisidir.
- value: Kullanıcının girdiği ve belleğe yazılacak olan yeni değerdir.
- cheat_name: Uygulanan hileye ait açıklayıcı isim; kullanıcıya hangi hilenin uygulandığını bildirmek için kullanılır.
- Fonksiyon, pointer zincirini takip edip nihai adresi bulduktan sonra, pm.write_float komutuyla bu adrese yeni değeri yazar. İşlem başarılı veya başarısız olursa, kullanıcıya bilgi verilir.
6. Ana Menü ve Hilelerin Uygulanması (initialize_menu Fonksiyonu)
Python:
def initialize_menu():
"""Ana menüyü başlatan fonksiyon. Oyun sürecini bulur ve hileleri uygular."""
global pm, base_address
process_name = "ProSoccerOnline-Win64-Shipping.exe"
try:
pm = pymem.Pymem(process_name)
base_address = pm.base_address
except pymem.exception.ProcessNotFound:
messagebox.showerror("Hata", "Oyun süreci bulunamadı!")
return
except Exception as e:
messagebox.showerror("Hata", f"Hata oluştu: {e}")
return
cheats = [
(float(speed_entry.get()), 0x12345678, [0x10, 0x20, 0x30], "Speed Hack"),
(float(fov_entry.get()), 0x87654321, [0x40, 0x50, 0x60], "FOV Hack"),
(float(stamina_entry.get()), 0x13572468, [0x70, 0x80, 0x90], "Stamina Hack"),
(float(magic_hands_entry.get()), 0x24681357, [0xA0, 0xB0, 0xC0], "Magic Hands Hack"),
(float(dribbling_entry.get()), 0x09876543, [0xD0, 0xE0, 0xF0], "Dribbling Factor Hack"),
(float(drone_entry.get()), 0xABCDEF12, [0x11, 0x22, 0x33], "Drone Camera Hack"),
]
# Her bir hileyi sırasıyla uyguluyoruz
for value, base_offset, offsets, cheat_name in cheats:
apply_cheat(pm, base_address, base_offset, offsets, value, cheat_name)
- Bu fonksiyon, önce hedef oyunun sürecine bağlanmaya çalışır.
- Eğer süreç başarıyla bulunursa, base_address alınır ve kullanıcı arayüzünde girilen değerlerle bir cheats listesi oluşturulur.
- Listedeki her bir tuple; uygulanan hileye ait değeri, base offset'i, offset listesini ve hile adını içerir.
- Son olarak, her hile için apply_cheat fonksiyonu çağrılarak işlemler gerçekleştirilir.
Ana Pencerenin Oluşturulması
root: Uygulamanın ana penceresini temsil eder. Pencerenin başlığı, boyutu ve arka plan rengi ayarlanır; ayrıca pencerenin boyutu sabitlenir.
Giriş Alanları ve Etiketler
Python:
root = ctk.CTk() # Uygulama penceresini oluşturuyoruz
root.title("Twiez Cheat Sample") # Pencere başlığı
root.geometry("400x350") # Pencere boyutunu ayarlıyoruz
root.configure(bg="black") # Arka plan rengini siyah yapıyoruz
root.resizable(False, False) # Pencerenin boyutunun değiştirilmesine izin vermiyoruz
root: Uygulamanın ana penceresini temsil eder. Pencerenin başlığı, boyutu ve arka plan rengi ayarlanır; ayrıca pencerenin boyutu sabitlenir.
Giriş Alanları ve Etiketler
- Her bir hile için kullanıcıdan değer almak amacıyla etiketler ve giriş kutuları oluşturuluyor. Örnek olarak, hız için:
Python:
speed_label = ctk.CTkLabel(root, text="Speed Value:", font=("Arial", 14))
speed_label.grid(row=0, column=0, padx=10, pady=10)
speed_entry = ctk.CTkEntry(root, width=200)
speed_entry.grid(row=0, column=1, padx=10, pady=10)
- Diğer hileler için de (FOV, Stamina, Magic Hands, Dribbling Factor, Drone Camera) benzer giriş alanları ve etiketler oluşturulmuştur.
Uygulama Butonu
Python:
apply_button = ctk.CTkButton(root, text="İşlemi Uygula", font=("Arial", 16), command=initialize_menu)
apply_button.grid(row=6, column=0, columnspan=2, pady=20)
- Bu buton, kullanıcı tarafından girilen değerlerle hilelerin uygulanmasını başlatır. Tıklandığında initialize_menu fonksiyonu çalışır.
Tkinter Döngüsünün Başlatılması
Python:
root.mainloop()
- Bu komut, GUI’nin sürekli çalışmasını sağlayan ana döngüyü başlatır; böylece kullanıcı arayüzü aktif kalır ve kullanıcı etkileşimde bulunabilir.
Tüm Kod
Python:
# github.com/twiez
import pymem
import pymem.process
import customtkinter as ctk
from tkinter import messagebox
# Twiez Cheat Sample - (Offsetler Gerçek Değildir!)
# Bu kod sadece öğretici amaçlarla paylaşılmaktadır.
# Global değişkenler
pm = None # pymem nesnesi, işlemle etkileşim için kullanılacak
base_address = None # Oyun sürecinin temel adresi
def get_process_id(process_name):
"""Belirtilen oyun sürecinin ID'sini alır."""
try:
# Oyun sürecine bağlanıyoruz
pm = pymem.Pymem(process_name)
return pm.process_id # Sürecin ID'sini döndürüyoruz
except pymem.exception.ProcessNotFound:
messagebox.showerror("Hata", f"{process_name} süreci bulunamadı!")
return None # Hata durumunda None döndür
except Exception as e:
messagebox.showerror("Hata", f"Hata oluştu: {e}")
return None # Genel hata durumunda None döndür
def read_pointer_chain(pm, base_address, offsets):
"""Pointer zincirini okur ve nihai adresi bulur."""
address = base_address # Başlangıç adresini alıyoruz
for offset in offsets:
address = pm.read_ulonglong(address) + offset # Her offset için adresi güncelliyoruz
return address # Nihai adresi döndürüyoruz
def apply_cheat(pm, base_address, base_offset, offsets, value, cheat_name):
"""Offsetleri kullanarak hileyi uygular."""
try:
# Pointer zincirini okuyarak nihai adresi buluyoruz
final_address = read_pointer_chain(pm, base_address + base_offset, offsets)
# İstenilen değeri bu adrese yazıyoruz
pm.write_float(final_address, value)
messagebox.showinfo("Başarılı", f"{cheat_name} başarıyla uygulandı: {value}")
except Exception as e:
messagebox.showerror("Hata", f"{cheat_name} uygulanırken hata: {e}")
def initialize_menu():
"""Ana menüyü başlatan fonksiyon. Oyun sürecini bulur ve hileleri uygular."""
global pm, base_address
process_name = "ProSoccerOnline-Win64-Shipping.exe" # Hedef oyunun exe dosyası adı
try:
# Oyun sürecine bağlanıyoruz
pm = pymem.Pymem(process_name)
base_address = pm.base_address # Temel adresi alıyoruz
except pymem.exception.ProcessNotFound:
messagebox.showerror("Hata", "Oyun süreci bulunamadı!")
return
except Exception as e:
messagebox.showerror("Hata", f"Hata oluştu: {e}")
return
# Kullanıcı tarafından girilen değerleri alıyoruz ve hileleri uygulatıyoruz
cheats = [
(float(speed_entry.get()), 0x12345678, [0x10, 0x20, 0x30], "Speed Hack"), # Hız hilesi
(float(fov_entry.get()), 0x87654321, [0x40, 0x50, 0x60], "FOV Hack"), # Görüş açısı hilesi
(float(stamina_entry.get()), 0x13572468, [0x70, 0x80, 0x90], "Stamina Hack"), # Dayanıklılık hilesi
(float(magic_hands_entry.get()), 0x24681357, [0xA0, 0xB0, 0xC0], "Magic Hands Hack"), # Sihirli Eller hilesi
(float(dribbling_entry.get()), 0x09876543, [0xD0, 0xE0, 0xF0], "Dribbling Factor Hack"), # Dribbling faktörü hilesi
(float(drone_entry.get()), 0xABCDEF12, [0x11, 0x22, 0x33], "Drone Camera Hack"), # Drone kamera hilesi
]
# Her bir hileyi uygula
for value, base_offset, offsets, cheat_name in cheats:
apply_cheat(pm, base_address, base_offset, offsets, value, cheat_name)
# Dark Tema (Mavi-Koyu Tema)
ctk.set_appearance_mode("dark")
ctk.set_default_color_theme("dark-blue")
root = ctk.CTk() # Uygulama penceresini oluşturuyoruz
root.title("Twiez Cheat Sample") # Pencere başlığı
root.geometry("400x350") # Pencere boyutunu ayarlıyoruz
root.configure(bg="black") # Arka plan rengini siyah yapıyoruz
root.resizable(False, False) # Pencerenin boyutunun değiştirilmesine izin vermiyoruz
# Etiketler ve giriş alanları
speed_label = ctk.CTkLabel(root, text="Speed Value:", font=("Arial", 14))
speed_label.grid(row=0, column=0, padx=10, pady=10)
speed_entry = ctk.CTkEntry(root, width=200)
speed_entry.grid(row=0, column=1, padx=10, pady=10)
fov_label = ctk.CTkLabel(root, text="FOV Value:", font=("Arial", 14))
fov_label.grid(row=1, column=0, padx=10, pady=10)
fov_entry = ctk.CTkEntry(root, width=200)
fov_entry.grid(row=1, column=1, padx=10, pady=10)
stamina_label = ctk.CTkLabel(root, text="Stamina Value:", font=("Arial", 14))
stamina_label.grid(row=2, column=0, padx=10, pady=10)
stamina_entry = ctk.CTkEntry(root, width=200)
stamina_entry.grid(row=2, column=1, padx=10, pady=10)
magic_hands_label = ctk.CTkLabel(root, text="Magic Hands Value:", font=("Arial", 14))
magic_hands_label.grid(row=3, column=0, padx=10, pady=10)
magic_hands_entry = ctk.CTkEntry(root, width=200)
magic_hands_entry.grid(row=3, column=1, padx=10, pady=10)
dribbling_label = ctk.CTkLabel(root, text="Dribbling Factor Value:", font=("Arial", 14))
dribbling_label.grid(row=4, column=0, padx=10, pady=10)
dribbling_entry = ctk.CTkEntry(root, width=200)
dribbling_entry.grid(row=4, column=1, padx=10, pady=10)
drone_label = ctk.CTkLabel(root, text="Drone Camera Value:", font=("Arial", 14))
drone_label.grid(row=5, column=0, padx=10, pady=10)
drone_entry = ctk.CTkEntry(root, width=200)
drone_entry.grid(row=5, column=1, padx=10, pady=10)
# Buton
apply_button = ctk.CTkButton(root, text="İşlemi Uygula", font=("Arial", 16), command=initialize_menu)
apply_button.grid(row=6, column=0, columnspan=2, pady=20)
# Tkinter penceresini çalıştırıyoruz
root.mainloop()
Bu örnek, pymem kütüphanesi ile oyun belleğine müdahale edip, kullanıcının girdiği değerlerle hile uygulaması gerçekleştiren bir araç geliştirme sürecini göstermektedir. Uygulama, hedef oyunun sürecine bağlanır, pointer zincirini takip eder ve belirlenen bellek adreslerine yeni değerler yazar. Tüm bu işlemler modern bir GUI (customtkinter) ile kullanıcıya sunulmaktadır.
Ek olarak belirtmek isterim ki; Pro Soccer Online adlı oyunda geliştirdiğim hileyi test ettikten sonra, oyunun yapımcılarına Discord sunucuları ve resmi e-posta adresleri üzerinden destek talebi (ticket) oluşturdum. Emeğim için konuyu beğenebilirsiniz teşekkürler.




