KERNERL -> USER Mode İletişim Sistemi [Memory Read & Write] İşlemleri DETAYLI ANLATIM

Hexist

Gold Üye
Katılım
9 Kas 2024
Mesajlar
175
Beğeniler
80
Forumda bir süredir geziniyorum fakat pek fazla yazılımla ilgili sohbete denk gelemedim sohbeti işim ve uzmanlığım olan c++ ve Kernel işlemleri alanında ben başlatıyorum , terimlere çoğunuzun hakim olduğunu ama ne işe yaradığını bilmediğinizi varsayıyorum , nedir bu kernel ? hile yapımında rolü ne ? memory read write neden bu kadar önemli ? memory işlemleri kernelda nasıl yapılır gibi sorulara bu konudan sonra cevap bulacaksınız elimden geldiğince spesifik ve açıklayıcı olacağımı düşünüyorum ,

Öncelikle Kernel'in hile yapımında ki rolünden bahsedelim ; yaklaşık 15 yıl öncesinde anti cheatler user mode çalışan uygulamaları memoryde yakalayamıyordu bu yüzden winAPI'ları ile rahatlıkla memory de okuma ve yazma işlemi yapabiliyorduk . anti cheatler 64 bit sisteme geçtiler ve user mode çalışmaktan çıktılar kernel modda işlem yaptıkları için artık kullandığımız winAPI'ları hayal oldu tabi 7-8 yıl öncesine kadar hala çalışan yöntemler vardı fakat şu an güncel olarak en dandik sayılabilecek bir anti cheatte bile salt bir şekilde winAPI'ları ile memory de işlem yapmak pek mümkün değil. Bu işlemleri bir görselle anlatmak gerekirse :


Dikkat etmeniz gereken bir kaç detay mevcut örneğin kernel çalışan bir uygulamanın yetki sınırı yoktur haliyle değiştirmek istediğiniz yada müdehale ettiğiniz yanlış bir bellek adresi doğrudan sistemde hataya yol açar ve büyük ihtimalle yıllardan beri mavi ekran dediğimiz hata ile karşılaşırız fakat kullanıcı modunda böyle bir durum söz konusu değildir çünkü kullanıcı modunda tüm erişim kısıtlıdır sistemi etkileyecek bir hata doğal olarak ortaya çıkamaz.

Oyun hileleri yapımının temel taşı oyunun hafızasından bellek adresini okuyup bu bellek adreslerini işlemeye dayanır ÖRNEK VERMEK GEREKİRSE:
C++:
    //mov eax, [KnightOnLine.exe + B58F70]
   

    int x = read_memory<int>(ko_ptr_chr + 0xEC); // mov ecx, [eax + 000000EC]
 
    int y = read_memory<int>(ko_ptr_chr + 0xF4); // mov edx, [eax + 000000F0]

    int z = read_memory<int>(ko_ptr_chr + 0xF0); //mov ecx, [eax + 000000F4]

    int playerhp = read_memory<int>(ko_ptr_chr + 0x740); // mov eax, [eax + 00000740]

bu hafta içi başlatığım bir projeden yazdığım kodlar üzerinden örnek verebilirim gördüğünüz gibi oyunun çalıştığı esnada belli bellek bölgelerinde ki bilgileri okuma ihtiyacı duymuşuz şimdi bunu yazarken farkettim bu kodları kullanmamıştım sanırım read_memory<float> olarak okumam gerekiyor :D bunlar büyük ihtimalle karakterin x,y,z koordinat adresi neyse yazarken farkettiğimiz iyi oldu kodun c++ kısmı ; int x = read_memory<int>(ko_ptr_chr + 0xEC &&&&&& oyun çalıştığı sırada bellekte dönen ASM işlemleri "mov ecx, [eax + 000000EC]"

aslında bu bilgisayarın temel çalışma mantığıdır sadece oyunlar ile bunu sınırlandırmak pek doğru olmaz , kernel ile user modun farklılığını ele alırsak bir winAPI ile oyunun belleğinden bir adresi okumak yada yazmak için sadece oyunun belliğine etki edebiliriz fakat oyunun belleğinde bilgiler aynı zamanda çekirdekte kernel tarafında da saklanır işte anti cheatleri atlattığımız yer tam olarak burası; oyun ile hiçbir iletişime girmeden doğrudan kernel kodlarımız ile çekirdekte saklanan bellek adresini okuyabiliriz. Görsel olarak anlatmak gerekirse :


temel olarak mantığı biraz anladığınızı düşünüyorum çizimlerimin kusuruna bakmayın elimden geldiğince açıklayıcı olmaya çalıştım . İlgili arkadaşlar için işin kod kısmına geçelim ;
C++:
    constexpr ULONG read =
        CTL_CODE(FILE_DEVICE_UNKNOWN, 0x697, METHOD_BUFFERED, FILE_SPECIAL_ACCESS);

    constexpr ULONG write =
        CTL_CODE(FILE_DEVICE_UNKNOWN, 0x698, METHOD_BUFFERED, FILE_SPECIAL_ACCESS);
}

bunlar sürücüye gönderilecek IOCTL kodlarıdır yazılımda IOCTL iletişim sistemi olarak geçer. Benim 0x697 olarak aldığım bellek adresi benzersiz olmalıdır normalde 0x800 ün altında ki adreslerde windowsun temel işlemleri yapılır ben IOCTL gizliliği açısından 0x697 de bir boşluk bulup onu kullanmıştım kodları 2017-2018 civarı yazdığım için pek hatırlamıyorum ama 0x800 üstü adresler bana göre her zaman risk altındadır aynı işlevi görür mü görür tabiki .
METHOD_BUFFERED user mode - kernel mode arasında veri akışı sağlanırken en çok kullanılan yöntemlerden biridir daha detaylı açıklaması için microsofta bakabilirsiniz daha yeni bu konu ile ilgili güzel bir makale yayınladılar bu konuya uzun uzadıya en azından bu postta girmeyeceğim.

FILE_SPECIAL_ACCESS özel erişim izni gerektiği durumlarda kullanırız en azından ben bunu kullanıyorum eminim FILE_ANY_ACCESS tercih edenlerde vardır konunun altına gelip boş boş yanlız orası öyle değil böyle olacak yazmayın ikisi de aynı işlevi görür %95 oranında.

burada kullanıcı tarafında çok basit ve kısa bir kod örneği gösterdim bu konuda daha fazla bu tarafta durmayacağım eğer ilgili arkadaşlar olursa 2. konuyu da açarız orada memory read ve write işleminin sürücü ile kullanıcı arasında ki verileri nasıl aldığını ve hangi metodlarla işlediğini anlatırız. Bende burada boşu boşuna tek başıma bu kadar yazıyı yazmamış olurum iyi forumlar , iyi geceler, Sormak istediklerinizi konunun altında belirtirseniz kafanızda hiç soru işareti kalmayacak şekilde bilgim dahilinde seve seve cevaplayabilirim.
 
Son düzenleme:
Forumda bir süredir geziniyorum fakat pek fazla yazılımla ilgili sohbete denk gelemedim sohbeti işim ve uzmanlığım olan c++ ve Kernel işlemleri alanında ben başlatıyorum , terimlere çoğunuzun hakim olduğunu ama ne işe yaradığını bilmediğinizi varsayıyorum , nedir bu kernel ? hile yapımında rolü ne ? memory read write neden bu kadar önemli ? memory işlemleri kernelda nasıl yapılır gibi sorulara bu konudan sonra cevap bulacaksınız elimden geldiğince spesifik ve açıklayıcı olacağımı düşünüyorum ,

Öncelikle Kernel'in hile yapımında ki rolünden bahsedelim ; yaklaşık 15 yıl öncesinde anti cheatler user mode çalışan uygulamaları memoryde yakalayamıyordu bu yüzden winAPI'ları ile rahatlıkla memory de okuma ve yazma işlemi yapabiliyorduk . anti cheatler 64 bit sisteme geçtiler ve user mode çalışmaktan çıktılar kernel modda işlem yaptıkları için artık kullandığımız winAPI'ları hayal oldu tabi 7-8 yıl öncesine kadar hala çalışan yöntemler vardı fakat şu an güncel olarak en dandik sayılabilecek bir anti cheatte bile salt bir şekilde winAPI'ları ile memory de işlem yapmak pek mümkün değil. Bu işlemleri bir görselle anlatmak gerekirse :


Dikkat etmeniz gereken bir kaç detay mevcut örneğin kernel çalışan bir uygulamanın yetki sınırı yoktur haliyle değiştirmek istediğiniz yada müdehale ettiğiniz yanlış bir bellek adresi doğrudan sistemde hataya yol açar ve büyük ihtimalle yıllardan beri mavi ekran dediğimiz hata ile karşılaşırız fakat kullanıcı modunda böyle bir durum söz konusu değildir çünkü kullanıcı modunda tüm erişim kısıtlıdır sistemi etkileyecek bir hata doğal olarak ortaya çıkamaz.

Oyun hileleri yapımının temel taşı oyunun hafızasından bellek adresini okuyup bu bellek adreslerini işlemeye dayanır ÖRNEK VERMEK GEREKİRSE:
C++:
    //mov eax, [KnightOnLine.exe + B58F70]
  

    int x = read_memory<int>(ko_ptr_chr + 0xEC); // mov ecx, [eax + 000000EC]
 
    int y = read_memory<int>(ko_ptr_chr + 0xF4); // mov edx, [eax + 000000F0]

    int z = read_memory<int>(ko_ptr_chr + 0xF0); //mov ecx, [eax + 000000F4]

    int playerhp = read_memory<int>(ko_ptr_chr + 0x740); // mov eax, [eax + 00000740]

bu hafta içi başlatığım bir projeden yazdığım kodlar üzerinden örnek verebilirim gördüğünüz gibi oyunun çalıştığı esnada belli bellek bölgelerinde ki bilgileri okuma ihtiyacı duymuşuz şimdi bunu yazarken farkettim bu kodları kullanmamıştım sanırım read_memory<float> olarak okumam gerekiyor :D bunlar büyük ihtimalle karakterin x,y,z koordinat adresi neyse yazarken farkettiğimiz iyi oldu kodun c++ kısmı ; int x = read_memory<int>(ko_ptr_chr + 0xEC &&&&&& oyun çalıştığı sırada bellekte dönen ASM işlemleri "mov ecx, [eax + 000000EC]"

aslında bu bilgisayarın temel çalışma mantığıdır sadece oyunlar ile bunu sınırlandırmak pek doğru olmaz , kernel ile user modun farklılığını ele alırsak bir winAPI ile oyunun belleğinden bir adresi okumak yada yazmak için sadece oyunun belliğine etki edebiliriz fakat oyunun belleğinde bilgiler aynı zamanda çekirdekte kernel tarafında da saklanır işte anti cheatleri atlattığımız yer tam olarak burası; oyun ile hiçbir iletişime girmeden doğrudan kernel kodlarımız ile çekirdekte saklanan bellek adresini okuyabiliriz. Görsel olarak anlatmak gerekirse :


temel olarak mantığı biraz anladığınızı düşünüyorum çizimlerimin kusuruna bakmayın elimden geldiğince açıklayıcı olmaya çalıştım . İlgili arkadaşlar için işin kod kısmına geçelim ;
C++:
    constexpr ULONG read =
        CTL_CODE(FILE_DEVICE_UNKNOWN, 0x697, METHOD_BUFFERED, FILE_SPECIAL_ACCESS);

    constexpr ULONG write =
        CTL_CODE(FILE_DEVICE_UNKNOWN, 0x698, METHOD_BUFFERED, FILE_SPECIAL_ACCESS);
}

bunlar sürücüye gönderilecek IOCTL kodlarıdır yazılımda IOCTL iletişim sistemi olarak geçer. Benim 0x697 olarak aldığım bellek adresi benzersiz olmalıdır normalde 0x800 ün altında ki adreslerde windowsun temel işlemleri yapılır ben IOCTL gizliliği açısından 0x697 de bir boşluk bulup onu kullanmıştım kodları 2017-2018 civarı yazdığım için pek hatırlamıyorum ama 0x800 üstü adresler bana göre her zaman risk altındadır aynı işlevi görür mü görür tabiki .
METHOD_BUFFERED user mode - kernel mode arasında veri akışı sağlanırken en çok kullanılan yöntemlerden biridir daha detaylı açıklaması için microsofta bakabilirsiniz daha yeni bu konu ile ilgili güzel bir makale yayınladılar bu konuya uzun uzadıya en azından bu postta girmeyeceğim.

FILE_SPECIAL_ACCESS özel erişim izni gerektiği durumlarda kullanırız en azından ben bunu kullanıyorum eminim FILE_ANY_ACCESS tercih edenlerde vardır konunun altına gelip boş boş yanlız orası öyle değil böyle olacak yazmayın ikisi de aynı işlevi görür %95 oranında.

burada kullanıcı tarafında çok basit ve kısa bir kod örneği gösterdim bu konuda daha fazla bu tarafta durmayacağım eğer ilgili arkadaşlar olursa 2. konuyu da açarız orada memory read ve write işleminin sürücü ile kullanıcı arasında ki verileri nasıl aldığını ve hangi metodlarla işlediğini anlatırız. Bende burada boşu boşuna tek başıma bu kadar yazıyı yazmamış olurum iyi forumlar , iyi geceler, Sormak istediklerinizi konunun altında belirtirseniz kafanızda hiç soru işareti kalmayacak şekilde bilgim dahilinde seve seve cevaplayabilirim.
Gayet Güzel ve Açıklayıcı Bir Anlatım Olmuş Teşekkürler..
 
Güzel konu fakat cok fazla yuzeysel olmus. Kernel AC lerin hangi yontemleri kullanarak Usermode da WinAPI ile yapilan read/write islemlerini engelledigini anlatsaydin guzel olurdu mesela. Ve konuda bahsi gecen kernel read/write isleminin nasil yapildigi hakkinda birseyler anlatsaydin keske
 
Son düzenleme:
Kanka biraz yüzeysel olmuş ama konuya devam etmeni ve daha derine girmeni isterim açıkcası part2 için #rez :D
 
Güzel konu fakat cok fazla yuzeysel olmus. Kernel AC lerin hangi yontemleri kullanarak Usermode da WinAPI ile yapilan read/write islemlerini anlatsaydin guzel olurdu mesela. Ve konuda bahsi gecen kernel read/write isleminin nasil yapildigi hakkinda birseyler anlatsaydin keske
konuda yüzeysel olarak değindiğim read write işlemlerinin arkasında kalabalık bir kernel sürücü kodlaması ve sürücüden aldığı bilgiyi işleyebilecek şekilde kodlanmış bir user mode uygulaması gerekiyor bunu tek bir konuya sığdırmak çok olanaklar dahilinde ve mantıklı değil , bana göre bir şeyin yapılmış halini görmekten çok nasıl çalıştığını anlamak daha değerli konunun temel amacı kernelin çalışma mantığını anlatabilmekti , ilgisini çeken arkadaşlar olursa ilerleyen konularımda tabi ki söylediklerine değineceğiz.

Kanka biraz yüzeysel olmuş ama konuya devam etmeni ve daha derine girmeni isterim açıkcası part2 için #rez :D
geçen ay metin2 ile çok uğraştım :D ıttırı vızzık anti cheatli pvp serverlar gerçekten basit part2 değil ama belki part3-4 te senin botu uriele uyarlarız.
 
Eline sağlık hocam fazlasıyla faydalı meraklıları için
 

  Şuanda konuyu görüntüleyen kullanıcılar


Üst Alt