İlk önce Visual Basic 6'ya giriş yapalım ve standart exe oluşturarak formumuza gelelim. Oyun hilelerinde mantık ramde depolanan verileri değiştirmek olduğu için ilk önce rami okuyup düzenleyebileceğimiz API kodlarını yeni bir modül oluşturarak sayfanın en üstüne eklememiz gerekir:
Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
Dim hwnd As Long
Dim ProcessID As Long
Dim ProcessHandle As Long
Private Declare Function GetWindowThreadProcessId Lib "User32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal Classname As String, ByVal WindowName As String) As Long
Private Declare Function ReadProcessMem Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByRef lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
API ve değişken bağlantılarını hallettiğimize göre artık ram üzerinde ki bilgileri değiştirmek için fonksiyonlarımızı oluşturabiliriz. Fonksiyonlarımızı oluştururken bize lazım olacak temel ihtiyaçlar, sırasıyla şu şekilde:
- Oyuna bağlantı kurabilmemiz için oyunun windows title'ı (pencere başlığı).
- Oyunun açık olup olmadığının kontrolü.
- Hedef pointerı (hedef veriyi) ram üzerinden değiştirebilmemiz için fonksiyon.
- Tüm bileşenleri tek çatı altında çalıştırabilmemiz için fonksiyon.
Gerekenleri öğrendiğimize göre artık sıra sıra kodlarımı oluşturabiliriz.
1- Oyunun Pencere Başlığı
Public Function GameName()
GameName = "Mad Games Tycoon"
End Function
Bu kısımda Mad Games Tycoon üzerine yaptığım için oyunun pencere adını girdiğim, siz entegre edeceğiniz oyunun pencere başlığını girmelisiniz. Pencere başlığını görev yöneticisinden veya oyunu açtığınızda oyun ikonunun üstüne gelerek görebilirsiniz.
2- Oyunun Açık Olup Olmadığını Kontrol Etme
Public Function GameOnline()
hwnd = FindWindow(vbNullString, WindowName)
GetWindowThreadProcessId hwnd, ProcessID
ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, False, ProcessID)
End Function
Bağlantı yapmak istediğimiz oyun açık değilse boşa paket yollamamak için bu kontrolü yapıyoruz.
3- Bulunan Veriyi Ram Üzerinden Değiştirmek
Public Function ReadOffset()
WriteProcessMemory ProcessHandle, Offset, Value, 4, 0&
CloseHandle ProcessHandle
End Function
Proje oyuna bağlandıysa düzenlenmesi gereken offseti güncelliyoruz.
4- Oluşturulan Fonksiyonları Birleştirmek
Public Function WriteLong(Offset As Long, WindowName As String, Value As Long) As Boolean
If hwnd = 0 Then
MsgBox "Maalesef Oyun açık değil.", vbCritical, "PvPLine - Kahretsin!"
Exit Function
End If
If ProcessHandle = 0 Then
Exit Function
End If
ReadOffset
End Function
Modül dosyamızı oluşturduğumuza göre bu kısımla işimiz bitti, artık oyun üzerinde düzenleme yapabilmek için (örneğin para hilesi yapmak istiyoruz) oyuna bağlanmalı ve gerekli pointerı / offseti bulmamız gerekiyor. Bu işlem için Cheat Engine veya Art Money gibi ücretsiz programları kullanabilirsiniz ben size Cheat Engine üzerinden örnek vereceğim.
Oyuna giriş yaptıktan sonra hilesini oluşturmak istediğiniz alanı belirlemeniz gerekir. Ben Mad Games Tycoon'da para hilesi yaparak bu örneği göstereceğim. Hemen yukarıda okla gösterdiğim alanda oyuna ilk giriş yaptığımız da bize verilen para 550,000 $. Artık pointer avına çıkalım cheat engine veya Art Money programınızı başlatın.
Sol üst tarafta bulunan pc ikonuna (process open) tıklayarak hilesini yapmak istediğiniz oyunun exesini seçin ve Open butonuna tıklayın. Şimdi asıl kritik adım burası. Oyuna bağlantıktan sonra oyunun bana başlangıç parası olarak verdiği 550,000 verisini decimal değer olarak "550000" şeklinde Value (değer) bölümüne giriyorum ve "First Scan" butonuna tıklıyorum.
Hemen yukarıda da görsel olarak anlatmış bulunmaktayım, bir çok oyunda tek seferde pointera ulaşamayabilirsiniz. Bu oyunda şansımız yaver gittiği için tek seferde Mad Game Tycoon oyunun para pointer değerinin "23A0BCA0" olduğunu görmüş olduk. Bu değeri farklı bir yere kaydediyoruz.
Eğer Değeri İlk Denemede Bulamadıysam?
Bir çok oyunda bu durumla karşılaşacaksınız, problem değil çözüm oldukça basit. Örneğin oyundaki para değeriniz "428,215" siz bunu decimal değerde "428215" şeklinde arattınız ve zibilyon tane sonuç çıktı burada eleme yapmamız gerekiyor. Bunun içinse oyundaki para değerinizi azaltıp veya arttırmanız gerekli. Örneğin oyunda bir nesne satın aldınız ve paranız "427,982" değerine düştü, tekrar bu değeri decimal olarak value alanına "427982" şeklinde yazarak bu sefer Next Scan butonuna tıklıyorsunuz. Tek bir tane sonuç kalana kadar bu işlemi tekrarlıyoruz.
Gerekli pointerımızı elde ettiğimize göre artık formda veriyi düzenleyebiliriz. Bunun çalışma formuna 1 buton ve 1 text eklemeniz yeterli olacaktır. Butona çift tıklayarak kod bölümüne giriyoruz ve fonksiyonlarımızı çağırıyoruz.
WriteLong &H23A0BCA0, GameName, Text1.Text
Görmüş olduğunuz gibi az önce bulduğumuz pointerın başına &H koyarak güncelleme işlemini atamış olduk. Programı çalıştırıp text'e değerimizi girerek (oyunun maksimum izin verdiği değeri girmeniz gerekli 9999999999999 gibi çok uçuk değerler girerseniz oyunun kapanma ihtimali var) butona tıkladığımızda oyundaki para değerimiz güncellenmiş oluyor.
Tek tek kodları inceleyerek mantığı anlamanız daha faydalı olacaktır ama ben yinede örnek projeyi veriyorum Mad Game Tycoon'ın 1.171020A sürümü için oluşturulan para hilesidir. Herhangi anlamadığınız bir nokta olursa lütfen belirtin.
Trainer Proje Linki:
http://www.mediafire.com/file/iexoaemxlo6jbvc/trainer.rar