Neden her güncelleme geldiği zaman adreslerimizi değiştirmeye ihtiyaç duyarız?

Uzman Üye
Katılım
2 Ocak 2016
Mesajlar
173
Tepki puanı
29
Ödüller
8
8 HİZMET YILI
Evet, başlık çok net: "Neden her güncelleme geldiği zaman adreslerimizi değiştirmeye ihtiyaç duyarız?" Bu konu insanlarda "NE DEMEK YA? GÜNCELLEME GELDİĞİ İÇİN TABİ Kİ" diye bilinse de, aslında işin teorik kısmını bilen insan sayısı az. Hadi gelin çok basitçe bunun üstünden geçelim. Ancak, bunun bir akademik anlatım olmadığını tekrar hatırlamak istiyorum. Bu konular, Udemy gibi yerlerde hap bilgiler şeklinde öğrenilebilecek şeyler değil, akademik dil ile yazılmış kitaplar ve makalelerde öğrenilebilecek şeylerdir.

Aslında cevabı da çok net olmakla birlikte, biraz detayına inelim ve örnekler ile anlatalım. Haydi başlayalım.

Şimdi, işletim sistemleri bildiğiniz üzere, bir programı açtığınız zaman ona bir base adres tanımlıyor ve programlar bu base adresler üzerinden çalışıyorlar. Şöyle bir simülasyon oluşturalım:

Benim D-SHOOTER adında bir oyunum var. Oyunu ABC motoru ile geliştirdim. Oyunun ana döngüsünde can durumu şu şekilde belirlensin:

Kod:
mainGameLoop(){


....

....

var healt=localPlayer.getHealt();
if (healt <= 0){
localPlayer.setDeath=true;
}

}

Bu tarz basit bir ölüm mekanizmamız olsun. Tabii, burada çok detaya girmedim. Normalde ölüm kontrolleri bu tarz bir yerde yapılmaz. Her neyse, basit olması için yaptım. Devam ediyoruz.

Oyunumun 1.0.0 sürümü olduğunu düşünelim. Ardından siz D-SHOOTER'u indirdiniz ve oyunu açtınız. An itibariyle işletim sistemi size bir base adresi verdi. Bu base adresi hexadecimal'dir ve hexadecimal zaten başlı başına bir sayı olduğu için rahatlıkla toplanıp çıkarılabilir.

Şimdi, işletim sisteminizin D-SHOOTER için atadığı base adresi ABC olsun. Artık bundan böyle D-SHOOTER için referans adresi 0xABC'dir. Yani, sizler veya program veya işletim sistemi D-SHOOTER içindeki herhangi bir şeye ulaşmak istediği zaman 0xABC'yi baz alarak hareket edecek ve tüm D-SHOOTER verileri bu adrese yazılacak.

Yani, oyunumuzdaki tüm veri kümeleri ve fonksiyonlar bu adreste tutuluyor ve derleme aşamasında bu adres referansı üzerinden çağırılıyor.

1678970548601.png

Burada base adres nedir? Şimdi bunu yine basitçe anlatmaya çalışalım.

Az önce size hatırlarsanız demiştim ki her şey 0xABC'ye yazılacak, fakat aslında bu doğru gibi görünen, sizin anlamanızı kolaylaştırmak için kabul edebileceğiniz bir yanlıştır.

Çünkü programın base adresi, programın başladığı noktadır ve aynı noktada programın boyutu da belirtilir, bu da otomatik olarak bitiş noktasının da base adresde bulunacağı anlamına gelir.

Yani örneğin, programın başlangıç adresi 0xABC ise ve programın boyutu 5000 bayt ise, 0xABC+5000=0x1E44 programın bittiği noktayı da bulabiliriz. Tabi ki, bunu biz yapmıyoruz.

Şimdi devam edelim. Benim programımın boyutu, kodlarımın uzunluğuna ve farklı materyallere göre değişir, değil mi? Bunu aklımızda tutalım, çünkü az önce söylediğim şey, genel olarak anlattığım şeylerin özetidir. "Benim programımın boyutu, kodlarımın uzunluğuna ve farklı materyallere göre değişir, değil mi?"

1678971720885.png

Şimdi, kod çalışırken can değerinin pointerı 0x173C olsun. Bununu nasıl bulduğumuz size kalmış, ancak devam edelim, can değerimiz 0x173C, değil mi?

Şimdi yapmamız gereken şey nedir? Detaylara girelim.

Herkes en azından bir kez, herhangi bir ön bilgisi olmadan hile yapmayı araştırmıştır, değil mi? Hesap makinesi açılır, ayarlardan programcı sekmesi seçilir, ardından toplama ve çıkarma işlemleri başlar. Genellikle videoyu anlatan kişi ne yaptığını bilmez, çünkü o da başka birinden öğrenmiştir ve ezberleme yoluyla toplama-çıkarma yapar.

Şimdi asıl konumuza gelelim. Bulduğumuz can değeri 0x173C değil mi? Bakın, bu bir pointerdır, bizim bu pointerı offsete çevirmemiz şart, ama neden? Offsetler, yukarıda anlattığımız programın başlangıç değerini referans alarak o değere giderler. Fakat pointerlar, adından da anlaşılacağı üzere doğrudan rame giderler. Bizim burada yapmamız gereken şey şudur: ÖTELEME.

Öteleme yaparak, örneğin 0xABC ile başlayan programa 5 bayt eklersek ne olur? 5 bayt öteleriz, yani 0xABC+5 yapmış oluruz ve 5 bayt sonraki veriye gitmiş oluruz.

Şimdi, nasıl toplama yapabiliyorsak, çıkarma da yapabiliriz, değil mi? Öyleyse, bulduğumuz can pointerından base adresini çıkarırsak, programın 1.0.0 sürümünde can değeri için ne kadar öteleme yaptığımızı bulabiliriz ve böylece hilemiz için otomasyon yazarken bu base adresi referans alarak bu değere ulaşabiliriz.

Ötelenen değer, yani can değeri, her zaman base adresinden büyük olmak zorunda olduğu için, ÖTELENEN DEĞER - BASE ADRES = OFFSET formülünü uygulayabiliriz. Yani, 0x173C-0xABC dersek, 0xC80 sonucunu alacağız. 0xC80, bizim can offsetimizdir ve böylece offseti elde ettik.

!(
Buraya bir parantez açıyorum, çünkü mermi birden fazla ofsete sahip olabilir. Yani, herhangi bir oyunda benim yaptığım işlemle başarılı olamayabilirsiniz, çünkü bu oyunda mermi sadece bir yerde kullanılıyor ve çok basit. Fakat diğer durumlarda böyle değil. Örneğin, farklı oyunlarda aynı anda birden fazla ofset aynı pointer adresini gösterebilir. Yani, 0x1 ofseti (base adres+0x1) 0xC1C pointerını gösterirken, 0x2 ofseti de (base adres+0x2) 0xC1C pointerını gösterebilir.

Burada anlatmak istediğim şey, bu anlatıklarımın bir oyunda çalışıp çalışmadığı değil, sadece mantığını anlatmaya çalışıyorum. Neden toplama çıkarma var, neden öteleme var, bunu açıklamak istiyorum.
)!

Evett, 0xC80'i elde ettik. Böylece oyunun 1.0.0 sürümünde can değerinin base adresi üzerinde 0xC80 kadar ötelenerek elde edildiğini öğrendik.

Peki, neden çıkardık? Neden tüm bu işlemleri yaptık?

"PROGRAM HER KAPANIP AÇILDIĞINDA YENİ BASE ADRESİ ONA İŞLETİM SİSTEMİ TARAFINDAN VERİLİR. BASE ADRES AYNI KALMADIĞI İÇİN BİZİM YAPMAMIZ GEREKEN TEK ŞEY ÖTELEMEYİ BULMAK."

Yani programın ötelenmiş değeri bizi ilgilendirmiyor, bizi ilgilendiren şey öteleme miktarı.

Devam edelim, şimdi oyunumuza basit bir güncelleme geldi ve 1.0.1 sürümüne yükseltildi. Tek ekledikleri şey ise şu oldu:

Kod:
mainGameLoop(){


....

....

var healt=localPlayer.getHealt();
if (healt <= 0){
localPlayer.setDeath=true;
localPlayer.tabTitle=localPlayer.tabTitle+" (DEATH)";
}

}

Peki, şimdi ne olacak? Tüm offsetleri tekrar bulmamız gerekiyor, çünkü stack mantığına göre bir eleman içeri girerse, diğer tüm elemanların değeri değişir.

Daha açıklayıcı olması için bir örnek vermek gerekirse; siz 10. sırada dururken, önünüze yeni birisi katılırsa sizin sıralamanız değişir. Bu durumda, öteleme miktarı da değişir ve yeniden değerleri hesaplamamız gerekir.



Yazımda hatalar olabilir(bildirirseniz sevinirim), ancak burada anlatmak istediğim şey mantıktır. Neden yaptığımızı anlamak önemlidir. Teşekkürler.
 
Son düzenleme:
Her hile kullanan bir gün banı tadacaktır
Seçkin Üye
Katılım
19 Ocak 2017
Mesajlar
380
Çözümler
1
Tepki puanı
30
Ödüller
7
Yaş
21
7 HİZMET YILI
kanka güzel paylaşım olmuş eline sağlık ama burda bunu bilen ve anlayan az insan var sanırım
 
bir ucaktik dustuk bir gemiydik battik
Efsane Üye
Katılım
21 Eyl 2019
Mesajlar
3,633
Çözümler
57
Tepki puanı
442
Ödüller
8
Sosyal
4 HİZMET YILI
çok açıklayıcı olmuş eline sağlık benim de başlayasım geldi :D
 
Tutku Oyun Hizmetleri
Ultra Üye
Katılım
6 Ara 2021
Mesajlar
1,560
Çözümler
5
Tepki puanı
141
Ödüller
4
Yaş
24
Sosyal
2 HİZMET YILI
hocam gayet açıklayıcı güzel anlatım olmuş elinize sağlık
 
Ultra Üye
Katılım
5 Kas 2021
Mesajlar
1,518
Çözümler
5
Tepki puanı
144
Ödüller
3
2 HİZMET YILI
Meraklısı için yararlı bir konu olmuş hocam üşenmeden yazmışsınız elinize sağlık
 
Onaylı Üye
Katılım
27 Tem 2017
Mesajlar
76
Tepki puanı
15
Ödüller
8
Yaş
36
6 HİZMET YILI
yazılımsal konular assembly olması lazım hangi program acaba
 
HER OYUNUN BİR AÇIĞI VARDIR
Ultra Üye
Katılım
1 Ara 2017
Mesajlar
1,506
Çözümler
1
Tepki puanı
112
Ödüller
7
Yaş
23
6 HİZMET YILI
O kadar basit ve açıklayıcı anlatmışsın eline diline emeğine sağlık dostum.
 
Üye
Katılım
10 Nis 2017
Mesajlar
45
Tepki puanı
5
Ödüller
5
Yaş
22
7 HİZMET YILI
Meraklısına harbi güzel özetlemişsin eline sağlık
 
Uzman Üye
Katılım
6 May 2017
Mesajlar
190
Tepki puanı
14
Ödüller
6
6 HİZMET YILI
ilgili bir insan için rehber niteliğinde olmuş eline sağlık hocam
 
R E U N O N
Seçkin Üye
Katılım
3 Mar 2018
Mesajlar
442
Çözümler
1
Tepki puanı
46
Ödüller
6
Yaş
23
6 HİZMET YILI
Açıklamanın yanında çizdiğin görsellerle destekelemen çok hoş olmuş, başarılı.
 
Seçkin Üye
Katılım
1 Eyl 2018
Mesajlar
313
Tepki puanı
22
Ödüller
6
Yaş
26
5 HİZMET YILI
çok önemli bir konuya değinmişssin
 
omertrans505
Efsane Üye
Katılım
17 Ara 2016
Mesajlar
3,204
Çözümler
63
Tepki puanı
346
Ödüller
11
Sosyal
7 HİZMET YILI
Her oyuncu 5000 baytlık weapon id, mermin sayisi, vb.. içeren değişkenler depolar diye düşündüm. Güzel anlatımı bir konu olmuş.
 
Welcome To The Island Of Misfit Toys
Onaylı Üye
Katılım
28 Nis 2023
Mesajlar
60
Tepki puanı
3
Yaş
21
dammn. ustaca bi anlatım tb
 
Üye
Katılım
1 May 2023
Mesajlar
49
Tepki puanı
4
Yaş
24
Evet, başlık çok net: "Neden her güncelleme geldiği zaman adreslerimizi değiştirmeye ihtiyaç duyarız?" Bu konu insanlarda "NE DEMEK YA? GÜNCELLEME GELDİĞİ İÇİN TABİ Kİ" diye bilinse de, aslında işin teorik kısmını bilen insan sayısı az. Hadi gelin çok basitçe bunun üstünden geçelim. Ancak, bunun bir akademik anlatım olmadığını tekrar hatırlamak istiyorum. Bu konular, Udemy gibi yerlerde hap bilgiler şeklinde öğrenilebilecek şeyler değil, akademik dil ile yazılmış kitaplar ve makalelerde öğrenilebilecek şeylerdir.

Aslında cevabı da çok net olmakla birlikte, biraz detayına inelim ve örnekler ile anlatalım. Haydi başlayalım.

Şimdi, işletim sistemleri bildiğiniz üzere, bir programı açtığınız zaman ona bir base adres tanımlıyor ve programlar bu base adresler üzerinden çalışıyorlar. Şöyle bir simülasyon oluşturalım:

Benim D-SHOOTER adında bir oyunum var. Oyunu ABC motoru ile geliştirdim. Oyunun ana döngüsünde can durumu şu şekilde belirlensin:

Kod:
mainGameLoop(){


....

....

var healt=localPlayer.getHealt();
if (healt <= 0){
localPlayer.setDeath=true;
}

}

Bu tarz basit bir ölüm mekanizmamız olsun. Tabii, burada çok detaya girmedim. Normalde ölüm kontrolleri bu tarz bir yerde yapılmaz. Her neyse, basit olması için yaptım. Devam ediyoruz.

Oyunumun 1.0.0 sürümü olduğunu düşünelim. Ardından siz D-SHOOTER'u indirdiniz ve oyunu açtınız. An itibariyle işletim sistemi size bir base adresi verdi. Bu base adresi hexadecimal'dir ve hexadecimal zaten başlı başına bir sayı olduğu için rahatlıkla toplanıp çıkarılabilir.

Şimdi, işletim sisteminizin D-SHOOTER için atadığı base adresi ABC olsun. Artık bundan böyle D-SHOOTER için referans adresi 0xABC'dir. Yani, sizler veya program veya işletim sistemi D-SHOOTER içindeki herhangi bir şeye ulaşmak istediği zaman 0xABC'yi baz alarak hareket edecek ve tüm D-SHOOTER verileri bu adrese yazılacak.

Yani, oyunumuzdaki tüm veri kümeleri ve fonksiyonlar bu adreste tutuluyor ve derleme aşamasında bu adres referansı üzerinden çağırılıyor.

Ekli dosyayı görüntüle 87817
Burada base adres nedir? Şimdi bunu yine basitçe anlatmaya çalışalım.

Az önce size hatırlarsanız demiştim ki her şey 0xABC'ye yazılacak, fakat aslında bu doğru gibi görünen, sizin anlamanızı kolaylaştırmak için kabul edebileceğiniz bir yanlıştır.

Çünkü programın base adresi, programın başladığı noktadır ve aynı noktada programın boyutu da belirtilir, bu da otomatik olarak bitiş noktasının da base adresde bulunacağı anlamına gelir.

Yani örneğin, programın başlangıç adresi 0xABC ise ve programın boyutu 5000 bayt ise, 0xABC+5000=0x1E44 programın bittiği noktayı da bulabiliriz. Tabi ki, bunu biz yapmıyoruz.

Şimdi devam edelim. Benim programımın boyutu, kodlarımın uzunluğuna ve farklı materyallere göre değişir, değil mi? Bunu aklımızda tutalım, çünkü az önce söylediğim şey, genel olarak anlattığım şeylerin özetidir. "Benim programımın boyutu, kodlarımın uzunluğuna ve farklı materyallere göre değişir, değil mi?"

Ekli dosyayı görüntüle 87820
Şimdi, kod çalışırken can değerinin pointerı 0x173C olsun. Bununu nasıl bulduğumuz size kalmış, ancak devam edelim, can değerimiz 0x173C, değil mi?

Şimdi yapmamız gereken şey nedir? Detaylara girelim.

Herkes en azından bir kez, herhangi bir ön bilgisi olmadan hile yapmayı araştırmıştır, değil mi? Hesap makinesi açılır, ayarlardan programcı sekmesi seçilir, ardından toplama ve çıkarma işlemleri başlar. Genellikle videoyu anlatan kişi ne yaptığını bilmez, çünkü o da başka birinden öğrenmiştir ve ezberleme yoluyla toplama-çıkarma yapar.

Şimdi asıl konumuza gelelim. Bulduğumuz can değeri 0x173C değil mi? Bakın, bu bir pointerdır, bizim bu pointerı offsete çevirmemiz şart, ama neden? Offsetler, yukarıda anlattığımız programın başlangıç değerini referans alarak o değere giderler. Fakat pointerlar, adından da anlaşılacağı üzere doğrudan rame giderler. Bizim burada yapmamız gereken şey şudur: ÖTELEME.

Öteleme yaparak, örneğin 0xABC ile başlayan programa 5 bayt eklersek ne olur? 5 bayt öteleriz, yani 0xABC+5 yapmış oluruz ve 5 bayt sonraki veriye gitmiş oluruz.

Şimdi, nasıl toplama yapabiliyorsak, çıkarma da yapabiliriz, değil mi? Öyleyse, bulduğumuz can pointerından base adresini çıkarırsak, programın 1.0.0 sürümünde can değeri için ne kadar öteleme yaptığımızı bulabiliriz ve böylece hilemiz için otomasyon yazarken bu base adresi referans alarak bu değere ulaşabiliriz.

Ötelenen değer, yani can değeri, her zaman base adresinden büyük olmak zorunda olduğu için, ÖTELENEN DEĞER - BASE ADRES = OFFSET formülünü uygulayabiliriz. Yani, 0x173C-0xABC dersek, 0xC80 sonucunu alacağız. 0xC80, bizim can offsetimizdir ve böylece offseti elde ettik.

!(
Buraya bir parantez açıyorum, çünkü mermi birden fazla ofsete sahip olabilir. Yani, herhangi bir oyunda benim yaptığım işlemle başarılı olamayabilirsiniz, çünkü bu oyunda mermi sadece bir yerde kullanılıyor ve çok basit. Fakat diğer durumlarda böyle değil. Örneğin, farklı oyunlarda aynı anda birden fazla ofset aynı pointer adresini gösterebilir. Yani, 0x1 ofseti (base adres+0x1) 0xC1C pointerını gösterirken, 0x2 ofseti de (base adres+0x2) 0xC1C pointerını gösterebilir.

Burada anlatmak istediğim şey, bu anlatıklarımın bir oyunda çalışıp çalışmadığı değil, sadece mantığını anlatmaya çalışıyorum. Neden toplama çıkarma var, neden öteleme var, bunu açıklamak istiyorum.
)!

Evett, 0xC80'i elde ettik. Böylece oyunun 1.0.0 sürümünde can değerinin base adresi üzerinde 0xC80 kadar ötelenerek elde edildiğini öğrendik.

Peki, neden çıkardık? Neden tüm bu işlemleri yaptık?

"PROGRAM HER KAPANIP AÇILDIĞINDA YENİ BASE ADRESİ ONA İŞLETİM SİSTEMİ TARAFINDAN VERİLİR. BASE ADRES AYNI KALMADIĞI İÇİN BİZİM YAPMAMIZ GEREKEN TEK ŞEY ÖTELEMEYİ BULMAK."

Yani programın ötelenmiş değeri bizi ilgilendirmiyor, bizi ilgilendiren şey öteleme miktarı.

Devam edelim, şimdi oyunumuza basit bir güncelleme geldi ve 1.0.1 sürümüne yükseltildi. Tek ekledikleri şey ise şu oldu:

Kod:
mainGameLoop(){


....

....

var healt=localPlayer.getHealt();
if (healt <= 0){
localPlayer.setDeath=true;
localPlayer.tabTitle=localPlayer.tabTitle+" (DEATH)";
}

}

Peki, şimdi ne olacak? Tüm offsetleri tekrar bulmamız gerekiyor, çünkü stack mantığına göre bir eleman içeri girerse, diğer tüm elemanların değeri değişir.

Daha açıklayıcı olması için bir örnek vermek gerekirse; siz 10. sırada dururken, sıraya yeni birisi katılırsa sizin sıralamanız değişir. Bu durumda, öteleme miktarı da değişir ve yeniden değerleri hesaplamamız gerekir.



Yazımda hatalar olabilir(bildirirseniz sevinirim), ancak burada anlatmak istediğim şey mantıktır. Neden yaptığımızı anlamak önemlidir. Teşekkürler.
kral bence adres tekrardan yazma nedenimiz güncellemeler belkide taşındığıomızı düşünüyordur ?
 
Üye
Katılım
26 Eyl 2017
Mesajlar
49
Tepki puanı
0
Ödüller
5
Yaş
27
6 HİZMET YILI
güzel ve bilgilendirici bir paylaşım eline sağlık
 
Seçkin Üye
Katılım
24 Kas 2021
Mesajlar
596
Tepki puanı
27
Ödüller
3
Yaş
23
2 HİZMET YILI
çok haklı bir konu bende çok merak ettim
 
Üst
  AdBlock Detected
Elbette, reklam engelleme yazılımı, reklamları engelleme konusunda harika bir iş çıkarır, ancak aynı zamanda web sitemizin bazı yararlı ve önemli özelliklerini de engeller. Mümkün olan en iyi site deneyimi için lütfen bir dakikanızı ayırarak AdBlocker'ınızı devre dışı bırakın.