- Katılım
- 22 Eki 2024
- Konular
- 2
- Mesajlar
- 30
- Online süresi
- 19d 9h
- Reaksiyon Skoru
- 17
- Altın Konu
- 0
- Başarım Puanı
- 35
- MmoLira
- 3,830
- DevLira
- 3
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.
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.
- Katılım
- 15 May 2018
- Konular
- 96
- Mesajlar
- 948
- Çözüm
- 18
- Online süresi
- 3mo 25d
- Reaksiyon Skoru
- 284
- Altın Konu
- 0
- TM Yaşı
- 8 Yıl 21 Gün
- Başarım Puanı
- 166
- Yaş
- 28
- MmoLira
- 11,580
- DevLira
- 30
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:
repare(void* buffer, size_t* length)
{
if (key_agreement_ != NULL)
{
sys_err("Cipher:
repare() called more than once — ignored");
return 0;
}
key_agreement_ = new DH2KeyAgreement();
if (key_agreement_ == NULL)
{
sys_err("Cipher:
repare() 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
[CODE lang="cpp" title="Ciper.cpp"]size_t Cipher:
repare(void* buffer, size_t* length){
if (key_agreement_ != NULL)
{
sys_err("Cipher:
repare() called more than once — ignored");return 0;
}
key_agreement_ = new DH2KeyAgreement();
if (key_agreement_ == NULL)
{
sys_err("Cipher:
repare() 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



