Hexist
Gold Üye
- Katılım
- 9 Kas 2024
- Mesajlar
- 173
- Beğeniler
- 80
Merhaba forum sakinleri ve yazılıma meraklı kardeşlerim , bazılarınızın ilgisini çeken ilk konumda kernel mode ve user mode nedir ne değildir ne işe yarar gibi yüzeysel ve tadında bir detaylı anlatım yapmıştım birinci konuyu okumak isteyen arkadaşlar için bkz : kernel-user mode konu 1. İlgisini çeken olursa bu konuyu anlatmaya devam edeceğimi söylemiştim bir süredir mobil programlama ile uğraşıyorum ilk defa vakit buldum ve aklıma bu konunun devamını yazmak geldi aynı zamanda da kendi kernel bilgilerimi tazelemek istedim , bilgim dahilinde dilim döndüğünce bu konuda kernel modda çalışan hilelerin nasıl ve hangi mantık çerçevesinde çalıştığını anlatmaya çalışacağım.
Anlatımda Hedeflediklerimiz ; Kernel çalışan hileler neden kernel çalışır ? , Hilelerin kernel sistemlerde memory işlemleri nasıl yapılır ?
Başlamadan önce üstüne basarak belirtmek isterim ki KERNEL VE PROGRAMLAMA ÇOK GENİŞ VE DERİN BİR KONUDUR O YÜZDEN HER ŞEYİ EN İNCE AYRINTISINA KADAR ANLATAMAM HER KONUYA DEĞİNEMEM BOŞ BELEŞ YORUM YAPMAK İÇİN YORUM YAPAN 18 YAŞINDA SAKALSIZ KARDEŞLERİMİ UYARIYORUM.
Öncelikle 1. konuyu okuduğunuzu baz alarak bu konuyu başlatıyorum ; Kernel ile ilgili bilmemiz gereken en önemli sistemlerden biri de IOCTL'dir. Yazdığımız kernel sürücüsü ile yine bizim yazacağımız memory hack uygulamamızın arasında ki iletişimi sağlamak için IOCTL denen arkadaşı kullanırız peki IOCTL nedir? ; Kod örneği vererek inceleyebiliriz bir projemden aldığım kodları paylaşıyorum :
Oyun hilesi yapmak amacı ile kernel kullanıyorsanız kesinlikle yapmanız kereken ilk şey projenizi 2 alana bölmektir bunlar KERNEL MODE PROJECT(KMP) - USER MODE PROJECT(UMP) olmak zorunda KMP ve UMP olarak kısaltıyorum ben şahsen. Temel amacımız yazdığımız kernel driver yani KMP'nin yine kendi yazdığımız UMP projemiz ile (bu proje bizim hilemizin çalıştığı proje olacak) sorunsuz bir şekilde iletişime geçmesini sağlamak .
Yıllanmış bir projedir kernel ve game hacking ile ilgilenen arkadaşların mutlaka bu kodlara aşina olduğunu düşünüyorum;
"constexpr ULONG attach =" tanımladığım işlem hedef uygulamaya inject olmamı sağlıyor
"constexpr ULONG read =" tanımı ise hedef uygulamanın belleğinden veri okumamı sağlayacak birazdan detayına gireceğim .
"constexpr ULONG write =" İnject olduğumuz uygulamanın belleğine yazma işlemi yapacağımız kısım.
bu tanımların #define olarak tanımlandığınıda görebilirsiniz , ben kullanım amacım açısından const. olarak tanımladım tecrübeniz arttıkça tanımları da daha esnek ve işe yarar şekilde kullanmayı öğreneceksiniz.
Peki bunlar nedir nasıl kullanırız kısmına geçelim bu anlatım konusunda doğrudan bir proje vermek yerine, nasıl kullanacağınızı ve ne anlama geldiğini öğrenmenizi isterim .
UMP tarafından hedef uygulamanın belleğinden veri okuyabileceğimiz c++ kodum ;
kodu detaylı bir şekilde açıklayacağım bu açıklama 2 Parta bölünecek ; 1.Part = UMP de yazdığımız read memory fonksiyonunun çalışma prensibi ve işleyişi , 2. Part = read_memory fonksiyonumuzun kernel driverimiz ile nasıl iletişime geçtiği.
Konuyu çok uzun tutmamak adına burada sonlandırıyorum yüzeysel olarak değinmek istediklerime değindim , diğer konu yukarıda bahsini geçirdiğim hususla ilgili olacak ve biraz daha derinlere ineceğiz şimdilik bu kadar diyelim herkese iyi forumlar .
Anlatımda Hedeflediklerimiz ; Kernel çalışan hileler neden kernel çalışır ? , Hilelerin kernel sistemlerde memory işlemleri nasıl yapılır ?
Başlamadan önce üstüne basarak belirtmek isterim ki KERNEL VE PROGRAMLAMA ÇOK GENİŞ VE DERİN BİR KONUDUR O YÜZDEN HER ŞEYİ EN İNCE AYRINTISINA KADAR ANLATAMAM HER KONUYA DEĞİNEMEM BOŞ BELEŞ YORUM YAPMAK İÇİN YORUM YAPAN 18 YAŞINDA SAKALSIZ KARDEŞLERİMİ UYARIYORUM.
Öncelikle 1. konuyu okuduğunuzu baz alarak bu konuyu başlatıyorum ; Kernel ile ilgili bilmemiz gereken en önemli sistemlerden biri de IOCTL'dir. Yazdığımız kernel sürücüsü ile yine bizim yazacağımız memory hack uygulamamızın arasında ki iletişimi sağlamak için IOCTL denen arkadaşı kullanırız peki IOCTL nedir? ; Kod örneği vererek inceleyebiliriz bir projemden aldığım kodları paylaşıyorum :
Oyun hilesi yapmak amacı ile kernel kullanıyorsanız kesinlikle yapmanız kereken ilk şey projenizi 2 alana bölmektir bunlar KERNEL MODE PROJECT(KMP) - USER MODE PROJECT(UMP) olmak zorunda KMP ve UMP olarak kısaltıyorum ben şahsen. Temel amacımız yazdığımız kernel driver yani KMP'nin yine kendi yazdığımız UMP projemiz ile (bu proje bizim hilemizin çalıştığı proje olacak) sorunsuz bir şekilde iletişime geçmesini sağlamak .
Kod:
namespace driver_codes { //D.Codes UMP
constexpr ULONG attach =
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x696, METHOD_BUFFERED, FILE_SPECIAL_ACCESS);
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);
}
Yıllanmış bir projedir kernel ve game hacking ile ilgilenen arkadaşların mutlaka bu kodlara aşina olduğunu düşünüyorum;
"constexpr ULONG attach =" tanımladığım işlem hedef uygulamaya inject olmamı sağlıyor
"constexpr ULONG read =" tanımı ise hedef uygulamanın belleğinden veri okumamı sağlayacak birazdan detayına gireceğim .
"constexpr ULONG write =" İnject olduğumuz uygulamanın belleğine yazma işlemi yapacağımız kısım.
bu tanımların #define olarak tanımlandığınıda görebilirsiniz , ben kullanım amacım açısından const. olarak tanımladım tecrübeniz arttıkça tanımları da daha esnek ve işe yarar şekilde kullanmayı öğreneceksiniz.
Peki bunlar nedir nasıl kullanırız kısmına geçelim bu anlatım konusunda doğrudan bir proje vermek yerine, nasıl kullanacağınızı ve ne anlama geldiğini öğrenmenizi isterim .
UMP tarafından hedef uygulamanın belleğinden veri okuyabileceğimiz c++ kodum ;
C++:
template <class T>
T read_memory(const std::uintptr_t addr) {
T temp = {};
Request request;
request.target = reinterpret_cast<PVOID>(addr);
request.buffer = &temp;
request.size = sizeof(T);
DeviceIoControl(driver, driver_codes::read, &request, sizeof(request),
&request, sizeof(request), nullptr, nullptr);
return temp;
}
kodu detaylı bir şekilde açıklayacağım bu açıklama 2 Parta bölünecek ; 1.Part = UMP de yazdığımız read memory fonksiyonunun çalışma prensibi ve işleyişi , 2. Part = read_memory fonksiyonumuzun kernel driverimiz ile nasıl iletişime geçtiği.
Konuyu çok uzun tutmamak adına burada sonlandırıyorum yüzeysel olarak değinmek istediklerime değindim , diğer konu yukarıda bahsini geçirdiğim hususla ilgili olacak ve biraz daha derinlere ineceğiz şimdilik bu kadar diyelim herkese iyi forumlar .