İçeriğe geç
Türkiye'nin SRO tanıtım & topluluk platformu

vSro Paylaşım vSRO Temel Exploit & Paket Güvenliği Fix Kodları

Cevaplar0
Görüntüleme17
Ticaret Puanı
0
Katılım
8 Eyl 2026
Mesajlar
74
Tepkime puanı
1
Puanları
0
Mevcut Bakiye
2680 ₺
[REHBER] vSRO Temel Exploit & Paket Güvenliği Fix Kodları
Filter / Guard Altyapınız İçin Shard & GameServer Çökertme Saldırılarını Önleme Yöntemleri



Merhaba değerli forum sakinleri,

vSRO sunucularında en sık karşılaşılan güvenlik zafiyetlerinin başında, istemci (client) tarafından sunucuya gönderilen manipüle edilmiş veya hatalı yapılandırılmış paketlerin ShardManager veya GameServer bileşenlerini çökertmesi (crash exploit) gelmektedir.

Aşağıda paylaşılan kontrolleri, C# tabanlı özel Guard veya Filter projenizin paket ayrıştırma (PacketHandler / OnPacketReceived) döngüsüne entegre ederek bu zafiyetlerin büyük çoğunluğunu sunucuya ulaşmadan engelleyebilirsiniz.

Önemli Uyarı' Alıntı:
Lütfen Dikkat: Kodları doğrudan projenize kopyala-yapıştır yapmayınız! Her Guard yazılımının paket okuma kütüphanesi (PacketReader, Packet), değişken isimleri ve oturum sonlandırma (Disconnect) metotları farklılık gösterebilir. Kod mantığını kendi yapınıza uyarlayınız.



1. Opcode 0x7005 (Karakter / Sunucu Seçim Ekranı Kontrolü)

  • Tehdit: İstemci bu pakette geçersiz bayrak (flag) değerleri enjekte ederek Shard tarafında beklenmedik durum oluşturabilir ve belleği kitleyebilir.
  • Mantık: İlk bayt değerinin 2'den büyük olmaması gerekir. Geçersiz bir aralıkta ise paket derhal sonlandırılmalıdır.

C#:
// 0x7005: Character / Server Selection Check
if (_pck.Opcode == 0x7005)
{
    // Değer 0, 1 veya 2 dışında ise manipüle edilmiş pakettir
    if (_pck.ReadUInt8() > 2)
    {
        client.Disconnect(); // Bağlantıyı kes
        return;
    }
}



2. Opcode 0x7007 (Karakter Yönetim İşlemleri Kontrolü)

  • Tehdit: Karakter oluşturma, silme veya geri getirme isteklerinde eksik/fazla bayt gönderildiğinde sunucu tarafında IndexOutOfRangeException hatası ile crash oluşur.
  • Mantık: Alt işlem kimliğine (actionType) göre paket gövdesi katı uzunluk ve tip kontrolünden geçirilir; olası taşmalara karşı try-catch bloğuna alınır.

C#:
// 0x7007: Karakter Aksiyonları (Oluşturma, Silme, Geri Yükleme)
if (_pck.Opcode == 0x7007)
{
    byte actionType = _pck.ReadUInt8();

    switch (actionType)
    {
        #region Create Character
        case 1:
            try
            {
                string charName = _pck.ReadAscii();
                uint refObjId   = _pck.ReadUInt32();
                byte scale      = _pck.ReadUInt8();

                // Başlangıç eşya ID'leri (4 slot)
                uint item1 = _pck.ReadUInt32();
                uint item2 = _pck.ReadUInt32();
                uint item3 = _pck.ReadUInt32();
                uint item4 = _pck.ReadUInt32();
            }
            catch
            {
                // Paket boyutu eksikse veya okuma başarısızsa bağlantıyı düşür
                client.Disconnect();
                return;
            }
            break;
        #endregion

        #region Character Screen Call
        case 2:
            // Bu eylem tipi gövdede ek bayt içermemelidir
            if (_pck.GetBytes().Length > 1)
            {
                client.Disconnect();
                return;
            }
            break;
        #endregion

        #region Delete / Restore Character
        case 3: // İsimle karakter silme
        case 4: // Silinen karakteri geri alma
        case 5: // Karakter onay / yedek işlem
            try
            {
                int nameLength = _pck.ReadAscii().Length;

                // Paket boyutu: isim uzunluğu + 2 bayt (uzunluk belirteci) + 1 bayt (actionType)
                // Fark 3 değilse paket verisi manipüle edilmiştir
                if ((_pck.GetBytes().Length - nameLength) != 3)
                {
                    client.Disconnect();
                    return;
                }
            }
            catch
            {
                client.Disconnect();
                return;
            }
            break;
        #endregion

        default:
            // Tanımlanmamış alt komutlar düşürülür
            client.Disconnect();
            return;
    }
}



3. Opcode 0x750E (Boş Payload Doğrulaması)

  • Tehdit: Normal şartlarda boş olması gereken bu bildirime sahte veri enjekte edilerek sunucu tampon belleği (buffer) taşırılmaya çalışılır.
  • Mantık: Paket içeriğinde 0 bayttan fazla veri varsa paket doğrudan reddedilir.

C#:
// 0x750E: Boş Gövde Kontrolü
if (_pck.Opcode == 0x750E)
{
    if (_pck.GetBytes().Length > 0)
    {
        client.Disconnect();
        return;
    }
}



4. Opcode 0x3012 (Durum / Keep-Alive Sorgu Kontrolü)

  • Tehdit: Canlılık veya durum sorgularına yetkisiz payload yerleştirilerek bağlantı protokolünün bozulması hedeflenir.
  • Mantık: Gövde uzunluğu sıfırdan büyük olan tüm istekler düşürülür.

C#:
// 0x3012: State / Ping Kontrolü
if (_pck.Opcode == 0x3012)
{
    if (_pck.GetBytes().Length > 0)
    {
        client.Disconnect();
        return;
    }
}



5. Opcode 0x3510 (Geçersiz / Güvenilmeyen Paket Engelleme)

  • Tehdit: Normal şartlarda istemci tarafından gönderilmemesi gereken bir sistem paketidir. GameServer'a iletilmesi durumunda kilitlenmelere yol açabilir.
  • Mantık: Paket Shard veya GameServer'a ulaştırılmadan döngüden atlanır (Drop edilir).

C#:
// 0x3510: Yetkisiz Paket Engelleme
if (_pck.Opcode == 0x3510)
{
    // Paketi GameServer'a yönlendirmeden atla
    continue;
}



Geliştirici Notu & Güvenlik Tavsiyesi:
Tüm paket okuma adımlarınızda mutlaka try-catch blokları kullanın. Saldırganların en çok başvurduğu yöntem, beklenen türden daha kısa bayt dizisi göndermektir. Eğer kodunuzda koruma bloğu yoksa istemci değil, doğrudan sizin Guard uygulamanız çöker.

Sorularınızı ve eklemek istediğiniz diğer opcode kontrollerini konu altından paylaşabilirsiniz. Herkese iyi forumlar!
 

Konuyu görüntüleyenler

Yükleniyor...
Yükleniyor...
Şu anda sitemizde 40,063 Aktif Kullanıcı
Çevrimiçi üyeler
Konular 1,298
Mesajlar 4,173
Kullanıcılar 1,622
Son üye oznr0404
Geri
Üst