Pythonla çok samimi olmasakta bazen işimi çok kolaylaştırdığını(150 yi aşkın sayfayı belli bir veri için kontrol etmek gibi) inkar edemem. Basit bir kod belki ama kullanışlı olduğu kesin.
Ne zamandır basit manada nasıl bir game trainer yazilabileceği hakkında küçükte olsa bir yazı yazmak istiyordum. Basit manada dedim çünkü şimdilerde her oyun bir hile engelleme (örn. PunkBuster) yazılımıyla çalışmayı şart tutuyor.Biz burada böyle bir durumun olmadığını varsayacağız. Kimbilir belki bu tür yazılımların çalışma mantığını araştırdıktan sonra onlar içinde bir çalışma yapabilirim.
Trainerların temel olarak yaptıkları şey önceden belirlenmiş bellek adreslerindekidegerleri değiştirmektir.Bu adreslerde çoğunlukla para,zaman,taş,ekmek miktarı gibi değerler bulunur.Peki bu bellek adreslerini nerden öğreneceğiz?İşte burası yazımızın birinci bölümünü oluşturacak.İkinci bölümde ise bu adreslerin içeriğini dll injection yöntemiyle nasıl değiştireceğimizi göreceğiz.
BÖLÜM 1:
Herşeyden önce eğer çalıştırdığımız process ile başka bir processüzerinde at koşturmak istiyorsak SE_DEBUG_NAME ruhsatını(privilege) almamız gerekiyor.Tabii bu ruhsatı alabilmek için de Administrator haklarına sahip olmamız gerekiyor(eğer işletim sisteminin yerel güvenlik ilkelerini değiştimediysek, default da sadece Administrator grubu bu hakka sahip).
Yukarıdaki fonksiyon öncelikle “OpenProcessToken” ile üzerinde bulunduğumuz processin “TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY” ruhsatlarına sahip olduğunu gösterir bir token açıyor. “AdjustTokenPrivileges” fonksiyonu ile de bu token ı kullanarak istediğimiz ruhsatı alabiliyoruz.Peki “LookupPrivilegeValue” ne iş görür derseniz ,o da bize ruhsatımızın id sini döndürüyor. Dip not olarak: eğer sistem üzerinde sürekli çalışan bir program yazıyorsak ruhsatları işimiz bittikten sonra eski haline getirmek olası bir güvenlik açığı oluşmasını önler ama bizim programımızın böyle bir durumu olmadığından o bölümü atlıyoruz.
Artık ruhsatımızı da aldığımıza göre artık oyuna ait processi gönlümüzce kullanabiliriz. Aşağıda da görüleceği üzere “OpenProcess” i kullanabilmek için ilgili processin id sine ihtiyacımız olacak. Bu değeri görev yöneticisinden kolayca öğrenebileceğimiz gibi programatik olarak “GetWindowThreadProcessId” ve “FindWindow” fonksiyonlarıylada öğrenmek mümkün.
Aşağıdaki memory işlemlerinin üzerinde pek durmak istemiyorum.Buradaki önemli soru bir processin belli bir adresindeki memory bölgesinin özelliklerine nasıl ulaştığımızdır ki,cevabı “VirtualQueryEx” fonksiyonudur.Bu fonksiyon bize “MEMORY_BASIC_INFORMATION” yapısını döndürür.Bu yapı sayesinde o bellek bölgesinin başlangıç adresini,büyüklüğünü, ayrılma şeklini(reserve,commit,free),korunma şeklini öğrenebiliriz.
“GetSystemInfo” fonksiyonu adındanda anlaşılacağı üzere sistem bilgilerini veriyor bize.Biz bu fonksiyonu processe ait sanal belleğin max boyutunu öğrenmek için kullanıyoruz.
Bu noktada ilgili processin tüm bellek bölgelerinin niteliklerini biliyoruz.Şimdi bu özellikler yardımıyla işimize yarayan bölgeleri seçip bunları okuyoruz.
Artık bellek bölgesini okuduğumuza göre aramak istediğimiz değeri ,tipinide belirterek bu bölge içerisinde aratıyoruz.Nede olsa tip olmadan bellek, 0-1 lerden oluşan sayı dizisidir.Buradaki “SEARCH_TYPE” ve “SEARCH_VALUE” bizim belirlediğimiz macrodan başka bir şey değildir.
Tabii eğer oyundaki para miktarınız 5 ise bu değerin sadece bir adreste olmayacağını fark etmişsinizdir herhalde. Bunun için bulduğunuz adresleri bir yerde saklayıp ,para miktarınız değiştiğinde yeni miktar için bu adresler içinde arama yapabilirsiniz.
* Kendi çapında bilişim ile uğraşan mezuniyet eşiğinde bir şahıs…
* İlerde de bu meşguliyetin artarak ,işin erbaplığı seviyesine gelinmesi yönünde bir istek…
* Ve bu bileşimin sonuçları…
justwalkingwondering(at)gmail.com