Neler yeni
XenForo Bannerlar
Modern AdBlock Uyarısı

🎉 SEZON SONU SINIRLI SÜRELİ İNDİRİMLER!
🏷️ Tüm Reklam Paketlerinde %25 İNDİRİM!
Geçerlilik: 01/12/2025 - 31/12/2025
🔍 Detaylar İçin Tıkla

Kod Cipher Handshake Core Crash Fix

Fatih Bulut

Süper Üye
Katılım
6 Kas 2021
Mesajlar
3,491
Tepkime puanı
4,992
Puanları
113
Yaş
31
Konum
Türkiye
Dc
fatihbulut
Selamlar,

Aktif sunucuda yaşadım, nasıl yapıldığını yazmıyorum başka sunucular patlatılmasın diye özetle CG_HANDSHAKE ile client DH2KeyAgreement oluştuktan sonra tekrar aynı paket gönderildiğinde duplike ediliyor, debug buildde burada hata durumu assert ettirilmiş, yani debug buildde bunu server hata olarak görüp crash oluyor fakat release buildde bu kontrol yok, bu sebeple duplike olduktan sonra cleanup olduğunda memory leak olmakta.

cipher.cpp


Arat:
Kod:
size_t Cipher::Prepare(void* buffer, size_t* length)
metodu komple değiştir:
Kod:
size_t Cipher::Prepare(void* buffer, size_t* length) {
  // Prevent double initialization - memory corruption guard
  if (key_agreement_ != NULL) {
    sys_err("Cipher::Prepare() called while key_agreement_ already exists - potential double initialization");
    delete key_agreement_;
    key_agreement_ = NULL;
  }

  key_agreement_ = new DH2KeyAgreement();
  if (key_agreement_ == NULL) {
    sys_err("Failed to allocate DH2KeyAgreement");
    return 0;
  }

  size_t agreed_length = key_agreement_->Prepare(buffer, length);
  if (agreed_length == 0) {
    delete key_agreement_;
    key_agreement_ = NULL;
  }
  return agreed_length;
}
input.cpp

Arat:
Kod:
void CInputProcessor::Handshake(LPDESC d, const char * c_pData)
Komple değiştir:
Kod:
void CInputProcessor::Handshake(LPDESC d, const char * c_pData)
{
    TPacketCGHandshake * p = (TPacketCGHandshake *) c_pData;

    if (d->GetHandshake() != p->dwHandshake)
    {
        sys_err("Invalid Handshake on %d", d->GetSocket());
        d->SetPhase(PHASE_CLOSE);
    }
    else
    {
        if (d->IsPhase(PHASE_HANDSHAKE))
        {
            if (d->HandshakeProcess(p->dwTime, p->lDelta, false))
            {
#ifdef _IMPROVED_PACKET_ENCRYPTION_
                // Prevent duplicate key agreement if already prepared
                if (!d->IsCipherPrepared())
                {
                    d->SendKeyAgreement();
                }
                else
                {
                    sys_err("Duplicate handshake attempt on socket %d - cipher already prepared", d->GetSocket());
                    d->SetPhase(PHASE_CLOSE);
                }
#else
                if (g_bAuthServer)
                    d->SetPhase(PHASE_AUTH);
                else
                    d->SetPhase(PHASE_LOGIN);
#endif // #ifdef _IMPROVED_PACKET_ENCRYPTION_
            }
        }
        else
            d->HandshakeProcess(p->dwTime, p->lDelta, true);
    }
}
Değişiklikler aşağıdaki gibi olacaktır:

1
273228_ec1dccd169a57c555a2bddd4c4847b72.png

2
273226_ef0763aff2fc846094f3b490cc3bb83c.png
 

Forumdan daha fazla yararlanmak için giriş yapın yada üye olun!

Forumdan daha fazla yararlanmak için giriş yapın veya kayıt olun!

Kayıt ol

Forumda bir hesap oluşturmak tamamen ücretsizdir.

Şimdi kayıt ol
Giriş yap

Eğer bir hesabınız var ise lütfen giriş yapın

Giriş yap

Tema düzenleyici

Tema özelletirmeleri

Grafik arka planlar

Granit arka planlar