Merhaba arkadaşlar,
öncelikle şunu bilmenizi isterimki bu konuyu
Başlarken
İçten hack yapmak için bizim dll oluşturmamız lazım, bu dll bizim hilemiz olacak, oyuna enjekte edilecek ve
böylelikle bizim kodumuz oyunun bir parçası olacak. Bu harika bir şey çünkü biz adreslere direk erişebileceğiz
ve ReadProcessMemory yada WriteProcessMemory gibi fonksiyonlara ihtiyacımız kalmayacak.Şimdi dll giriş noktasını
oluşturmamız lazım
Enjekte edildikten sonra, DllMain'deki parametreler doldurulur ve başarıyla enjekte edilirse dwReason, DLL_PROCESS_ATTACH değerini döndürür.
Kodumuzun tümü şimdilik mainHack () içinde olacak ve DllMain'e () hiçbir şey eklenmeyecek. Yeni bir iş parçacığı oluşturmak ve kodunuzu yeni iş parçacığında çalıştırmak istiyoruz. Kodunuzu DllMain'in içine koymayın çünkü burada yeni bir iş parçacığı oluşturulur. Şimdi hackMain () içine yararlı olabilecek bazı çok temel şeyler ekleyeceğiz.
bu üç satırlık kod hangi programa eklediyseniz ona dahil edilir, ayrıca bu konsol değişken değerlerini görebilmek için çok kullanışlı olur.
Pointerlar
Geçenki dersimizde bahsetmiştim:
bir pointer oluşturmak için
int *a;
gibi bir tanım yapmamız lazımdı. Bu neyi tutuyodu "herhangi bir adresi"
eğer biz bunu
"std::cout<<*a"
konsolda yazdırmak istersek "*a" yaptığımız için, "a" zaten herhangi bir adresi tutuyordu, başına tekrar "*"koyduğumuz için ise bu "a" nın içindeki değeri verir.
örenek olarak aşağıdaki resmi inceleyin;
Şimdi bu bilgileri kullanarak StaticAddress imizi işleyelim;
static adresimiz 0x50F4F4; id bu bir adrestir bunu kullanmak için bize işte şimdi bir pointer değişkeni lazım, genelde hile yaparken bu tür değişkenler için DWORD data type ı kullanılır,
burda ne yaptık = base pointeri oluşturduk ve "(DWORD*)0x50F4F4" ilede "0x50F4F" adresinin başına "(DWORD*)" koyarak bir adres olduğunu belirttik;
eğer bu noktada std::cout base yazdırırsak bize 0x50F4F4 gösterecektir.
bu ikisi arasındaki farkı anlarsanız bu iş çözülür.
bukadar açıklamadan sonra mainHack() ' in son görünümü şöyle olması lazım;
buradan sonra işin içine ofsetlerimiz dahil oluyor. Tekrar söylüyorum "*a" bize o adresin içindeki değeri veriyodu değil mi ozaman şu tanım "*(DWORD*)0x50F4F4" bize "50F4F4" adresini içindeki değeri verecek eğer dersleri sıkı takip ediyorsanız burayı anlamanız lazım ve o tanım bize "Local Player Adresi"mizi verecek olduğunu da tahmin edersiniz.
Assault Cube de can ofsetimiz "0xF8" idi hatırlarsanız.
yukarıdaki kod "CAN" adresni tutan bir pointer oluşturdu. Ve biz buna yeni bir atamak yapmak istersek de şöyle yapıcağız;
gibi bir satır yazarsak bunun anlamı şudur: "*can" -> can adresi içindeki değeri "= 150;" yap demektir aslında bu satır.
Buraya kadar aslında bir "Internal Trainer" hazırlamış olduk. Bu dll yi build edip herhangi bir enjektör ile oyuna enjekte edip sonuca bakabilirsiniz.
Videolu Anlatım
öncelikle şunu bilmenizi isterimki bu konuyu
Bağlantıları görmek için lütfen
Giriş Yap
Başlarken
İçten hack yapmak için bizim dll oluşturmamız lazım, bu dll bizim hilemiz olacak, oyuna enjekte edilecek ve
böylelikle bizim kodumuz oyunun bir parçası olacak. Bu harika bir şey çünkü biz adreslere direk erişebileceğiz
ve ReadProcessMemory yada WriteProcessMemory gibi fonksiyonlara ihtiyacımız kalmayacak.Şimdi dll giriş noktasını
oluşturmamız lazım
C++:
#include <windows.h>
#include <iostream>
void mainHack(); //prototypedir main fonk. altında esas fonk. tanımlayabiliriz
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH) {
DisableThreadLibraryCalls(hModule);
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)mainHack, NULL, NULL, NULL); //yeni bir thread oluşturur ve mainHack fonksiyonunu başlatır
}
else if (dwReason == DLL_PROCESS_DETACH) {
}
return TRUE;
}
void mainHack()
{
}
Enjekte edildikten sonra, DllMain'deki parametreler doldurulur ve başarıyla enjekte edilirse dwReason, DLL_PROCESS_ATTACH değerini döndürür.
Kodumuzun tümü şimdilik mainHack () içinde olacak ve DllMain'e () hiçbir şey eklenmeyecek. Yeni bir iş parçacığı oluşturmak ve kodunuzu yeni iş parçacığında çalıştırmak istiyoruz. Kodunuzu DllMain'in içine koymayın çünkü burada yeni bir iş parçacığı oluşturulur. Şimdi hackMain () içine yararlı olabilecek bazı çok temel şeyler ekleyeceğiz.
C++:
AllocConsole(); //Console ekranı açar
freopen("CONOUT$", "w", stdout); //std::cout kullanmamız için yetki verir
std::cout << "We Can Use Console For Debugging!\n"; //yazdırmak istediğimiz şeyi böyle yazdırabiliriz.
bu üç satırlık kod hangi programa eklediyseniz ona dahil edilir, ayrıca bu konsol değişken değerlerini görebilmek için çok kullanışlı olur.
Pointerlar
Geçenki dersimizde bahsetmiştim:
bir pointer oluşturmak için
int *a;
gibi bir tanım yapmamız lazımdı. Bu neyi tutuyodu "herhangi bir adresi"
eğer biz bunu
"std::cout<<*a"
konsolda yazdırmak istersek "*a" yaptığımız için, "a" zaten herhangi bir adresi tutuyordu, başına tekrar "*"koyduğumuz için ise bu "a" nın içindeki değeri verir.
örenek olarak aşağıdaki resmi inceleyin;
C++:
int x = 10; //x isimli bir değişken oluşturur ve içine 10 atar
int* pX; //integer bir pointer oluşturur
pX = &x; //pX pointerına x değişkeninin adresini atar.
std::cout << *pX; //pX adresinin referans ettiği ram kümesinin içindeki değeri gösterir.
Şimdi bu bilgileri kullanarak StaticAddress imizi işleyelim;
static adresimiz 0x50F4F4; id bu bir adrestir bunu kullanmak için bize işte şimdi bir pointer değişkeni lazım, genelde hile yaparken bu tür değişkenler için DWORD data type ı kullanılır,
C++:
DWORD * base = (DWORD*)0x50F4F4;
burda ne yaptık = base pointeri oluşturduk ve "(DWORD*)0x50F4F4" ilede "0x50F4F" adresinin başına "(DWORD*)" koyarak bir adres olduğunu belirttik;
eğer bu noktada std::cout base yazdırırsak bize 0x50F4F4 gösterecektir.
C++:
DWORD base = *(DWORD*)0x50F4F4;
std::cout << base;
Kod:
DWORD * base = (DWORD*)0x50F4F4;
std::cout << *base;
bu ikisi arasındaki farkı anlarsanız bu iş çözülür.
bukadar açıklamadan sonra mainHack() ' in son görünümü şöyle olması lazım;
C++:
void mainHack()
{
AllocConsole();
freopen("CONOUT$", "w", stdout);
std::cout << "We Can Use Console For Debugging!\n";
DWORD base = *(DWORD*)0x50F4F4;
std::cout << base;
}
buradan sonra işin içine ofsetlerimiz dahil oluyor. Tekrar söylüyorum "*a" bize o adresin içindeki değeri veriyodu değil mi ozaman şu tanım "*(DWORD*)0x50F4F4" bize "50F4F4" adresini içindeki değeri verecek eğer dersleri sıkı takip ediyorsanız burayı anlamanız lazım ve o tanım bize "Local Player Adresi"mizi verecek olduğunu da tahmin edersiniz.
Assault Cube de can ofsetimiz "0xF8" idi hatırlarsanız.
C++:
DWORD * can = (base+0xF8)
yukarıdaki kod "CAN" adresni tutan bir pointer oluşturdu. Ve biz buna yeni bir atamak yapmak istersek de şöyle yapıcağız;
C++:
*can = 150;
gibi bir satır yazarsak bunun anlamı şudur: "*can" -> can adresi içindeki değeri "= 150;" yap demektir aslında bu satır.
Buraya kadar aslında bir "Internal Trainer" hazırlamış olduk. Bu dll yi build edip herhangi bir enjektör ile oyuna enjekte edip sonuca bakabilirsiniz.
Videolu Anlatım