Hocam selam bu ekibi gördünüz mü?



Hocam zaten bu o arkadaşlar.

Merhaba,

Goley'i bilmeyen yoktur diye düşünüyorum. Bilmeyenler de kısa bir Google araması yaparak ulaşabilir. BGY isimli grupta bu oyun sürekli paylaşılıyor "flood" şeklinde benim de geçen aklıma geldi acaba ne yapabiliriz diye baktım. Tüm süreci adım adım anlatacağım çünkü her aşama kendi içinde ders niteliğinde.

Tam Client'ı çıkardım​


Buradaki linkten setup dosyasını indirdim.
  • Goley.exe (2.7 MB) > Launcher.
  • BinaryTr\BinaryTr.bin (8.3 MB) > asıl Game code (PE dosyası, sadece .bin uzantısı kamuflaj)
  • BinaryTr\GameGuard\ > anti-cheat (nProtect GameGuard, eski Kore standardı)
  • Data\ ve DataTr\ altında devasa VLH/VLD/VLPH/VLPD dosyaları (toplam yaklaşık 900 MB, hepsi şifreli)
  • GoleyTR.ini > şifreli Config dosyası.
Engine stack: DirectX 9 + PhysX + Miles Sound System + nProtect GameGuard + MFC native UI. Tipik 2010-2014 Kore MMO Stack'i. Yani teknoloji açısından eski ama taş gibi sağlam, modern Windows 11'de bile Launcher'ı açabiliyor.

Network akışını yakaladım​

Goley'i çalıştırıp pktmon ve canlı Memory dump kombinasyonu ile Launcher'ın ne yaptığını izledim. Çıkan tablo:

Patch sunucusu (HTTP, port 80): http://cdn.joygamedl.com/chagu/Real_Server_Patch/
  • PatchInfo.bin?p=<unix_timestamp> > patch metadata.
  • HashV2.VLL?p=<unix_timestamp> > hash verification listesi.
  • Goley.exe?p=<unix_timestamp> > self-Update için exe karşılaştırması.
  • LauncherRestarter.exe?p=<unix_timestamp> > exe replace Utility.
URL Path'inde /chagu/ geçiyor. Korece orijinal ismin izi. cdn.joygamedl.com'un DNS'i ölü ama parent domain joygamedl.com Cloudflare'de hala duruyor.

Launcher arayüzü (HTTPS): https://joygame.com/launchers/cj/goley/
  • "Cj" muhtemelen "Chagu Joy" kısaltması.
  • Sadece duyuru paneli + nav butonları (statik HTML, Ajax yok)
  • Login formu burada değil, native MFC Diyalog'da yani (BinaryTr.bin içinde)
Game sunucusu (TCP): 213.74.179.12:2270 (login/auth) + 213.74.179.12:20260 (game/world)
  • Bu IP'nin reverse DNS'i: host-213-74-179-12.superonline.net
  • Yani Joygame Türkiye sunucusunu Superonline'da host etmiş.
  • Tabii ki şu an ölü (TCP timeout veriyor), 2018'den beri öyle.

Sahte sunucu kurup Launcher'ı kandırmaya çalıştım​

Hosts dosyasına 127.0.0.1 cdn.joygamedl.com ekleyip port 80'de Python ile basit bir HTTP server kurdum. Launcher gerçekten benim sunucuma istek attı, Log'a şöyle düştü:

Kod:
GET /chagu/Real_Server_Patch/PatchInfo.bin?p=1778976811
GET /chagu/Real_Server_Patch/HashV2.VLL?p=1778976811
GET /chagu/Real_Server_Patch/Goley.exe?p=1778976811
GET /chagu/Real_Server_Patch/LauncherRestarter.exe?p=1778976811

User-Agent olarak "Goley" yazıyor. Her seferinde anlık UNIX timestamp gönderiyor. Cache-Control: No-cache.

Bu noktada GameGuard araya girdi. hosts dosyası değişikliğini anti-cheat olarak tespit ediyor, oyun açılır açılmaz sessizce kapanıyor.

Memory dump ile içerideki her şeyi açığa çıkardım​


SeDebugPrivilege'i manuel enable edip admin Shell'den MiniDumpWriteDump ile 240 MB'lık Full Memory dump aldım çalışan Goley Process'inden. Bu dump göbeği içinde decrypted halde her şey var. Çıkardıklarım:
  • Tüm Goley URL'leri (38 unique)
  • Tüm Hostname'ler (12 unique: bill.joygame.com, CDN.joy.AC, promo.joygame.com vs.)
  • Game server IP+port'ları
  • 27 Türkçe UI String'i ("Yama başarısız", "ID/Şifre Girin", "Ana sayfa", "Üye Ol", "Stadyum", "Kart" vs.)
  • Patch Flow'unun tam haritası.
  • Tam HTTP request örneği (Host header, User-Agent, vs.)
Dump'tan tek bir hata mesajının Template'i bile çıktı: "Yama başarısız.\r\nOyunu yeniden çalıştırın.\r\nPatchInfo.bin?p=%d\r\ndosya indirme hatası. Kod (%d)"

Eski Launcher HTML'ini Wayback Machine'de buldum.​

15 KB'lık HTML. İçinde Goley'in eski Launcher arayüzü tıpkı hatırladığımız gibi: ÜYE OL / JOYPARA / FORUM / SIRALAMA / GÜVENLİK / DESTEK / SSS butonları, "Duyurular" paneli ve sosyal medya linkleri.

Server iskeleti GO ile yazıldı (çalıştığını düşünüyorum)​

Şu an çalışan halde:

Kod:
goley-server/
├── cmd/
│ ├── patch-server/main.go # Port 80 HTTP cdn.joygamedl.com taklit eder.
│ ├── launcher-web/main.go # Port 8080 joygame.com/launchers/cj/goley/ taklit eder.
│ └── login-server/main.go # Port 2270 + 20260 TCP packet logger.
├── internal/common/ # Hexdump, logger.
├── web/launcher/index.html # Wayback Machine'de bulunan launcher HTML.
└── scripts/ # hosts setup, restore, run-all

Bana göre en heyecanlı kısım: Anipark'ın Packer'ını kırdım​

İşte burada kafayı yedim. Hem Goley.exe hem BinaryTr.bin packed. Section isimleri rastgele (yehajuci, sidtlktc, wnumgecr, jfsgvjtb), IDA'da sadece 3 fonksiyon görünüyor, hiç string yok, import tablosu 2 fonksiyon (lstrcpy, InitCommonControls) yani gerçek Game Logic statik analizle okunamıyor.

İlk önce bilinen packer'ları denedim: UPX? Hayır. Themida? Hayır. VMProtect? Hayır. ASPack, ASProtect, WinLicense, FSG, PECompact, Petite, yodaCrypter? Hiçbiri değil. Anipark kendi Packer'ını yazmış.

IDA Pro kullanarak ilk entry kısmına baktım:
Kod:
start:
 call sub_197F00B.
 int 3 ; debugger trap

Asıl iş sub_197F00B'de. Onu decompile edince algoritma çıktı:

Kod:
sub_197F046(target_addr, 4096, 0x5835B25F, 0x0D971CC0);

int sub_197F046(uint32* ptr, uint size, uint xor_key, uint add_const) {
 for (uint i = size >> 2; i; --i) {
 *ptr ^= 0x5835B25F; // XOR.
 *ptr++ += 0x0D971CC0; // ADD.
 }
}

Yani basit XOR + ADD döngüsü. 4-byte Word'ler için. Key'ler sabit: XOR 0x5835B25F, ADD 0x0D971CC0.

Bu Cipher'ı Python'da implement edip oyunun ilk 4096 Byte'lık şifreli bölgesine uyguladım ve gerçek kod ortaya çıktı.

Stage 2 kodu şöyle görünüyor:

Kod:
sub_18AC000:
 pusha.
 jz loc_18AC072 ; fast path.

 ; PE base finder (relocation desteği için)
 call $+5; pop eax ; klasik EIP alma trick'i.
 and eax, 0FFFFF000h ; page align.
 cmp [eax], 'MZ' ; MZ magic ara.
 ...
 cmp [edx], 'PE' ; PE magic ara.

 ; Stage 3'e atlama.
 mov eax, 17B0014h.
 mov ecx, offset unk_18AC222.
 call sub_18AC0CF ; <-- STAGE 3 DECRYPTOR.

 ; Self-patching (kendi kodunu değiştiriyor)
 mov [eax+1], ecx.
 mov byte ptr [eax], 0E9h ; JMP opcode yaz.
 popa.
 call sub_18AC0B2 ; <-- STAGE 4, muhtemelen OEP'ye JMP.
 retn

Yani packer multi-stage. Birkaç katman var, her biri öbürünü açıyor. Stage 1 stage 2'yi açtı, stage 2 stage 3'ü çağırıyor, stage 3 stage 4'ü açacak, stage 4 muhtemelen OEP'ye JMP atacak.

Tahmin ettiğim üzere, 3-4 stage daha var, sonra OEP'ye ulaşırım. OEP'de 17 MB'lık asıl Game code açık halde olacak. VLD/VLH dosyalarının decryption Key'i, network packet handler'ları, login protocol falan hepsi orada.

Güncel Durum:

Biten:
  • Recon (URL/IP/port/file Format'lar tamamen haritalı)
  • 240 MB Memory dump (decrypted strings altın madeni)
  • Patch Flow tam haritalı.
  • Game server IP onaylı (213.74.179.12, Superonline'da, ölü)
  • Launcher HTML kurtarıldı.
  • GO server iskeleti çalışıyor.
  • Packer cipher kırıldı, stage 2 deşifre edildi.
  • Tüm bulgular doküman halinde.
Sırada:
  • Stage 3 + stage 4 + OEP bulma.
  • VLD/VLH archive cipher (OEP'den sonra ulaşılabilir)
  • Login packet protokolü (aynı şekilde)
  • GameGuard bypass?
  • Database schema (kullanıcı, kart, takım, sezon, lig tabloları)
  • Match simülasyon Engine'i (en zor kısım, oyunun ruhu)
Zor / Belirsiz:
  • Kart havuzunu yeniden oluşturmak (orijinal verilerin VLD'den çıkması lazım)
  • Eski oyuncuların karakter/kart sahipliklerini geri getirmek imkansız (Joygame'in DB'si ölü, kimsenin elinde yok)
  • Lisanslı takım isimleri (Galatasaray, Real Madrid vs.) Jenerik isimler ya da takım rengine göre isim çözümleri lazım.
Bu arada, Korece kaynaklarda "차구차구 프리서버" (Chagu Chagu private server) diye aradım hiçbir şey yok. Anipark community RE projesi yok. MAG'u MAG'u için bile özel bir RE çalışması bulamadım. Sebebi Korece kaynaklarda yazıldığı gibi lisanslı spor oyunları için özel sunucu kurmak sıkıntlı bir iştir çünkü oyuncu lisansları (futbolcu isimleri vs.) Ek bir telif sorunu doğuruyor, bu da topluluğu caydırıyor.

International Soccer Game (ISG) diye bir community projesi Goley'den ilham alarak başlamış ama açık kaynak değil ve son durumu belirsiz. Yani bu projede yalnız ilerliyorum. Bu yüzden buraya yazıyorum.

TLDR;

Şunlardan birinde uzmansan ya da ilgileniyorsan çok yardımcı olursun:
  1. X86 reverse engineering: IDA / Ghidra / X64dbg kullanmasını biliyorsan, packer Stage'lerinin kalanını birlikte çözebiliriz. Tek başına yapabilirim ama 2 kişi 3-4 kat hızlı olur.
  2. GO backend: Server iskeleti hazır, üzerine login/lobby/match Logic yazılacak.
  3. Eski Goley deneyimi: Kart sistemi, oyuncu seviyeleri, maç akışı nasıldı tam hatırlayan biri lazım dokümantasyon için. Wiki çıkarsak içeriği o belirler.
  4. Web tarafı: Launcher UI'yı modernize etmek eski HTML duruyor ama estetik olması açısından güncellenebilir.
  5. VM uzmanı: Temiz Windows 10 VM'de GameGuard bypass deneyebilecek biri, server testleri için kritik.
Recon scriptleri, Memory dump bulguları, GO server Source'u, IDA analiz çıktıları, hepsini yakında bir GitHub repo'sunda public yapacağım. Şu an kod temizliği yapıyorum.

Sorularınızı, önerilerinizi bekliyorum. Özellikle eski Goley oyuncularından "şu özelliği unutma" tarzı katkılar çok iyi olur.

Teşekkür ederim.

Yasal taraf: Bu proje kapanmış bir oyunu hayata döndürme amaçlı, hiçbir ticari kullanım planım yok. Joygame ve Netmarble haklarına saygı duyuyorum, eğer resmi bir itiraz gelirse projeyi tamamiyle kapatırım. Yapıyor olduğum şey "abandonware preservation" kategorisinde server emulation, RetroReversing gibi yıllardır var olan topluluk projeleriyle aynı çizgide. Lisanslı takım isimleri/futbolcu isimleri için jenerik karşılıklar kullanılacak.


Hocam, öncelikle tebrikler. RE için hem iyi bir anlatım olmuş hem de çocukluğumuzun geçtiği bu oyun için iyi bir iş çıkarmış ve çıkarmaya devam ediyorsunuz. Buradan yeni paylaşımlara devam edecek misiniz acaba?