KERNEL - [Valorant Wall Hack - Read Memory] ANLATIM - 3

Hexist

Gold Üye
Katılım
9 Kas 2024
Mesajlar
174
Beğeniler
80
Kernel ile ilgili 1. ve 2. konumda gerek yüzeysel gerek detaylı bir anlatım yaptıktan sonra işlerin biraz daha içine girip karıştığı noktaya gelebiliriz diye düşünüyorum ve read memory fonksiyonunun kernel modda nasıl çalıştığını bu konuda anlatacağım. Öncelikle konuya uzak olanlar 1. ve 2. konuyu okumadan bu anlatımdan kesinlikle bir şey anlamayacaktır bunu belirtmekte fayda var.

3. Konuya geldiğim için artık yüzeysel olarak kernel nedir user mode nedir gibi şeyleri anlatmıyorum yeterince bunlar hakkında konuştuk doğruca bizi ilgilendiren kodu inceleyerek başlayabiliriz

Read MEM. Kodumuz:
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;
}

benim projelerimde kullandığım read memory fonksiyonumdur , tüm projelerde bu fonksiyon geçerlidir ve kullanılır fonksiyonun yapısı ile oynanabilir fakat içeriği ve işleyişi asla değişmez .

//Request request; anlaşılacağı üzere bu bir isteğin başlangıcıdır .

// request.target = okunacak bellek adresini işaret ediyoruz . Basit bir wall hack yapacağımızı farz edelim, birazdan tekrardan buraya döneceğim.

// request.buffer = &temp; = .target olarak okuduğumuz bellek adresinin saklandığı ve kullanıcıya iletildiği blok.

//request.size = sizeof(T); okunacak bellek adresinde ki verinin byte uzunluğu.

C++:
DeviceIoControl(driver, driver_codes::read, &request, sizeof(request),

        &request, sizeof(request), nullptr, nullptr);
işin kernel tarafına girdiğimiz de bu kısımları daha detaylandıracağım.
yukarıda genel olarak fonksiyonun hangi kodu neden kullandığına değindik işin kernel kısmına baktığımızda bunların hepsine tek tek ve detaylı tekrardan gireceğim kafa karışıklığını önlemek için sadece temelde nasıl bir işleyiş
olduğunu anlamanız şimdilik yeterli diye düşünüyorum.
Read memory main fonksiyon içerisinde örnek bir kullanım yapalım :
C++:
    // okudumak istediğimiz bellek adresi
    std::uintptr_t targetAddress = 0xFFFF40;

    // int türünde bir veri okuduğumuzu belirttik.
    int value = read_memory<int>(targetAddress);

    std::cout << "read mem: " << value
oluşturduğumuz read memory fonksiyonunu kullanarak bir bellek adresinden int türünde bir veriyi okuyabiliyoruz.

Valorant ile çok fazla ilgilenen arkadaş olduğunu bildiğim için basitçe bir wall hack mantığını da anlatmak isterim ;

Oyun içerisinde kendi karakterinizin ve oyunda ki tüm karakterlerin mobların npc lerin bellekte tutulduğu bölgeler vardır ve belli bellek adreslerinde bu karakterlerin kordinatları tutulur .
Genel olarak oyunun haritasını 2 veya 3 boyutlu bir düzlem olarak kabul edebilirsiniz , sizin karakterinizin bulunduğu konum bellekte belli bir offsette her zaman kayıtlıdır ve hareket ettikçe bu offsette ki değer değişir,
değişen değer sunucuya gönderilir ve sunucuda ki değer ile karşılaştırılır . Aslında karakterinizin oyunda ki konumu sunucuda tutulur diyebiliriz şayet sunucu da değil de oynadığınız clientte tutulsaydı valorantta şu an istediğimiz an
istediğimiz yere ışınlanabiliyor olurduk.
Örnek vermek gerekirse

C++:
struct Player {
    int hp;         // 0xFFF40
    int armor;      // 0xFFF44
    int ammo;          // 0xFFF48
    float x, y, z;     // 0xFFF4C - 0xFFF54
};

Yukarıda kendimize bir player structı oluşturduk ve içerisinde tuttuğu değişkenleri tanımladık tüm oyunların kodlamasında bu vardır olmak zorundadır , oyun bu veriyi mutlaka bir yerde saklamak & okumak ve kullanmak zorundadır.

Wall hack dediğimiz olay ise rakibin " float x, y, z; // 0xFFF4C - 0xFFF54" adresini belirlemekten ibaret.

  • x (0xFFF4C) // x kordinatı
  • y (0xFFF50) // y kordinatı
  • z (0xFFF54) //z kordinatı

Oyunun kendi kodlaması yukarıda gördüğünüz gibidir şimdi sıra kendi yapacağımız 3rd tool ile bu bilgili alıp kullanmakta.
C++:
    std::uintptr_t base_address = 0xFFF40; // player struct'ının başlangıç adresidir daha sonra anlatacağım.

 
    float x = read_memory<float>(base_address + 0x0C); // 0xFFF4C
    float y = read_memory<float>(base_address + 0x10); // 0xFFF50
    float z = read_memory<float>(base_address + 0x14); // 0xFFF54

    std::cout << "Kordinatlar:" << std::endl;
    std::cout << "X: " << x << std::endl;
    std::cout << "Y: " << y << std::endl;
    std::cout << "Z: " << z << std::endl;

yukarıda yazdığımız kodlarla temel olarak rakibin konumunu belirlemiş oluyoruz "base_address + 0x14" kısmı pointer ve offset kullanım bilgisini de içeriyor bu konuyu ayrı bir postta detaylı anlatacağım .
Rakibin konum bilgisini aldıktan sonra geriye sadece bu bilgiyi kullanmak kalıyor basitçe bir wall hack nedir mantığı nedir anlatmış olduk.

ANLATMAK İSTEDİĞİM ÇOK ŞEY VAR MEMORY İŞLEMLERİ - KERNEL - ÇEKİRDEK BUNLAR ÇOK DETAYLI VE KAPSAMLI KONULAR , LÜTFEN KONU ALTINA GELİP O ÖYLE DEĞİL BÖYLE , ŞURAYI ATLAMIŞSIN , ŞURASI YANLIŞ GİBİ APTAL APTAL YORUMLAR YAZMAYIN HİÇ BİLGİSİ OLMAYAN VE ÖĞRENMEK İSTEYEN BİRİNİN ANLAYABİLECEĞİ EN BASİT DÜZEYDE ELİMDEN GELDİĞİNCE ANLATMAYA ÇALIŞTIM İYİ FORUMLAR İYİ GECELER .
 
Konuyu takip edenlerden biriyim. Devamını bekliyorum +rep
 
kardeşim bana sıfırdan program yapmayı öretirsen sana güzel paralar veririm (20$)
 
hocam calismiyor ?

V7E0eK0.png
 
güzel bilgilendirici konu olmuş :mum:
 

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


Üst Alt