romegames 1
romegames
Krutzo 1
Krutzo
shrpnl 1
shrpnl
Best Studio 1
Best Studio
D 1
delimuratt
Aliyldrim 1
Aliyldrim
Mt2Hizmet 1
Mt2Hizmet
noisiv 1
noisiv
Manwe Work 1
Manwe Work
melankolıa18 1
melankolıa18
Agora Metin2 1
Agora Metin2
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

Cipher Handshake Core Crash Fix

  • Konuyu başlatan Konuyu başlatan Agora Metin2
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 6
  • Görüntüleme Görüntüleme 1K

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!

Çoook eskilerde aynı hatayı ben de düzeltmiştim. Bu kadar geç fark edilip “fixleniyor” olması ilginç ama en azından doğru yere bakılmış.


Ancak şunu netleştirelim: delete key_agreement_ yapmak çözüm değil, sadece semptomu maskeliyor.
Release buildde memory leak, debug buildde assert/crash üretmesi zaten doğrudan yanlış yaklaşım olduğunu gösteriyor. Bu senaryoda aslında server’ı kendi elle patlatmış oluyorsun.


Doğru çözüm çok daha basit:
ikinci Prepare() çağrısını ignore etmek, veya
KeyAgreement’a düzgün bir Reset() davranışı eklemek.

DH handshake stateful bir yapı; bunu delete ile zorla resetlemeye çalışmak kriptografi, state machine ve memory management mantığını bilmeden yapılan bir hareket gibi duruyor iyi forumlar.
 
Paylaşımınız İçin Teşekkürler Ben Böyle Bir Yöntem Denedim Sizce Faydalımıdır Bilginiz Almak İsterim.

[CODE lang="cpp" title="Ciper.cpp"]size_t Cipher::Prepare(void* buffer, size_t* length)
{
if (key_agreement_ != NULL)
{
sys_err("Cipher::Prepare() called more than once — ignored");
return 0;
}

key_agreement_ = new DH2KeyAgreement();
if (key_agreement_ == NULL)
{
sys_err("Cipher::Prepare() failed — alloc error");
return 0;
}

size_t agreed_length = key_agreement_->Prepare(buffer, length);

if (agreed_length == 0)
{
delete key_agreement_;
key_agreement_ = NULL;
}

return agreed_length;
}[/CODE]

[CODE lang="cpp" title="input.cpp"]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);
return;
}

if (!d->IsPhase(PHASE_HANDSHAKE))
{
sys_err("Handshake outside handshake phase on %d", d->GetSocket());
d->SetPhase(PHASE_CLOSE);
return;
}

if (!d->HandshakeProcess(p->dwTime, p->lDelta, false))
return;

#ifdef ENABLE_IMPR#ifdefACKET_ENCRYPTION
if (d->IsCipherPrepared())
{
sys_err("Duplicate handshake attempt on %d - cipher already prepared", d->GetSocket());
d->SetPhase(PHASE_CLOSE);
return;
}
d->SendKeyAgreement();
#else
if (g_bA#elserver)
d->SetPhase(PHASE_AUTH);
else
d->SetPhase(PHASE_LOGIN);
#endif
}[/CODE]#endif
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst