18 Eylül 21:00 — DUHAN2 açılıyor! 1-120 Official Emek, P2W yok, Ücretsiz Oto Av + Balık Botu, TL ödüllü rekabet ve Legal Pazar seni bekliyor. HEMEN TIKLA!
Arkadaşlar Seeelammmm...
Elimde local'e kurmaya çalıştığım bir Metin2 files var. Sunucu (FreeBSD 11.4) ve Client source tarafında dünden beri bayağı köklü bir optimizasyon ve temizlik operasyonu yaptım, source mimarisini bayağı toparladım. Arkadaşa anlatır gibi özet geçeyim, tam olarak ne aşamadayız gör:
1. AntiCheat ve Kripto Motoru Temizliği (Server & Client Source):
Files'ın hem game hem db hem de istemci (Visual Studio) source taraflarından HackShield, XTrap ve NProtect GameGuard gibi miladını doldurmuş tüm eski anti-cheat kalıntılarını ve bağımlılıklarını satır satır kazıdım. Sistem kütüphanesine yük bindiren ve source'u şişiren harici CryptoPP şifreleme motorunu (cipher) hem sunucu ağ katmanından (desc.cpp) hem de client paket el sıkışma döngüsünden (PythonNetworkStream) tamamen arındırdım. Şu an iki tarafın da paket yapıları tertemiz ve birbiriyle %100 senkronize.
2. Derleme Mimarisi ve GCC Runtime Çakışması Çözümü:
Files ham haliyle ilk kurulduğunda sürekli game.core fırlatıp çöküyordu. GDB ile core dump analizi yaptığımda, FreeBSD'nin yerel C++ standart kütüphanesi ile oyunu derleyen GCC 10 derleyicisinin bellek yönetim mimarisinin (__dynamic_cast ve libstdc++.so.6 seviyesinde) çakıştığını yakaladım. Hem game hem db Makefile dosyalarının CFLAGS satırlarını güncelleyip doğru runtime yollarını (-L/usr/local/lib/gcc10 -lstdc++) dikte ederek ve işletim sistemi tarafında ldconfig kütüphane önbelleğini güncelleyerek bu ölümcül ram çökmesini kalıcı olarak çözdüm. Şu an kod ve derleme katmanında hiçbir core patlaması veya kütüphane hatası kalmadı, gmake işlemlerini sıfır hatayla (linking aşamalarını başarıyla geçerek) tamamlıyoruz.
3. Proto Okuma ve exit(0) Tuzaklarının Bypass Edilmesi:
Sunucu ilk start aldığında item_proto okurken At Madalyonu (50050) gibi bozuk/uyumsuz sütun değerlerine denk geldiğinde ProtoReader.cpp içindeki sinsi exit(0); komutlarına yakalanıp hata basmadan sessizce kapanıyordu. O fonksiyonlardaki çökertme kontrollerini return true; ile bypass ettim. Artık sunucu hatalı veri görse bile loga yazıp çökmeden yoluna devam edebiliyor.
Şu Anki Durum ve Takıldığım Nokta:
Tüm bu devasa temizlikten sonra hem source kodlarının, hem files dizininin hem de MySQL'in sapasağlam .tar.gz yedeklerini aldım. Şu an sunucu tarafında kütüphane çakışması veya kod patlaması sıfırlandığı için klasörlerin içine hiçbir şekilde game.core veya db.core dosyası düşmüyor. Ancak /auth veya /channel1 klasörünün içinde ./game tetiklediğim an, oyun patlayarak ölmek yerine, muhtemelen bir veritabanı (localhost yetki) uyuşmazlığı, port/IP çakışması ya da gözden kaçan bir config bağı yüzünden 1 saniye içinde processes listesinden (ps -ax | grep game) kendini temizleyip usulca kapanıyor.
Source katmanındaki tüm büyük engelleri temizledim ama bu son config/veritabanı el sıkışma aşamasında sunucuyu ayakta tutamadım. Bana bu konuda yardım edebilecek bir insan evladı çıkarmı acaba
))
Files Bilgileri:
Elimde local'e kurmaya çalıştığım bir Metin2 files var. Sunucu (FreeBSD 11.4) ve Client source tarafında dünden beri bayağı köklü bir optimizasyon ve temizlik operasyonu yaptım, source mimarisini bayağı toparladım. Arkadaşa anlatır gibi özet geçeyim, tam olarak ne aşamadayız gör:
1. AntiCheat ve Kripto Motoru Temizliği (Server & Client Source):
Files'ın hem game hem db hem de istemci (Visual Studio) source taraflarından HackShield, XTrap ve NProtect GameGuard gibi miladını doldurmuş tüm eski anti-cheat kalıntılarını ve bağımlılıklarını satır satır kazıdım. Sistem kütüphanesine yük bindiren ve source'u şişiren harici CryptoPP şifreleme motorunu (cipher) hem sunucu ağ katmanından (desc.cpp) hem de client paket el sıkışma döngüsünden (PythonNetworkStream) tamamen arındırdım. Şu an iki tarafın da paket yapıları tertemiz ve birbiriyle %100 senkronize.
2. Derleme Mimarisi ve GCC Runtime Çakışması Çözümü:
Files ham haliyle ilk kurulduğunda sürekli game.core fırlatıp çöküyordu. GDB ile core dump analizi yaptığımda, FreeBSD'nin yerel C++ standart kütüphanesi ile oyunu derleyen GCC 10 derleyicisinin bellek yönetim mimarisinin (__dynamic_cast ve libstdc++.so.6 seviyesinde) çakıştığını yakaladım. Hem game hem db Makefile dosyalarının CFLAGS satırlarını güncelleyip doğru runtime yollarını (-L/usr/local/lib/gcc10 -lstdc++) dikte ederek ve işletim sistemi tarafında ldconfig kütüphane önbelleğini güncelleyerek bu ölümcül ram çökmesini kalıcı olarak çözdüm. Şu an kod ve derleme katmanında hiçbir core patlaması veya kütüphane hatası kalmadı, gmake işlemlerini sıfır hatayla (linking aşamalarını başarıyla geçerek) tamamlıyoruz.
3. Proto Okuma ve exit(0) Tuzaklarının Bypass Edilmesi:
Sunucu ilk start aldığında item_proto okurken At Madalyonu (50050) gibi bozuk/uyumsuz sütun değerlerine denk geldiğinde ProtoReader.cpp içindeki sinsi exit(0); komutlarına yakalanıp hata basmadan sessizce kapanıyordu. O fonksiyonlardaki çökertme kontrollerini return true; ile bypass ettim. Artık sunucu hatalı veri görse bile loga yazıp çökmeden yoluna devam edebiliyor.
Şu Anki Durum ve Takıldığım Nokta:
Tüm bu devasa temizlikten sonra hem source kodlarının, hem files dizininin hem de MySQL'in sapasağlam .tar.gz yedeklerini aldım. Şu an sunucu tarafında kütüphane çakışması veya kod patlaması sıfırlandığı için klasörlerin içine hiçbir şekilde game.core veya db.core dosyası düşmüyor. Ancak /auth veya /channel1 klasörünün içinde ./game tetiklediğim an, oyun patlayarak ölmek yerine, muhtemelen bir veritabanı (localhost yetki) uyuşmazlığı, port/IP çakışması ya da gözden kaçan bir config bağı yüzünden 1 saniye içinde processes listesinden (ps -ax | grep game) kendini temizleyip usulca kapanıyor.
Source katmanındaki tüm büyük engelleri temizledim ama bu son config/veritabanı el sıkışma aşamasında sunucuyu ayakta tutamadım. Bana bu konuda yardım edebilecek bir insan evladı çıkarmı acaba
))Files Bilgileri:
- Files Altyapısı (Source): MartySama (Sitede ki Kuzey2 Tarzı Files Cuma Köse nin paylaştığı)
- İşletim Sistemi (OS): FreeBSD 11.4 (32-Bit)
- Server Compiler: GCC 10 (c++11 standartları)
- Client Compiler: Visual Studio 2019 V143
- Database / Lib: MySQL 5.6
#0 0x29581a2f in vtable for __cxxabiv1::__si_class_type_info () from /lib/libcxxrt.so.1
#1 0x2840e0b7 in __dynamic_cast () from /usr/lib/libstdc++.so.6
#2 0x2849752a in std::has_facet<std::ctype<char> > () from /usr/lib/libstdc++.so.6
#3 0x28488980 in std::basic_ios<char, std::char_traits<char> >::_M_cache_locale () from /usr/lib/libstdc++.so.6
#4 0x28488e5c in std::basic_ios<char, std::char_traits<char> >::init () from /usr/lib/libstdc++.so.6
#5 0x28422c3d in std::ios_base::Init::Init () from /usr/lib/libstdc++.so.6
#6 0x28558404 in std::cout () from /usr/lib/libstdc++.so.6
#7 0x28558000 in std::codecvt<char, char, __mbstate_t>::id () from /usr/lib/libstdc++.so.6
#8 0x2836127f in __tls_get_addr () from /libexec/ld-elf.so.1
Previous frame inner to this frame (corrupt stack?)
NOT: KONUYU YANLIŞ YERE AÇTIYSAM MOD ARKADAŞLAR UYGUN YERE TAŞIYABİLİRMİ RİCA ETSEM.
#1 0x2840e0b7 in __dynamic_cast () from /usr/lib/libstdc++.so.6
#2 0x2849752a in std::has_facet<std::ctype<char> > () from /usr/lib/libstdc++.so.6
#3 0x28488980 in std::basic_ios<char, std::char_traits<char> >::_M_cache_locale () from /usr/lib/libstdc++.so.6
#4 0x28488e5c in std::basic_ios<char, std::char_traits<char> >::init () from /usr/lib/libstdc++.so.6
#5 0x28422c3d in std::ios_base::Init::Init () from /usr/lib/libstdc++.so.6
#6 0x28558404 in std::cout () from /usr/lib/libstdc++.so.6
#7 0x28558000 in std::codecvt<char, char, __mbstate_t>::id () from /usr/lib/libstdc++.so.6
#8 0x2836127f in __tls_get_addr () from /libexec/ld-elf.so.1
Previous frame inner to this frame (corrupt stack?)
NOT: KONUYU YANLIŞ YERE AÇTIYSAM MOD ARKADAŞLAR UYGUN YERE TAŞIYABİLİRMİ RİCA ETSEM.