- Katılım
- 17 Eki 2016
- Konular
- 129
- Mesajlar
- 2,409
- Çözüm
- 86
- Online süresi
- 2mo 11d
- Reaksiyon Skoru
- 1,290
- Altın Konu
- 1
- Başarım Puanı
- 258
- MmoLira
- 1,866
- DevLira
- 12
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!
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:
metodu komple değiştir:
input.cpp
Arat:
Komple değiştir:
Değişiklikler aşağıdaki gibi olacaktır:
1)
2)
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)
2)
En Çok Reaksiyon Alan Mesajlar
paylaşım için teşekkürler
ellerine sağlık paylaşım için teşekkürler.
Ç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: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
Paylaşım için teşekkürler.
- Katılım
- 15 May 2013
- Konular
- 1,207
- Mesajlar
- 7,322
- Çözüm
- 6
- Online süresi
- 2mo 16d
- Reaksiyon Skoru
- 5,959
- Altın Konu
- 410
- Başarım Puanı
- 349
- MmoLira
- 45,966
- DevLira
- 3
ellerine sağlık paylaşım için teşekkürler.
- Katılım
- 22 Eki 2024
- Konular
- 91
- Mesajlar
- 467
- Online süresi
- 1mo 12d
- Reaksiyon Skoru
- 493
- Altın Konu
- 13
- Başarım Puanı
- 113
- MmoLira
- 21,982
- DevLira
- 129
Paylaşım için teşekkürler
Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 8
- Görüntüleme
- 222
- 5.00 yıldız(lar) 1 Değerlendirme
- Cevaplar
- 3
- Görüntüleme
- 351
- Cevaplar
- 7
- Görüntüleme
- 2K
- Kilitli
- Cevaplar
- 7
- Görüntüleme
- 1K




repare(void* buffer, size_t* length)








