- Mesaj
- 377
- Çözümler
- 1
- Beğeni
- 352
- Puan
- 419
- Ticaret Puanı
- 0
Forum kuralı Madde 40/F-1 ihlali sebebi ile uyarı verilmiştir.
Neden ban yedin gibi sorular vardı; küfür edecektim o yüzden kendim kendimi banlattım.
Ek olarak bu tarz lamerler neden forumdan yasaklanmıyor anlamış değilim, Türk ceza kanununa göre suçlu konumunda iken gerekirken forum adminlerinin bu tarz kişileri yasaklamaması çok şaşırtıcı geldi. mmotutkunlarını aslında ben diğer forumlardan ayrı görüyordum, çok klişe gelecek bir laf olacak ; Forum dışındaki olaylar bizi ilgilendirmez veya bana dokunmayan yılan bin yaşasın düşüncesi sanırım bilmiyorum. Veya topluluk güvenliği önemsenmiyordur onu da bilmiyorum.
Fakat türk ceza kanununa göre ; Hukuken saldırıyı yapan kişi suçludur. Saldırıyı yaptığını açıkca konuşuyorsa ve itiraf ediyorsa genelde o forumlarda topluluk güvenliği için banlamak gerekiyor. Tabiki forumun banlamaması hukuki bir zorunluluk değil fakat güvenlik ve sorumluluk açısından beklenen bir adım olmalıydı.
Ek olarak her ne kadar korsan bir sunucuya saldırı yaptığını zannetse de ; devletin bakacağı tek şey ticari gelir elde edilen yerin maliyetini kısıtlayıp kısıtlamadığına bakar. Zaten gerekli yerlere bir kaç sunucu sahibi şikayetini oluşturdu.
Yani kısaca korsan bir sunucu olması sorumluluğu veya tck 224. maddeyi ortadan kaldırmıyor suçu yok etmiyor. Bu ayrımlar çok önemli. Bir sistem veya oyun veya teknolojik ürüne dair herşey ; korsan / lisanssız / gri alanda olsa bile suçu yok etmez. Demekki bu forumda suçlu çok önemsenmiyor olabilir veya kuralları da farklı olabilir.
Her neyse biz devam edelim aşağıda ki tüm adımlarını detaylıca okuyup anlamaya çalışırsanız nasıl bir şey olduğunu anlayabilirsiniz ve neredeyse tüm altyapılarda bu bufferoverflow mevzusu mevcut.
Şimdi fixe geçelim malum yarın 16 sunucu açılıyormuş bir çok sunucu sahibi istiyor ;
Kısaca sorun neydi ; Lamer sunucuya 200 veya üzeri büyüklüğünde paket gönderiyor daha sonra buffer_new() fonksiyonunda abort tetikliyor ve sonuç game.core, ayrıca farklı iplerden sürekli handshake flood yaparak normal oyuncuların girişini vs engelliyor.
Peki fix ne işe yarıyor ? ;
1 = ip ban kontrol , bağlantı limiti , handshake timeout ekleyerek bağlantıyı reddediyorum ve sunucu çalışmaya devam ediyor.
2 = 64mb alloc limit 32 mb input limit ve write boyut limiti ve kontrolü koyduk ve sadece o saldırganın yaptığı client kesiliyor sunucu çökmüyor.
3 = Bilinmeyen paket , flood ban tetikletmek ve bağlantıyı kapatmak ve ipyi definede belirtilen zamana göre banlamak
Ekstra alabileceğiniz önlemler ;
- slowloris bunu bilen bilir ben kısaca özetliyorum ; her 9 saniyede 1 byte gönderirse gönderen kişi 10 saniye timeout tetiklemez gibi ( rakamları isteidğiniz gibi ayarlayabilirsiniz.
- Geçerli paket spam yapabilirsiniz ; oyuna girip geçerli paketleri bağırma sohbeti , yürümek atak yapmak vs vs.. bunlar binlerce kez gönderildiği için flood koruması tetiklenmez. ( Bu karmaşıktır kendi sourcemde bulunuyor fakat aynısını paylaşmak istemiyorum ilerleyen günlerde belki değiştirerek paylaşabilirim. Bunu yapmasanızda zaten aşamayacak çünkü bu yukarıda anlatılanlar anormal bir durum değildir yani yetenek gerektirmeden 3-5 bilgiyle lamer olabiliyorsunuz)
- ve tabiki yoğun trafik ve tamamen abartarak aşırı güvenliğe kaçmak istiyorsanız firewall + os seviyesinde çözmeniz gerekir bunuda sunucu sağlayıcınız yapabilir. Bunlar kod değil sunucuyla alakalıdır.
==== Yukarıdaki 3 adım kapsamlı geliştirmelerdir.. Sunucu sağlayıcınızla konuşmalısınız. ====
libthecore klasörü içerisinde buffer.c dosyasını aç dosya başı includelerden sonra ekle ;
NOT : tüm değişiklikleri ifdef ile sarmalamadım koşulsuz olarak uyguladım çünkü güvenlik kodu isteğe bağlı olmamalıdır. İsteyen ifdefli yapsın.
NOT : mysql/mariadb server.cnf için ise yani ;
max_allowed_packet =
max_connections =
wait_timeout =
interactive_timeout =
net_read_timeout =
net_write_timeout =
buradaki değerleri sunucu sağlayıcınız ayarlasın.
Hızlıca ayarladım yukarıdaki kodlarda parantez vs vs eksikleri varsa yorumlarda belirtebilirsiniz ve devamını geliştirmek isteyen arkadaşlar yorumda belirtebilir herkese iyi forumlar.
Magazin için bu konuyu ziyaret edin ; S1nWar lameri ve diğer lamerler tarafından 2 gündür tüm sunuculara saldırılara dair / Bufferoverflow
Ek olarak bu tarz lamerler neden forumdan yasaklanmıyor anlamış değilim, Türk ceza kanununa göre suçlu konumunda iken gerekirken forum adminlerinin bu tarz kişileri yasaklamaması çok şaşırtıcı geldi. mmotutkunlarını aslında ben diğer forumlardan ayrı görüyordum, çok klişe gelecek bir laf olacak ; Forum dışındaki olaylar bizi ilgilendirmez veya bana dokunmayan yılan bin yaşasın düşüncesi sanırım bilmiyorum. Veya topluluk güvenliği önemsenmiyordur onu da bilmiyorum.
Fakat türk ceza kanununa göre ; Hukuken saldırıyı yapan kişi suçludur. Saldırıyı yaptığını açıkca konuşuyorsa ve itiraf ediyorsa genelde o forumlarda topluluk güvenliği için banlamak gerekiyor. Tabiki forumun banlamaması hukuki bir zorunluluk değil fakat güvenlik ve sorumluluk açısından beklenen bir adım olmalıydı.
Ek olarak her ne kadar korsan bir sunucuya saldırı yaptığını zannetse de ; devletin bakacağı tek şey ticari gelir elde edilen yerin maliyetini kısıtlayıp kısıtlamadığına bakar. Zaten gerekli yerlere bir kaç sunucu sahibi şikayetini oluşturdu.
Yani kısaca korsan bir sunucu olması sorumluluğu veya tck 224. maddeyi ortadan kaldırmıyor suçu yok etmiyor. Bu ayrımlar çok önemli. Bir sistem veya oyun veya teknolojik ürüne dair herşey ; korsan / lisanssız / gri alanda olsa bile suçu yok etmez. Demekki bu forumda suçlu çok önemsenmiyor olabilir veya kuralları da farklı olabilir.
Her neyse biz devam edelim aşağıda ki tüm adımlarını detaylıca okuyup anlamaya çalışırsanız nasıl bir şey olduğunu anlayabilirsiniz ve neredeyse tüm altyapılarda bu bufferoverflow mevzusu mevcut.
Şimdi fixe geçelim malum yarın 16 sunucu açılıyormuş bir çok sunucu sahibi istiyor ;
Kısaca sorun neydi ; Lamer sunucuya 200 veya üzeri büyüklüğünde paket gönderiyor daha sonra buffer_new() fonksiyonunda abort tetikliyor ve sonuç game.core, ayrıca farklı iplerden sürekli handshake flood yaparak normal oyuncuların girişini vs engelliyor.
Peki fix ne işe yarıyor ? ;
1 = ip ban kontrol , bağlantı limiti , handshake timeout ekleyerek bağlantıyı reddediyorum ve sunucu çalışmaya devam ediyor.
2 = 64mb alloc limit 32 mb input limit ve write boyut limiti ve kontrolü koyduk ve sadece o saldırganın yaptığı client kesiliyor sunucu çökmüyor.
3 = Bilinmeyen paket , flood ban tetikletmek ve bağlantıyı kapatmak ve ipyi definede belirtilen zamana göre banlamak
Ekstra alabileceğiniz önlemler ;
- slowloris bunu bilen bilir ben kısaca özetliyorum ; her 9 saniyede 1 byte gönderirse gönderen kişi 10 saniye timeout tetiklemez gibi ( rakamları isteidğiniz gibi ayarlayabilirsiniz.
- Geçerli paket spam yapabilirsiniz ; oyuna girip geçerli paketleri bağırma sohbeti , yürümek atak yapmak vs vs.. bunlar binlerce kez gönderildiği için flood koruması tetiklenmez. ( Bu karmaşıktır kendi sourcemde bulunuyor fakat aynısını paylaşmak istemiyorum ilerleyen günlerde belki değiştirerek paylaşabilirim. Bunu yapmasanızda zaten aşamayacak çünkü bu yukarıda anlatılanlar anormal bir durum değildir yani yetenek gerektirmeden 3-5 bilgiyle lamer olabiliyorsunuz)
- ve tabiki yoğun trafik ve tamamen abartarak aşırı güvenliğe kaçmak istiyorsanız firewall + os seviyesinde çözmeniz gerekir bunuda sunucu sağlayıcınız yapabilir. Bunlar kod değil sunucuyla alakalıdır.
==== Yukarıdaki 3 adım kapsamlı geliştirmelerdir.. Sunucu sağlayıcınızla konuşmalısınız. ====
libthecore klasörü içerisinde buffer.c dosyasını aç dosya başı includelerden sonra ekle ;
libthecore/buffer.c:
#define MAX_BUFFER_ALLOC_SIZE (64 * 1024 * 1024)
1- buffer_new() fonsksiyonunu bulun içinde if (size < 0) return NULL; kontrolü var bu kontrolün hemen altına LPBUFFER buffer = NULL; satırından önce ekle ;
LPBUFFER buffer_new(int size)
{
if (size < 0) {
return NULL;
}
// --- buradan itibaren ekleyin ---
if (size > MAX_BUFFER_ALLOC_SIZE) {
sys_err("buffer_new: size %d exceeds max %d", size, MAX_BUFFER_ALLOC_SIZE);
abort();
}
// --- BURAYA KADAR ---
LPBUFFER buffer = NULL; // -- bu satır zaten var, dokunma
// ... devamı aynı
```
2- buffer_realloc() fonksiyonunu bul dosyanın sonlarına doğru içinde assert(length >= 0 ...) satırı var Bu assertin hemen altına
if (buffer->mem_size >= length) satırından önce ekle ;
void buffer_realloc(LPBUFFER& buffer, int length)
{
assert(length >= 0 && "buffer_realloc: length is lower than zero");
// --- BURADAN ITIBAREN EKLEYIN ---
if (length >= MAX_BUFFER_ALLOC_SIZE) {
sys_err("buffer_realloc: length %d exceeds max %d", length, MAX_BUFFER_ALLOC_SIZE);
abort();
}
// --- BURAYA KADAR ---
if (buffer->mem_size >= length) // ---- bu satır zaten var dokunma
return;
// ... devamı aynı
3- buffer_read_proceed() okuma taşma kontrolü için buffer_read_proceed() fonksiyonunu bul içinde if (length < buffer->length) blogu var bu blogun içinde;
buffer->read_point += length; satırından önce şu kodu ekle ;
void buffer_read_proceed(LPBUFFER buffer, int length)
{
if (length == 0)
return;
// ... mevcut length kontrolu ...
if (length < buffer->length)
{
// --- BURADAN ITIBAREN EKLEYIN ---
if (buffer->read_point + length - buffer->mem_data > buffer->mem_size)
{
sys_err("buffer_read_proceed: buffer overflow! length %d read_point %d",
length, buffer->read_point - buffer->mem_data);
abort();
}
// ---BURAYA KADAR ---
buffer->read_point += length; // -- bu satır saten var
buffer->length -= length;
}
// devamı aynı
buffer_manager.h:
1- #define __INC_METIN_II_GAME_BUFFER_MANAGER_H__ satirinin hemen altına
bu defineyi ekle ;
#define MAX_SAFE_TEMP_BUFFER_WRITE_SIZE (64 * 1024 * 1024)
2- TEMP_BUFFER sınıfında eski void write(...) satırını bul ve bool ile değiştir ;
bool write(const void* data, int size);
NOT : eski kodda void write idi artık bool dönecek false geçersiz boyut ve sadece o client kesilir.
NOT : Template overload ekleme aynı imzaya sahip iki template derlerken hata verir.
Değişiklik sonrası şöyle görünecek ;
#define MAX_SAFE_TEMP_BUFFER_WRITE_SIZE (64 * 1024 * 1024)
class TEMP_BUFFER
{
public:
TEMP_BUFFER(int Size = 8192, bool ForceDelete = false);
~TEMP_BUFFER();
const void * read_peek();
bool write(const void* data, int size);
int size();
void reset();
LPBUFFER getptr() { return buf; }
protected:
LPBUFFER buf;
bool forceDelete;
};
#endif
buffer_manager.cpp:
buffer_manager.cpp içerisinde void TEMP_BUFFER::write(...) fonksiyonu bul ve tamamen aşağıdakiyle değiştir;
bool TEMP_BUFFER::write(const void* data, int size)
{
if (size < 0 || size >= MAX_SAFE_TEMP_BUFFER_WRITE_SIZE)
{
sys_err("TEMP_BUFFER::write: invalid size %d (max %d)", size, MAX_SAFE_TEMP_BUFFER_WRITE_SIZE);
return false;
}
buffer_write(buf, data, size);
return true;
}
[B]NOT : db/src/buffer_manager.h ve db/src/buffer_manager.cpp dosyalarına da aynı değişiklikleri uygulayın. Game tarafıyla birebir aynıdır.[/B]
desc.h:
desc sınıfında değişkenleri bul ; m_dwClientTime ve m_bHandshaking
satirlarini arayın. m_bHandshaking satirinin hemen altına ekle:
DWORD m_dwClientTime; // ----var olan satır
bool m_bHandshaking; // ---- var olan satır
DWORD m_dwConnectTime; // --- Bunu ekle - timeout için bu
desc.cpp:
Bu dosya çok önemli burayı dikkatlice okuyun en çok değişiklik burada yapıldı.
#include "shutdown_manager.h"
satırını veya son include satırını bul tüm includelardan sonra DESC::DESC() constructordan
önce ekle ;
#include <map>
#include <string>
extern int max_bytes_written;
extern int current_bytes_written;
extern int total_bytes_written;
// ========== flood koruma start ========== //
#define MAX_CONNECTIONS_PER_IP 10 // Ayni IP'den max eş zamanlı bağlantı //
#define HANDSHAKE_TIMEOUT_SEC 10 // Handshake icin max bekleme süresi //
#define BAD_PACKET_BAN_THRESHOLD 3 // 3 pakette geçici ban //
#define TEMP_BAN_DURATION_SEC 60 // Gecici ban suresi (saniye) //
Yukarıdakilerle sayılarla oynama yapabilirsiniz
static std::map<std::string, int> s_mapIPConnCount;
static std::map<std::string, int> s_mapIPBadPacketCount;
static std::map<std::string, DWORD> s_mapIPTempBan;
static bool IsIPTempBanned(const std::string& stIP)
{
auto it = s_mapIPTempBan.find(stIP);
if (it == s_mapIPTempBan.end())
return false;
if (get_global_time() - it->second > TEMP_BAN_DURATION_SEC)
{
s_mapIPTempBan.erase(it);
s_mapIPBadPacketCount.erase(stIP);
return false;
}
return true;
}
void FloodProtection_AddBadPacket(const std::string& stIP)
{
int& count = s_mapIPBadPacketCount[stIP];
++count;
if (count >= BAD_PACKET_BAN_THRESHOLD)
{
s_mapIPTempBan[stIP] = get_global_time();
sys_err("FLOOD: IP %s temp banned (%d bad packets)", stIP.c_str(), count);
}
}
void FloodProtection_Cleanup()
{
DWORD dwNow = get_global_time();
for (auto it = s_mapIPTempBan.begin(); it != s_mapIPTempBan.end(); )
{
if (dwNow - it->second > TEMP_BAN_DURATION_SEC * 2)
{
s_mapIPBadPacketCount.erase(it->first);
it = s_mapIPTempBan.erase(it);
}
else
++it;
}
for (auto it = s_mapIPBadPacketCount.begin(); it != s_mapIPBadPacketCount.end(); )
{
if (s_mapIPTempBan.find(it->first) == s_mapIPTempBan.end())
it = s_mapIPBadPacketCount.erase(it);
else
++it;
}
}
/* ========== -flood koruma son satır ========== */
-@ DESC::Initialize() içinde DESC::Initialize() fonksiyonu bul ve içinde;
_pkDisconnectEvent = NULL; satırını ara ve bu satırdan sonra ekle ;
m_pkDisconnectEvent = NULL; // var olan satır
m_dwConnectTime = 0; // >>> bunu ekle
-@ DESC::Destroy() içinde ; m_bDestroyed = true; satırı ara ve bu satırdan hemen sonra
if (m_pkLoginKey) satırından önce ekle ;
m_bDestroyed = true; // ---- var olan satır
// >>> buradan itibaren ekle >>>
// Baglanti sayaç to reduce //
if (!m_stHost.empty())
{
auto it = s_mapIPConnCount.find(m_stHost);
if (it != s_mapIPConnCount.end())
{
if (--it->second <= 0)
s_mapIPConnCount.erase(it);
}
}
// --- buraya kadar ---
if (m_pkLoginKey) // ---- var olan satır
// ... devami ayni
-@ DESCT::Setup() içinde ;
- m_dwHandle = _handle; SATIRINI ARA VE BU SATIRDAN HEMEN SONRA ;
m_lpOutputBuffer = buffer_new(...) satırından önce ekle
m_dwHandle = _handle; // ---- var olan satır
// --- BURADAN İTİBAREN EKLE---
// Geçici banned kontrol //
if (IsIPTempBanned(m_stHost))
{
sys_log(0, "FLOOD: connection rejected (temp banned) from %s", m_stHost.c_str());
return false;
}
// İp bağlantı limit //
int& connCount = s_mapIPConnCount[m_stHost];
if (connCount >= MAX_CONNECTIONS_PER_IP)
{
sys_err("FLOOD: too many connections (%d) from %s, rejecting", connCount, m_stHost.c_str());
FloodProtection_AddBadPacket(m_stHost);
return false;
}
++connCount;
// Handshake timeout //
m_dwConnectTime = get_global_time();
// --- BURAYA KADAR ---
m_lpOutputBuffer = buffer_new(DEFAULT_PACKET_BUFFER_SIZE * 2); //--- bu satir zaten var
// ... devamı aynı
-@ DESC::ProcessInput()` fonksiyonunu bulun. içinde ssize_t bytes_read; satırını ara.
Bu satırdan hemen sonra, if (!m_lpInputBuffer) satirindan önce ekle:
ssize_t bytes_read; // ---- var olan satır
// ---- buradan itibaren ekle --
// Handshake timeout //
if (m_iPhase == PHASE_HANDSHAKE && m_dwConnectTime > 0)
{
if (get_global_time() - m_dwConnectTime > HANDSHAKE_TIMEOUT_SEC)
{
sys_err("FLOOD: handshake timeout (%ds) from %s", HANDSHAKE_TIMEOUT_SEC, m_stHost.c_str());
FloodProtection_AddBadPacket(m_stHost);
return -1;
}
}
// ---- BURAYA KADAR ----
if (!m_lpInputBuffer) // -- var olan satır
// ... devamı aynı
-@ Aynı fonksiyonda buffer_write_proceed(m_lpInputBuffer, bytes_read); satırı bul.
Bu satırdan hemen sonra, if (!m_pInputProcessor) satırından ÖNCE ekleyin:
buffer_write_proceed(m_lpInputBuffer, bytes_read);
// EKLENDI - 32MB input buffer limti //
#define MAX_SAFE_INPUT_BUFFER_SIZE (32 * 1024 * 1024)
if (buffer_size(m_lpInputBuffer) > MAX_SAFE_INPUT_BUFFER_SIZE)
{
sys_err("DESC::ProcessInput: input buffer too large (%u bytes) from %s",
(unsigned)buffer_size(m_lpInputBuffer), m_stHost.c_str());
return -1;
}
#undef MAX_SAFE_INPUT_BUFFER_SIZE
if (!m_pInputProcessor)
// ... devamı anyı
-@ USE_IMPROVED_PACKET_DECRYPTED_BUFFER aktifse, ProcessInput() içinde aşağıdaki
while döngüyü bulun. döngünün açılış parantezinden hemen sonra,
processingPoint += iBytesProceed; satirindan ÖNCE ekleyin:
while (processingRemainSize > 0 &&
!m_pInputProcessor->Process(this, (const void*)processingPoint,
processingRemainSize, iBytesProceed))
{
// ---- buradan itibaren ekle ----
if (iBytesProceed == 0)
{
sys_err("DESC::ProcessInput: Process() returned 0 bytes from %s", m_stHost.c_str());
return -1;
}
// ---- BURAYA KADAR ----
processingPoint += iBytesProceed; // <-- zten var
// ... devami ayni
-@ USE_IMPROVED_PACKET_DECRYPTED_BUFFER aktifse, ProcessInput() içinde tum
temporary.write(...) ve m_lpInputDecryptedBuffer.write(...) çağrıları bukl.
Her birini if (!...) ile sarmalayip başarısızlıkta return -1; ekleyin:
// ÖNCESİ (eski kod): //
temporary.write(m_lpInputDecryptedBuffer.read_peek(), m_lpInputDecryptedBuffer.size());
// SONRASI (yeni kod) - ayni satırı asagidaki gibi değiştir: //
if (!temporary.write(m_lpInputDecryptedBuffer.read_peek(), m_lpInputDecryptedBuffer.size()))
return -1;
Not: ProcessInput() içindeki tüm .write() çağrılarına bunu yap
-@ DESC::ChatPacket() fonksiyonunu bul içinde TEMP_BUFFER buf; satırını ara.
Eski buf.write(...) cagrilarini if (!buf.write(...)) ile değiştirr:
TEMP_BUFFER buf;
// öncesi: buf.write(&pack_chat, ...); buf.write(chatbuf, len);
// sonrası:
if (!buf.write(&pack_chat, sizeof(struct packet_chat)) || !buf.write(chatbuf, len))
return;
Packet(buf.read_peek(), buf.size());
Buraya kadar desc.cpp bitti.
main.cpp:
io_loop() fonksiyonunu bul. Fonksiyonun başındaki değişken tanımlarının hemen altına,
DESC_MANAGER::instance().DestroyClosed(); satırından önce ekleyin:
Ayrica dosyanin basina (veya io_loop` fonksiyonundan once) extern tanimini ekleyin:
extern void FloodProtection_Cleanup(); // ---- BUNU dosya başına ekleyin
int io_loop(LPFDWATCH fdw)
{
LPDESC d;
int num_events, event_idx; // bu satrlar zaten var
// ---- buradan itibaren ekle ----
{
static DWORD s_dwLastCleanup = 0;
DWORD dwNow = get_global_time();
if (dwNow - s_dwLastCleanup > 60)
{
FloodProtection_Cleanup();
s_dwLastCleanup = dwNow;
}
}
// ---- BURAYA KADAR ----
DESC_MANAGER::instance().DestroyClosed(); //
// ... devamı aynı kalsın
input.cpp:
CInputHandshake::Analyze() (veya CInputHandshake) fonksiyonunu bulun. Icinde
if (d->GetHandshake() != p->dwHandshake) satırını ara. Eski sys_err'den sonra,
--kapanış parantezinden çönce-- şu iki satırı ekleyin:
if (d->GetHandshake() != p->dwHandshake)
{
sys_err("Invalid Handshake on %d", d->GetSocket()); // ---- var olan satır
// ---- Bbunları ekle ----
extern void FloodProtection_AddBadPacket(const std::string& stIP);
FloodProtection_AddBadPacket(d->GetHostName());
d->SetPhase(PHASE_CLOSE);
// ---
Ayni fonksiyonun switch/if yapısının en altindaki else (veya default) bloğunu bul.
Eski sys_err'den sonra şu sattrları ekle;
else
{
sys_err("Handshake phase does not handle packet %d (fd %d) ip : %s",
bHeader, d->GetSocket(), d->GetHostName()); // --- varolan satır
// >>> BUNLARI EKLEYIN >>>
extern void FloodProtection_AddBadPacket(const std::string& stIP);
FloodProtection_AddBadPacket(d->GetHostName());
d->SetPhase(PHASE_CLOSE);
// <<< <<<
return -1;
}
input_auth.cpp:
CInputAuth::Analyze()`fonksiyonundaki switch'in default case'yi bul.
Eski sys_err'den sonra şunları ekle:
default:
sys_err("This phase does not handle this header %d (0x%x)(phase: AUTH ip : %s)",
bHeader, bHeader, d->GetHostName()); // <-- var olan satır
// >>> BUNLARI EKLEYIN >>>
{
extern void FloodProtection_AddBadPacket(const std::string& stIP);
FloodProtection_AddBadPacket(d->GetHostName());
d->SetPhase(PHASE_CLOSE);
}
// <<< <<<
return -1;
input_login.cpp:
CInputLogin::Analyze() fonksiyonundaki switch'in default: case'ii bulun.
default:
sys_err("login phase does not handle this packet! header %d login cpp ip : %s",
bHeader, d->GetHostName()); // <-- var olan satır
// >>> BUNLARI EKLEYIN >>>
{
extern void FloodProtection_AddBadPacket(const std::string& stIP);
FloodProtection_AddBadPacket(d->GetHostName());
d->SetPhase(PHASE_CLOSE);
}
// <<< <<<
return -1;
input_main.cpp:
CInputMain::Analyze() fonksiyonundaki switch'in default: case'i bul Eger default: case yoksa ekleyin.
default:
sys_err("game phase does not handle this packet! header %d ip : %s",
bHeader, d->GetHostName());
// >>> BUNLARI EKLEYIN >>>
{
extern void FloodProtection_AddBadPacket(const std::string& stIP);
FloodProtection_AddBadPacket(d->GetHostName());
d->SetPhase(PHASE_CLOSE);
}
// <<< <<<
return -1;
input_p2p.cpp:
CInputP2P::Analyze() fonksiyonundaki switch'in default: case'ini bulun.
Eger default: case yoksa ekleyin:
default:
sys_err("P2P phase does not handle this packet! header %d ip : %s",
bHeader, d->GetHostName());
return -1; // bağlantı kesilir, flood ban yetki yok dahili
NOT : tüm değişiklikleri ifdef ile sarmalamadım koşulsuz olarak uyguladım çünkü güvenlik kodu isteğe bağlı olmamalıdır. İsteyen ifdefli yapsın.
NOT : mysql/mariadb server.cnf için ise yani ;
max_allowed_packet =
max_connections =
wait_timeout =
interactive_timeout =
net_read_timeout =
net_write_timeout =
buradaki değerleri sunucu sağlayıcınız ayarlasın.
Hızlıca ayarladım yukarıdaki kodlarda parantez vs vs eksikleri varsa yorumlarda belirtebilirsiniz ve devamını geliştirmek isteyen arkadaşlar yorumda belirtebilir herkese iyi forumlar.
Magazin için bu konuyu ziyaret edin ; S1nWar lameri ve diğer lamerler tarafından 2 gündür tüm sunuculara saldırılara dair / Bufferoverflow
Son düzenleme:





büyükmüydü rakam