- Moderatör
- #1
Słyszę, słyszę letni powiew.
Kurucu
Merhaba arkadaşlar, birçok defa bu konu ile ilgili yardım istediğinizi görüyorum. Eskiden arkadaşların tw sine bağlanıp yardımcı olmaya çalışıyordum fakat artık bundan sıkıldım ve algoritmayı son defa sizlerle bu kadar açık bir biçimde paylaşıyorum. Öncelikle bilmeniz gereken şey şuan buraya vereceğim kodları zamanında bende kullandım. Yani çalışırlığı garantidir, algoritma denenmiştir. Size biraz karışık gelebilir, kontrollerden kafanız patlayabilir. Bilmenizi isterimki işimi kolaylaştırsın diye bu kodları baya bir düzenledim. Size "düzenlenmemiş" halini veriyorum. Kendi çabalarınızla adam edersiniz artık. Diğer türlü görüntü kirliliği oluşturuyor. Fakat mantık çalışmaktadır. Mantığı anladığınız zaman aynı şekil dilerseniz VB.Net hilenize de yapabilirsiniz. Bu sayede amele gibi kullanıcı oyun biterken obj li adreslerin checkboxunu kaldırmak zorunda kalmaz.
Wolftü ile artık uğraşmadığımızdan dolayı gönül rahatlılığı ile bu paylaşımı yapıyorum. Dilediğiniz gibi kullanabilirsiniz.
Credits: Algoritma dışında kodların bir çoğu public arkadaşlar. Ayriyetten yüksek ihtimal @LeftSpace büyük katkısı olmuştur. Dediğim gibi, aşağıdaki kodları ve algoritmayı uzun zaman önce kullanıyorduk. Size biraz amele işi gibi geliyor olabilir.
Mantık basit. Öncelikle ihtiyacımız olan adresler var. :
1: ingame_adr. Bu pointerin valuesi oyun içi 1, oyun dışı 0 oluyor.
2: wolfteambase. Bu hepimizin bildiği .bin li base adresi. Pointer değişken olmadığından dolayı GetModuleHandle fonksiyonu ile direk olarak base adresini çekebileceğiz.
2: objbase. Bu her oyun değişen objbasemiz. Algoritmamız ile bunu her yeni oyunda sadece 1 kere çekeceğiz. Bu sayede hem performanstan ödün vermeyeceğiz, hemde özellikler crash atmayacak.
3: takla_adr. Bu pointer takla pointeri. Örnek olsun diye obj li adres olarak bunu koydum.
Yukarıdaki ingame_adr ve takla_adr yi aşağıdaki kodlar ile "otomatik" olarak bulacağız. Bu sayede her yamada uğraşmayacaksınız. Bunun için "FindSignature" fonksiyonunu kullanıyoruz.
Kurulan algoritma:
1-Wolfteambase adresini ve base adresinin sizesini çekiyoruz. FindSignature fonksiyonunu kullanarak ingame_adr yi buluyoruz.
2-ingame_adr nin valuesini okuyarak ingame_value adlı değişkene atıyoruz. ingame_value 'nin değeri oyun içi 1, oyun dışı 0 oluyor.
3-Eğer ingame_value 0 sa objbase ve objli tüm adresleri (mesela takla_pointer)= 0 diyoruz. Eğer ingame_value 1 se ve objbase 0 sa "GetObj" fonksiyonunu kullanarak objbase değişkenine obj base adresini atıyoruz.
Her yeni oyunda obj basesi değiştiğinden dolayı obj adresini bir kere çektiğiniz vakit yeni oyuna girdiğinizde eski kaydettiğiniz obj adresinin basesini kullandığınızdan dolayı obj li özellikler çalışmayacaktır. Bundan dolayı eğer ingame_value 0 sa objbase = 0 diyoruz. Kullanıcı oyun dışında çıktığında objbase adresi 0 oluyor. Oyun içine girdiği vakit "Eğer obj adresi 0 a eşitse obj yi çek" diyoruz. Her oyundan çıktığında obj adresini sıfırladığımız için her oyuna girdiğinde yeni obj base adresini elde ediyoruz.
4- Eğer objbase 2 den büyükse (yani baseyi çektiysek) , ingame_adr 1 se (yani oyun içindeysek) ve takla_adr = 0 sa, FindSignature fonksiyonunu kullanarak takla adresimizi buluyoruz.
Kafanızada oluşabilecek sorular:
*FindSignature fonksiyonu nedir ?
Bu fonksiyon sayesinde belirlediğimiz base adresinin içerisinde bizim verdiğimiz array dizinini arıyor.
*Neden base adreslerinin sizesini çekiyoruz ?
FindSignature fonksiyonunu kullanarak aradığımız array dizinine uyan adresi bulabilmemiz için, base adresinin başlangıcını ve sonunu bilmemiz lazım. Yani sizeyi kullanarak sadece belirttiğimiz modülde tarama yapıyoruz.
*Adreslerin arrayını nasıl bulabilirim ?
Cheat Engine ile MemoryView kullanarak adrese gidin. Daha sonra bulmak istediğimiz adresten başlayarak aşağıya doğru byteleri tek tek yazmaya başlayın. Her yeni byte girdiğinizde cheat engine ile array scan yaparak kaç sonuç bulduğuna bakın. 1 sonuç bulana kadar byte eklemeye devam edin.
Örnek:
Mesela ben devenv.exe + 4615 adresini her yeni yamada uğraşmadan bulmak istiyorum. Gördüğünüz gibi adresimiz push 04 , bytesi 6A 04. Yani ben 6A 04 taraması yaptığımda bu adresi ve bu adresle birlikte oyundaki tüm push 04 leri bulacağım. Sadece bu adresi bulmak istediğimden dolayı bir altındaki mov eax, devenv.exe+3CECA adresinin bytelerini de 6A 04 ün sağına ekliyorum. Bu sayede artık sadece push 04 değil, push 04 mov eax taraması yapıyorum. Böyle böyle tek sonuç bulana kadar gidiyoruz.
6A 04 B8 CA CE 99 2F
Sanırsam bu kadar anlatım yeter. Kafanıza takılan bir soru olursa ve eğer bu soru bu yazıların içinde değilse cevaplarım. İyi kodlamalar
Gerekli Fonksiyonlar:
Adres bulma ve obj kontrol Voidi:
Hack Voidi:
Wolftü ile artık uğraşmadığımızdan dolayı gönül rahatlılığı ile bu paylaşımı yapıyorum. Dilediğiniz gibi kullanabilirsiniz.
Credits: Algoritma dışında kodların bir çoğu public arkadaşlar. Ayriyetten yüksek ihtimal @LeftSpace büyük katkısı olmuştur. Dediğim gibi, aşağıdaki kodları ve algoritmayı uzun zaman önce kullanıyorduk. Size biraz amele işi gibi geliyor olabilir.
Mantık basit. Öncelikle ihtiyacımız olan adresler var. :
1: ingame_adr. Bu pointerin valuesi oyun içi 1, oyun dışı 0 oluyor.
2: wolfteambase. Bu hepimizin bildiği .bin li base adresi. Pointer değişken olmadığından dolayı GetModuleHandle fonksiyonu ile direk olarak base adresini çekebileceğiz.
2: objbase. Bu her oyun değişen objbasemiz. Algoritmamız ile bunu her yeni oyunda sadece 1 kere çekeceğiz. Bu sayede hem performanstan ödün vermeyeceğiz, hemde özellikler crash atmayacak.
3: takla_adr. Bu pointer takla pointeri. Örnek olsun diye obj li adres olarak bunu koydum.
Yukarıdaki ingame_adr ve takla_adr yi aşağıdaki kodlar ile "otomatik" olarak bulacağız. Bu sayede her yamada uğraşmayacaksınız. Bunun için "FindSignature" fonksiyonunu kullanıyoruz.
Kurulan algoritma:
1-Wolfteambase adresini ve base adresinin sizesini çekiyoruz. FindSignature fonksiyonunu kullanarak ingame_adr yi buluyoruz.
2-ingame_adr nin valuesini okuyarak ingame_value adlı değişkene atıyoruz. ingame_value 'nin değeri oyun içi 1, oyun dışı 0 oluyor.
3-Eğer ingame_value 0 sa objbase ve objli tüm adresleri (mesela takla_pointer)= 0 diyoruz. Eğer ingame_value 1 se ve objbase 0 sa "GetObj" fonksiyonunu kullanarak objbase değişkenine obj base adresini atıyoruz.
Her yeni oyunda obj basesi değiştiğinden dolayı obj adresini bir kere çektiğiniz vakit yeni oyuna girdiğinizde eski kaydettiğiniz obj adresinin basesini kullandığınızdan dolayı obj li özellikler çalışmayacaktır. Bundan dolayı eğer ingame_value 0 sa objbase = 0 diyoruz. Kullanıcı oyun dışında çıktığında objbase adresi 0 oluyor. Oyun içine girdiği vakit "Eğer obj adresi 0 a eşitse obj yi çek" diyoruz. Her oyundan çıktığında obj adresini sıfırladığımız için her oyuna girdiğinde yeni obj base adresini elde ediyoruz.
4- Eğer objbase 2 den büyükse (yani baseyi çektiysek) , ingame_adr 1 se (yani oyun içindeysek) ve takla_adr = 0 sa, FindSignature fonksiyonunu kullanarak takla adresimizi buluyoruz.
Kafanızada oluşabilecek sorular:
*FindSignature fonksiyonu nedir ?
Bu fonksiyon sayesinde belirlediğimiz base adresinin içerisinde bizim verdiğimiz array dizinini arıyor.
*Neden base adreslerinin sizesini çekiyoruz ?
FindSignature fonksiyonunu kullanarak aradığımız array dizinine uyan adresi bulabilmemiz için, base adresinin başlangıcını ve sonunu bilmemiz lazım. Yani sizeyi kullanarak sadece belirttiğimiz modülde tarama yapıyoruz.
*Adreslerin arrayını nasıl bulabilirim ?
Cheat Engine ile MemoryView kullanarak adrese gidin. Daha sonra bulmak istediğimiz adresten başlayarak aşağıya doğru byteleri tek tek yazmaya başlayın. Her yeni byte girdiğinizde cheat engine ile array scan yaparak kaç sonuç bulduğuna bakın. 1 sonuç bulana kadar byte eklemeye devam edin.
Örnek:
Mesela ben devenv.exe + 4615 adresini her yeni yamada uğraşmadan bulmak istiyorum. Gördüğünüz gibi adresimiz push 04 , bytesi 6A 04. Yani ben 6A 04 taraması yaptığımda bu adresi ve bu adresle birlikte oyundaki tüm push 04 leri bulacağım. Sadece bu adresi bulmak istediğimden dolayı bir altındaki mov eax, devenv.exe+3CECA adresinin bytelerini de 6A 04 ün sağına ekliyorum. Bu sayede artık sadece push 04 değil, push 04 mov eax taraması yapıyorum. Böyle böyle tek sonuç bulana kadar gidiyoruz.
6A 04 B8 CA CE 99 2F
Sanırsam bu kadar anlatım yeter. Kafanıza takılan bir soru olursa ve eğer bu soru bu yazıların içinde değilse cevaplarım. İyi kodlamalar
Gerekli Fonksiyonlar:
C++:
MODULEINFO GetModuleInfo(HMODULE hModule){
MODULEINFO modinfo={0};
if(hModule == 0)
return modinfo;
GetModuleInformation(GetCurrentProcess(),hModule, &modinfo,sizeof(MODULEINFO));
return modinfo;
}
DWORD GetOBJ() //obj base çekme
{
HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
MODULEENTRY32 me32;
hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId());
me32.dwSize = sizeof(MODULEENTRY32);
Module32First(hModuleSnap, &me32);
do
{
string modulename = string(me32.szModule);
if(modulename.find("obj")!= -1 && modulename.find(".tmp" != -1){
CloseHandle(hModuleSnap);
return (DWORD)GetModuleHandleA(modulename.c_str());
break;
}
} while(Module32Next(hModuleSnap, &me32));
CloseHandle(hModuleSnap);
return 0;
}
bool compare(PBYTE sig, PCHAR mask, PBYTE adr)
{
for (unsigned int i = 0; i < strlen(mask); i++)
if (mask[i] == 'x' && sig[i] != adr[i]) return false;
return true;
}
DWORD FindSignature(PBYTE sig, PCHAR mask, DWORD dwBase, DWORD dwLen, int iIndex)
{
int cIndex = 0;
if (!dwBase || !mask || !dwLen || !sig) return false;
for (PBYTE i = (PBYTE)dwBase; i != (PBYTE)(dwBase + dwLen); i++)
if (compare(sig, mask, i))
if (iIndex == cIndex++) return (DWORD)i;
return false;
}
C++:
DWORD takla_adr = 0, ingame_adr = 0, objbase = 0, objsize = 0, wolfsize = 0;
int ingame_value;
void ObjAdresleri(){
while(true){
DWORD wolfteambase = (DWORD)GetModuleHandleA("wolftü.bin");
if(wolfteambase > 0 && wolfsize == 0){ //Bir seferlik base adresinin size'sini çekiyoruz.
MODULEINFO getwolfptrbase = GetModuleInfo((HMODULE)wolfteambase);
wolfsize = getwolfptrbase .SizeOfImage; // Base adresinin sizesini çekiyoruz.
}
if (ingame_adr == 0)
ingame_adr = FindSignature((PBYTE)"\x72\x00\x64\x00\x65\x72\x00\x65\x72\x00\x40","x?x?xx?xx?x",wolfteambase,wolfsize ,NULL) - 0x23;
ingame_value= *(DWORD*)(ingame_adr ); //ingame_value int değişkenine ingame_adr pointerimizin valuesini anlık atarıyoruz. Değer oyun içi 1, oyun dışı 0 oluyor.
if (ingame_value == 1 && objbase == 0) //Eğer kullanıcı oyun içindeyse ve daha obj yi çekmediysek obj yi bir seferlik çekiyoruz.
objbase = GetObj();
if(ingame_value == 0){ // Eğer kullanıcı lobby de ise OBJ li adresleri ve OBJ Base adresini 0 a eşitliyoruz. Çünkü her yeni oyunda obj basesi değiştiğinden dolayı, adreslerde değişecektir. Eğer sıfırlamayı yapmazsak bir sonraki oyun obj li özellikler çalışmayacaktır.
takla_adr = 0;
objbase = 0;
}
if(objbase>2 && objsize == 0) //Bir seferlik base adresinin sizesini çekiyoruz{
MODULEINFO getobjptrbase = GetModuleInfo((HMODULE)objbase);
objsize= getobjptrbase .SizeOfImage; // Obj adresinin sizesini çekiyoruz
}
if(takla_adr == 0 && ingame_value == 1 && objbase > 2) //Obj çekildiyse,takla_adr çekilmediyse, oyun içindeysek bir seferlik obj li takla adresini çekiyoruz.
takla_adr = FindSignature((PBYTE)"\x84\xc0\x75\x00\x68\x00\x00\x00\x00\x8b\xcf\xe8\x00\x00\x00\x00\x84\xc0\x75\x00\x8b\x16\x8b\x82\x00\x00\x00\x00\x8b\xce\xff\xd0\x83\xf8\x00\x75\x00\x8b\xce\xe8\x00\x00\x00\x00\x0f\xb6\x00\x51\xe8\x00\x00\x00\x00\x83\xc4\x00\x85\xc0\x74\x00\x68\x00\x00\x00\x00\x8b\xc8\xe8\x00\x00\x00\x00\x84\xc0\x74\x00\x8b\x16","xxx?x????xxx????xxx?xxxx????xxxxxx?x?xxx????xx?xx????xx?xxx?x????xxx????xxx?xx",objbase,objsize ,NULL) ;
Sleep(1000);
}
}
C++:
void HackThread(){
while(true){
if (ingame_value > 0 && objbase > 2) //Eğer kullanıcı oyun içindeyse ve obj adresi çekildiyse
{
if (takla_adr > 0) //Eğer takla adresi bulunduysa
//Burada writeprocessmemory ile yada başka fonksiyonla adresin değerini değiştirin..
}
Sleep(1000);
}
}
Son düzenleme: