- Katılım
- 20 Aralık 2023
- Mesajlar
- 1.034
- Makaleler
- 20
- Çözümler
- 55
- Beğeniler
- 3.343
Konu Başlıkları Gizle
- 1 Tam client'ı çıkardım
- 2 Network akışını yakaladım
- 3 Sahte sunucu kurup launcher'ı kandırmaya çalıştım
- 4 Memory dump ile içerideki her şeyi açığa çıkardım
- 5 Eski launcher HTML'ini Wayback Machine'de buldum.
- 6 Server iskeleti Go ile yazıldı (çalıştığını düşünüyorum)
- 7 Bana göre en heyecanlı kısım: Anipark'ın packer'ını kırdım
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.
buradaki linkten setup dosyasını indirdim.
Patch sunucusu (HTTP, port 80):
Launcher arayüzü (HTTPS):
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.
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:
İ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:
Asıl iş
Yani basit XOR + ADD döngüsü. 4-byte word'ler için. Key'ler sabit:
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:
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:
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:
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.
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ı
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
/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 dialog'da yani (BinaryTr.bin içinde)
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ına127.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.)
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
- 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)
- 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
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:
- 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.
- Go backend: Server iskeleti hazır, üzerine login/lobby/match logic yazılacak.
- Eski Goley deneyimi: Kart sistemi, oyuncu seviyeleri, maç akışı nasıldı tam hatırlayan biri lazım dökümantasyon için. Wiki çıkarsak içeriği o belirler.
- Web tarafı: Launcher UI'yı modernize etmek eski HTML duruyor ama estetik olması açısından güncellenebilir.
- VM uzmanı: Temiz Win10 VM'de GameGuard bypass deneyebilecek biri, server testleri için kritik.
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.
Son düzenleyen: Moderatör: