Isse Kun
Emektar Üye
Hedef: Aşağıdaki laboratuvarlardan birkaçı
Wesnoth gibi, bu oyun da açık kaynaklıdır ve entegre bir hile karşıtı yoktur. Ayrıca düşük özellikli donanımlarda da iyi çalışır. Wesnoth'un aksine, Chocolatey paketi bozuldu. Bu nedenle, oyunu kurmanın en iyi yolu, yükleyiciyi siteden indirip çalıştırmaktır.
Oyunun çalışması için VirtualBox'ta 3D hızlandırmayı etkinleştirmeniz gerekecektir. Bilgisayarınızın donanımına bağlı olarak, makinenizin bir VM içinde 3B oyun çalıştırması mümkün olmayabilir. Bu durumda, birkaç seçeneğiniz vardır. Bazıları diğerlerinden daha iyidir:
Bağlantıları görmek için lütfen
Giriş Yap
hedef alacak. Bu oyun Quake motoruna dayalı bir FPS'dir.Wesnoth gibi, bu oyun da açık kaynaklıdır ve entegre bir hile karşıtı yoktur. Ayrıca düşük özellikli donanımlarda da iyi çalışır. Wesnoth'un aksine, Chocolatey paketi bozuldu. Bu nedenle, oyunu kurmanın en iyi yolu, yükleyiciyi siteden indirip çalıştırmaktır.
Oyunun çalışması için VirtualBox'ta 3D hızlandırmayı etkinleştirmeniz gerekecektir. Bilgisayarınızın donanımına bağlı olarak, makinenizin bir VM içinde 3B oyun çalıştırması mümkün olmayabilir. Bu durumda, birkaç seçeneğiniz vardır. Bazıları diğerlerinden daha iyidir:
- VMWare veya Hyper-V gibi başka bir hipervizörü keşfedin.
- Başka bir makineyi özel bir bilgisayar korsanlığı bilgisayarı olarak kullanın ve ev ağınızdan izole edin.
- Daha az gereksinime sahip başka bir hedef oyun bulun ve aşağıdaki laboratuvarların konseptlerini takip edin.
- Sabit sürücünüzü bölümleyin ve çift önyükleme. Kişisel sürücünüzü şifreleseniz bile, kötü amaçlı araçların kişisel verilerinize erişmesi mümkündür.
- Hedefi ve araçları kişisel makinenizde çalıştırın ve kötü amaçlı bir şey olmamasını umuyoruz.
Tanımlama: Bu laboratuvardaki amacımız, diğer oyuncuları duvarlardan görmemizi sağlayan bir hack türü olan bir wallhack oluşturmaktır. Oyunun grafik fonksiyonlarının hiçbirini değiştirmeyeceğiz. Bunun yerine, oyunun oluşturma mantığını kullanacağız ve oyunun hafızasının bölümlerini değiştireceğiz.
Anlatım: 3D oyunlarda, bir öğenin oyuncunun görüş alanında ne zaman görünür olması gerektiğini belirlemek için derinlik testi kullanılır. Örneğin, bir oyuncu bir duvarın arkasındaysa, derinlik testi oyunun oluşturma mantığına oyuncuyu çizmemesini söyleyecektir.
Tüm wallhack'ler derinlik testini devre dışı bırakma prensibine göre çalışır. Bunu yapmanın bir yolu, oyunun grafik kütüphanesini bağlamak ve kütüphane işlevleri aracılığıyla derinlik testini devre dışı bırakmaktır. Bu yaklaşımı bir sonraki laboratuvarda ele alacağız. Bu laboratuvarda, hedefimize ulaşmak için oyunun yerleşik oluşturma mantığına güveneceğiz.
Oyunlar, oyuncular, silahlar ve kapılar gibi harita varlıkları da dahil olmak üzere birçok dinamik nesne çizmek zorundadır. Bu nesneler normalde varlıklar olarak adlandırılır. Geliştirme basitleştirmek ve performansı artırmak için, oyunlar genellikle tüm bu varlıkları çizmek için aynı işlevi kullanır.
Ancak, bu varlıkların genellikle farklı işleme konuları vardır. Bir oyun karakterlerin üzerine gölgeler çizmek isteyebilir, ancak açılabilen kapılar gibi statik varlıklara değil. Oyunlar genellikle her varlık için yapılara sahip olur ve bu işleme hususlarını varlığın yapısında depolar. Varlık oluşturulduğunda, oyun bu üyeyi kontrol edecek ve varlığı ona göre işleyecektir.
Su birikintileri veya cam birikintileri gibi bazı varlıklar için, oyunlar derinlik testini devre dışı bırakmak isteyecektir. Bu nedenle, varlık sınıfındaki render üyesi devre dışı bırakılmış bir derinlik testi değerine sahip olacaktır. Objelerin çiziminden sorumlu fonksiyonu bulabilirsek ve ardından tüm objeleri bu devre dışı bırakılmış derinlik testi değerini içerecek şekilde değiştirebilirsek, oyuncular duvarlardan görünecektir.
Hedef Kurulum: Quake motorunu temel alan tüm oyunların bir konsolu vardır. Bu konsola oyun sırasında tilde (~) tuşuna basılarak erişilebilir. Bu konsol, oynatıcıyı hareket ettirme veya haritayı değiştirme gibi komutları çalıştırmanıza olanak tanır. Bu komutlar genellikle ters eğik çizgi (\) ile başlar ve sekmeye basılarak otomatik olarak tamamlanabilir. Amaçlarımız için bazı yararlı komutlar şunlardır:
Anlatım: 3D oyunlarda, bir öğenin oyuncunun görüş alanında ne zaman görünür olması gerektiğini belirlemek için derinlik testi kullanılır. Örneğin, bir oyuncu bir duvarın arkasındaysa, derinlik testi oyunun oluşturma mantığına oyuncuyu çizmemesini söyleyecektir.
Tüm wallhack'ler derinlik testini devre dışı bırakma prensibine göre çalışır. Bunu yapmanın bir yolu, oyunun grafik kütüphanesini bağlamak ve kütüphane işlevleri aracılığıyla derinlik testini devre dışı bırakmaktır. Bu yaklaşımı bir sonraki laboratuvarda ele alacağız. Bu laboratuvarda, hedefimize ulaşmak için oyunun yerleşik oluşturma mantığına güveneceğiz.
Oyunlar, oyuncular, silahlar ve kapılar gibi harita varlıkları da dahil olmak üzere birçok dinamik nesne çizmek zorundadır. Bu nesneler normalde varlıklar olarak adlandırılır. Geliştirme basitleştirmek ve performansı artırmak için, oyunlar genellikle tüm bu varlıkları çizmek için aynı işlevi kullanır.
Ancak, bu varlıkların genellikle farklı işleme konuları vardır. Bir oyun karakterlerin üzerine gölgeler çizmek isteyebilir, ancak açılabilen kapılar gibi statik varlıklara değil. Oyunlar genellikle her varlık için yapılara sahip olur ve bu işleme hususlarını varlığın yapısında depolar. Varlık oluşturulduğunda, oyun bu üyeyi kontrol edecek ve varlığı ona göre işleyecektir.
Su birikintileri veya cam birikintileri gibi bazı varlıklar için, oyunlar derinlik testini devre dışı bırakmak isteyecektir. Bu nedenle, varlık sınıfındaki render üyesi devre dışı bırakılmış bir derinlik testi değerine sahip olacaktır. Objelerin çiziminden sorumlu fonksiyonu bulabilirsek ve ardından tüm objeleri bu devre dışı bırakılmış derinlik testi değerini içerecek şekilde değiştirebilirsek, oyuncular duvarlardan görünecektir.
Hedef Kurulum: Quake motorunu temel alan tüm oyunların bir konsolu vardır. Bu konsola oyun sırasında tilde (~) tuşuna basılarak erişilebilir. Bu konsol, oynatıcıyı hareket ettirme veya haritayı değiştirme gibi komutları çalıştırmanıza olanak tanır. Bu komutlar genellikle ters eğik çizgi (\) ile başlar ve sekmeye basılarak otomatik olarak tamamlanabilir. Amaçlarımız için bazı yararlı komutlar şunlardır:
- \devmap manastırı - hileler etkinken Abbey haritasını başlatın
- \g_gametype 0 - varsayılan oyun modunu deathmatch olarak ayarlayın
- \bot_enable 1 - botların bir oyuna katılmasını sağlayın
- \reload - geçerli haritayı yeniden başlatın
- \addbot boa 1 - bot ekleme
Bu komutlara ek olarak, Alt + Enter tuşlarına basarak oyunu kolayca pencereli bir moda geçirebiliriz.
Çizim Objelerini Bulma: Bize sunulan komutları keşfederek, \r_ altında birkaç çizim komutu bulabiliriz:
Bizim için en önemli emir r_drawentities. Bu değer 0 olarak ayarlandığında, oyuncumuz da dahil olmak üzere oyunda varlıklar çizilmez:
Oyunun kodunun şöyle göründüğünü varsayabiliriz:
Bu kodu bulmak için, r_drawentities değerini tutan değişkenin adresini bulmak için Cheat Engine'i kullanacağız. Bu değeri daraltmak için konsoldaki r_drawentities değerini 0'dan 1'e değiştirebiliriz. Ardından, bu değere erişen kodu bulmak için x64dbg'de erişimde bir kesme noktası kullanabiliriz. Kesme noktası aşağıdaki kodda açılır:
r_drawentities değerinin ecx'e yüklendiğini ve daha sonra test edildiğini görebiliriz. Bir yazmacın kendisine karşı test edilmesi, o kaydın değerini 0 ile karşılaştırır. Değer 0'a eşitse, oyun . Bu çağrı büyük olasılıkla oyundaki varlıkların çiziminden sorumludur. Bu çağrıyı hayırlayarak bunu doğrulayabiliriz. Nop'd olduğunda, oyun herhangi bir varlık çizmez. 0x52F717
Varlıklar ve İşleme: Çağrının içine girersek , aşağıdaki kodu görürüz: 0x52F717
Vurgulanan ikinci blokta, değerlerin birkaç kayda yüklendiğini ve belirli değerlerle karşılaştırıldığını görebiliriz. Bu değerler eşitse, oyun farklı konumlara atlar ve farklı oluşturma kodu yürütür. Yakından bakarsak, kayıtların ebx'te tutulan adresin değerlerine dayandığını görebiliriz. İlk vurgulanan bloğa bakarsak, ebx'in ayarlandığı en yakın konumu buluruz. Artık biliyoruz ki address , ebx, oluşturulacak mevcut varlığın büyük olasılıkla ne olduğunu içerir. Bu adreste bir kesme noktası belirlersek ve dökümde ebx'in adresini gözlemlersek, bir veri yığını görürüz: 0x52D2FD
Bu veri yığını diğer verilerden izole edildiğinden ve sürekli bir bölümde, bir tür yapıyı temsil ettiğini varsayabiliriz. Örneğin, şöyle bir şey görünebilir:
Yapının hangi konumunun render türünü tuttuğunu belirlemek için bu yapıyı tersine çevirmeliyiz.
Varlık Yapısını Tersine Çevirme: Bir oyunda bilinmeyen bir yapıyı tersine çevirmenin birçok yolu vardır. Bunun bir yolu, geçerli değerlerden oluşan bir veri kümesi oluşturmak ve ardından bu değerlere dayalı çıkarımlar yapmaktır. Örneğin, tüm yapılar sürekli artan bir üye içeriyorsa, bu üyenin bir tür sayaç olarak kullanıldığını varsayabiliriz.
Bu durumda, amacımız varlık yapısını tamamen tersine çevirmek değil, yalnızca oluşturma türü değişkenini bulmak için yeterince ters çevirmektir. Objeleri çizmekten sorumlu kodu bulduğumuzdan, bu kodda bir kesme noktası ayarlayabilir ve varlık yapılarını gözlemleyebiliriz. Son bölümde tartıştığımız gibi, adres , ebx, oluşturulacak geçerli varlığın adresini tutar. 0x52D2FD
Kesme noktamıza her vurulduğunda ebx'in farklı bir değer içerdiğini fark edeceksiniz. Kesme noktasına her vurulduğunda dökümdeki ebx'i manuel olarak takip edebilsek de, x64dbg'nin Watch özelliğini kullanmanın daha uygun bir yoludur. İzleme paneline bir ifade eklemek, onu dökümden bağımsız olarak gözlemlememizi sağlar. Bu durumda, [ebx] ifadesini izleyebilir ve adresin geçerli değerini her zaman ebx cinsinden görüntüleyebiliriz.
İzlenecek bir değer eklemek için İzleme panelini açın (dökümlerin yanında), sağ tıklayın ve Ekle'yi seçin:
Görüntülenen modal içine ifadenizi yazın. Bu durumda, sadece [ebx] ile başlamak istiyoruz:
Varlık yapısının ilk parçasını da gözlemlemek istiyoruz. Şimdilik, tüm bu değerlerin 4 bayt uzunluğunda olduğunu varsayacağız. [ebx+4] ile [ebx+2C] arasındaki saatleri ekleyin. İşiniz bittikten sonra İzleme paneli şöyle görünmelidir:
Tüm bunlar ayarlandıktan sonra, kesme noktanızı devre dışı bırakın ve suyla dolu bir haritaya yükleyin. Harita Manastırı, haritanın sol üst köşesinde bir çeşmeye sahiptir. Suya baktığınızdan ve altındaki zemini görebildiğinizden emin olun.
Tüm bunlar ayarlandıktan sonra, kesme noktanızı yeniden etkinleştirin ve anında açılmalıdır. Saat panelinin değerini gözlemledikten sonra yürütmeye devam edin. Birçok yinelemeyi gözlemledikten sonra, bazı eğilimleri fark etmeye başlamalısınız. 0x52D2FD
[ebx] (kırmızı) değeri her zaman 0 olarak görünür. [ebx+4] (mavi) değeri , , ve . [ebx+8] (beyaz) değeri tutarlı bir şekilde, 'den 'ye vb. artıyor gibi görünüyor. Pembe renkle vurgulanan değerler, görünüşte rastgele değerler ile 0 arasında değişiyor gibi görünür. Benzer şekilde, sarı renkle vurgulanan değerler rastgele görünür, ancak tutarlı bir şekilde [ebx+8] öğesine bağlıdır. 0xD0x400x820x830x790x800x81
Tüm bu veriler ezici olabilir, ancak umursamadığımız değerleri ortadan kaldırarak anlamlandırabiliriz. Ekranda en az üç varlığımız olduğunu biliyoruz: oyuncu modelimiz, silahımız ve su. Muhtemelen kapılar gibi başka varlıklar da olduğunu varsayabiliriz. Bu varlıkların çoğu birçok benzerliği paylaştığından, en az iki varlık arasında nispeten tutarlı veriler aramak istiyoruz. Ancak bazı varlıkların bu değeri paylaşmaması gerektiğini de biliyoruz.
Bu modelle, her zaman 0 olduğu için [ebx] (kırmızı) 'yı ortadan kaldırabiliriz. Ayrıca [ebx+8] (beyaz) öğesini de ortadan kaldırabiliriz, çünkü her varlık için benzersizdir. Hem pembe hem de sarı değerler, her nesne için benzersiz görünür. Bu bizi , , ve . arasında değişen [ebx+4] (mavi) ile bırakır. Şimdilik, bunun bizim oluşturma değerimiz olduğunu tahmin edeceğiz ve her bir değeri araştıracağız. 0xD0x400x820x83
İşleme ve Değerini Değiştirme: Her obje için [ebx+4] değerini ayarlarsak, draw entities işlevinin bir sonraki çağrılışında bunun üzerine yazılır. Varlık başka bir konumdan ebx'e yükleniyor gibi görünüyor. Bu nedenle, varsayılan işleme değerimizi keşfetmemizin en kolay yolu, konumu bağlamak ve her varlık için [ebx+4] ayarlamaktır. Bu kod mağarasını x64dbg'de oluşturabiliriz, ancak birden fazla değeri test etmemizi kolaylaştırmak için kancamızı bir DLL'de oluşturacağız. 0x52D2FD
Kancamız (Hook) şu noktada olacak, çünkü ebx'in o noktada doğru değeri içereceğini biliyoruz. Kancamızın kendisi nispeten basit olacak: kayıtları kaydedeceğiz, [ebx + 4] değerini ayarlayacağız, kayıtları geri yükleyeceğiz ve ardından orijinal mov talimatını uygulayacağız: 0x52D2FD
İlk değerimiz için, en yüksek uçtan başlayalım ve deneyelim: 0x83
DLL enjekte edildikten ve oyuna geri döndüğünüzde, hiçbir şeyin değişmediğini fark edeceksiniz. Aynı şekilde, denerseniz, bazı gölgelerin farklı göründüğünü fark edebilirsiniz, ancak her şey oldukça benzer görünür. Sonra, deneyelim : 0x400xD
Hemen, karakterinizin modelinin artık kameranın önünde şeffaf göründüğünü fark etmelisiniz:
Bu, derinlik testinin devre dışı bırakılmış olabileceğinin iyi bir işaretidir. Ardından, üçüncü şahıs moduna geçin (cg_thirdperson) ve bazı botlar ekleyin. Hareket ettikçe, artık tüm botları duvarlardan görebildiğinizi fark etmelisiniz:
Bununla, derinlik testini devre dışı bırakmak için tüm varlıklar için işleme değerini başarıyla ayarladık. Silahlar ve merdivenler gibi diğer varlıkların da duvarlardan göründüğünü görebiliriz.
Bir iyileştirme, birinci şahıs modunun bozulmaması için oyuncu modelimiz için derinlik testini yeniden etkinleştirmektir. Bunu yapmak için oyuncu yapısını ve mevcut oyuncunuzu tanımlamanız gerekir.
Bu proje için tam kaynak kodu, karşılaştırma için
Çizim Objelerini Bulma: Bize sunulan komutları keşfederek, \r_ altında birkaç çizim komutu bulabiliriz:
Bizim için en önemli emir r_drawentities. Bu değer 0 olarak ayarlandığında, oyuncumuz da dahil olmak üzere oyunda varlıklar çizilmez:
Oyunun kodunun şöyle göründüğünü varsayabiliriz:
C++:
if(r_drawentities == 1) {
draw_entities();
}
Bu kodu bulmak için, r_drawentities değerini tutan değişkenin adresini bulmak için Cheat Engine'i kullanacağız. Bu değeri daraltmak için konsoldaki r_drawentities değerini 0'dan 1'e değiştirebiliriz. Ardından, bu değere erişen kodu bulmak için x64dbg'de erişimde bir kesme noktası kullanabiliriz. Kesme noktası aşağıdaki kodda açılır:
r_drawentities değerinin ecx'e yüklendiğini ve daha sonra test edildiğini görebiliriz. Bir yazmacın kendisine karşı test edilmesi, o kaydın değerini 0 ile karşılaştırır. Değer 0'a eşitse, oyun . Bu çağrı büyük olasılıkla oyundaki varlıkların çiziminden sorumludur. Bu çağrıyı hayırlayarak bunu doğrulayabiliriz. Nop'd olduğunda, oyun herhangi bir varlık çizmez. 0x52F717
Varlıklar ve İşleme: Çağrının içine girersek , aşağıdaki kodu görürüz: 0x52F717
Vurgulanan ikinci blokta, değerlerin birkaç kayda yüklendiğini ve belirli değerlerle karşılaştırıldığını görebiliriz. Bu değerler eşitse, oyun farklı konumlara atlar ve farklı oluşturma kodu yürütür. Yakından bakarsak, kayıtların ebx'te tutulan adresin değerlerine dayandığını görebiliriz. İlk vurgulanan bloğa bakarsak, ebx'in ayarlandığı en yakın konumu buluruz. Artık biliyoruz ki address , ebx, oluşturulacak mevcut varlığın büyük olasılıkla ne olduğunu içerir. Bu adreste bir kesme noktası belirlersek ve dökümde ebx'in adresini gözlemlersek, bir veri yığını görürüz: 0x52D2FD
Bu veri yığını diğer verilerden izole edildiğinden ve sürekli bir bölümde, bir tür yapıyı temsil ettiğini varsayabiliriz. Örneğin, şöyle bir şey görünebilir:
C++:
struct entity {
int type;
int render_type;
float location[3];
...
}
Yapının hangi konumunun render türünü tuttuğunu belirlemek için bu yapıyı tersine çevirmeliyiz.
Varlık Yapısını Tersine Çevirme: Bir oyunda bilinmeyen bir yapıyı tersine çevirmenin birçok yolu vardır. Bunun bir yolu, geçerli değerlerden oluşan bir veri kümesi oluşturmak ve ardından bu değerlere dayalı çıkarımlar yapmaktır. Örneğin, tüm yapılar sürekli artan bir üye içeriyorsa, bu üyenin bir tür sayaç olarak kullanıldığını varsayabiliriz.
Bu durumda, amacımız varlık yapısını tamamen tersine çevirmek değil, yalnızca oluşturma türü değişkenini bulmak için yeterince ters çevirmektir. Objeleri çizmekten sorumlu kodu bulduğumuzdan, bu kodda bir kesme noktası ayarlayabilir ve varlık yapılarını gözlemleyebiliriz. Son bölümde tartıştığımız gibi, adres , ebx, oluşturulacak geçerli varlığın adresini tutar. 0x52D2FD
Kesme noktamıza her vurulduğunda ebx'in farklı bir değer içerdiğini fark edeceksiniz. Kesme noktasına her vurulduğunda dökümdeki ebx'i manuel olarak takip edebilsek de, x64dbg'nin Watch özelliğini kullanmanın daha uygun bir yoludur. İzleme paneline bir ifade eklemek, onu dökümden bağımsız olarak gözlemlememizi sağlar. Bu durumda, [ebx] ifadesini izleyebilir ve adresin geçerli değerini her zaman ebx cinsinden görüntüleyebiliriz.
İzlenecek bir değer eklemek için İzleme panelini açın (dökümlerin yanında), sağ tıklayın ve Ekle'yi seçin:
Görüntülenen modal içine ifadenizi yazın. Bu durumda, sadece [ebx] ile başlamak istiyoruz:
Varlık yapısının ilk parçasını da gözlemlemek istiyoruz. Şimdilik, tüm bu değerlerin 4 bayt uzunluğunda olduğunu varsayacağız. [ebx+4] ile [ebx+2C] arasındaki saatleri ekleyin. İşiniz bittikten sonra İzleme paneli şöyle görünmelidir:
Tüm bunlar ayarlandıktan sonra, kesme noktanızı devre dışı bırakın ve suyla dolu bir haritaya yükleyin. Harita Manastırı, haritanın sol üst köşesinde bir çeşmeye sahiptir. Suya baktığınızdan ve altındaki zemini görebildiğinizden emin olun.
Tüm bunlar ayarlandıktan sonra, kesme noktanızı yeniden etkinleştirin ve anında açılmalıdır. Saat panelinin değerini gözlemledikten sonra yürütmeye devam edin. Birçok yinelemeyi gözlemledikten sonra, bazı eğilimleri fark etmeye başlamalısınız. 0x52D2FD
[ebx] (kırmızı) değeri her zaman 0 olarak görünür. [ebx+4] (mavi) değeri , , ve . [ebx+8] (beyaz) değeri tutarlı bir şekilde, 'den 'ye vb. artıyor gibi görünüyor. Pembe renkle vurgulanan değerler, görünüşte rastgele değerler ile 0 arasında değişiyor gibi görünür. Benzer şekilde, sarı renkle vurgulanan değerler rastgele görünür, ancak tutarlı bir şekilde [ebx+8] öğesine bağlıdır. 0xD0x400x820x830x790x800x81
Tüm bu veriler ezici olabilir, ancak umursamadığımız değerleri ortadan kaldırarak anlamlandırabiliriz. Ekranda en az üç varlığımız olduğunu biliyoruz: oyuncu modelimiz, silahımız ve su. Muhtemelen kapılar gibi başka varlıklar da olduğunu varsayabiliriz. Bu varlıkların çoğu birçok benzerliği paylaştığından, en az iki varlık arasında nispeten tutarlı veriler aramak istiyoruz. Ancak bazı varlıkların bu değeri paylaşmaması gerektiğini de biliyoruz.
Bu modelle, her zaman 0 olduğu için [ebx] (kırmızı) 'yı ortadan kaldırabiliriz. Ayrıca [ebx+8] (beyaz) öğesini de ortadan kaldırabiliriz, çünkü her varlık için benzersizdir. Hem pembe hem de sarı değerler, her nesne için benzersiz görünür. Bu bizi , , ve . arasında değişen [ebx+4] (mavi) ile bırakır. Şimdilik, bunun bizim oluşturma değerimiz olduğunu tahmin edeceğiz ve her bir değeri araştıracağız. 0xD0x400x820x83
İşleme ve Değerini Değiştirme: Her obje için [ebx+4] değerini ayarlarsak, draw entities işlevinin bir sonraki çağrılışında bunun üzerine yazılır. Varlık başka bir konumdan ebx'e yükleniyor gibi görünüyor. Bu nedenle, varsayılan işleme değerimizi keşfetmemizin en kolay yolu, konumu bağlamak ve her varlık için [ebx+4] ayarlamaktır. Bu kod mağarasını x64dbg'de oluşturabiliriz, ancak birden fazla değeri test etmemizi kolaylaştırmak için kancamızı bir DLL'de oluşturacağız. 0x52D2FD
Kancamız (Hook) şu noktada olacak, çünkü ebx'in o noktada doğru değeri içereceğini biliyoruz. Kancamızın kendisi nispeten basit olacak: kayıtları kaydedeceğiz, [ebx + 4] değerini ayarlayacağız, kayıtları geri yükleyeceğiz ve ardından orijinal mov talimatını uygulayacağız: 0x52D2FD
C++:
DWORD ret_address = 0x0052D303;
__declspec(naked) void codecave() {
__asm {
pushad
mov dword ptr ds:[ebx+4], ???
popad
mov dword ptr ds:[0x102AE98], ebx
jmp ret_address
}
}
İlk değerimiz için, en yüksek uçtan başlayalım ve deneyelim: 0x83
C++:
mov dword ptr ds:[ebx+4], 0x83
DLL enjekte edildikten ve oyuna geri döndüğünüzde, hiçbir şeyin değişmediğini fark edeceksiniz. Aynı şekilde, denerseniz, bazı gölgelerin farklı göründüğünü fark edebilirsiniz, ancak her şey oldukça benzer görünür. Sonra, deneyelim : 0x400xD
C++:
mov dword ptr ds:[ebx+4], 0xD
Hemen, karakterinizin modelinin artık kameranın önünde şeffaf göründüğünü fark etmelisiniz:
Bu, derinlik testinin devre dışı bırakılmış olabileceğinin iyi bir işaretidir. Ardından, üçüncü şahıs moduna geçin (cg_thirdperson) ve bazı botlar ekleyin. Hareket ettikçe, artık tüm botları duvarlardan görebildiğinizi fark etmelisiniz:
Bununla, derinlik testini devre dışı bırakmak için tüm varlıklar için işleme değerini başarıyla ayarladık. Silahlar ve merdivenler gibi diğer varlıkların da duvarlardan göründüğünü görebiliriz.
Bir iyileştirme, birinci şahıs modunun bozulmaması için oyuncu modelimiz için derinlik testini yeniden etkinleştirmektir. Bunu yapmak için oyuncu yapısını ve mevcut oyuncunuzu tanımlamanız gerekir.
Bu proje için tam kaynak kodu, karşılaştırma için
Bağlantıları görmek için lütfen
Giriş Yap
mevcuttur.