İçeriğe geç
Türkiye'nin SRO tanıtım & topluluk platformu

vSro Paylaşım Silkroad Online PK2 Arşiv Mimarisi: 256 Baytlık Başlık, Blowfish ECB ve XOR Anahtar Türetimi

Cevaplar0
Görüntüleme9
Ticaret Puanı
0
Katılım
19 Ocak 2026
Mesajlar
277
Tepkime puanı
225
Puanları
0
Web sitesi
www.youtube.com
Discord
ayzekk.
Mevcut Bakiye
4605 ₺
📦 Silkroad Online PK2 Arşiv Mimarisi: 256 Baytlık Başlık, Blowfish ECB ve XOR Anahtar Türetimi

Silkroad Online istemcisinin ve sunucu bileşenlerinin tüm görsel, işitsel, topolojik ve mantıksal varlıkları; Joymax tarafından geliştirilmiş tescilli sanal arşiv formatı olan **PK2 (`.pk2`)** dosyaları içerisinde saklanır. Toplam boyutu ~3.66 GB'ı ve dosya adedi 80.000'i aşan bu sanal dosya sistemi, `GFXFileManager.dll` kütüphanesi tarafından yönetilmekte olup simetrik **Blowfish blok şifrelemesi** ile korunmaktadır.

Bu teknik monografta; PK2 arşivinin **256 baytlık başlık yapısı (Header Structure)**, **Blowfish ECB şifreleme mekanizması**, `"169841"` taban dizesinden DLL içindeki statik XOR tablosuyla anahtar türetimi, **küçük uçlu (Little-Endian) Blowfish bayt dönüşüm matematiği** ve arşiv içi dizin ağacı hiyerarşisi akademik bir titizlikle incelenmektedir.

---

### 1. PK2 Arşiv Sistemi Rolü ve Genel Mimarisi

Joymax motoru, işletim sisteminin dosya açma/kapama I/O maliyetlerini ve parçalanmayı (fragmentation) engellemek amacıyla tüm istemci kaynaklarını 5 ana PK2 arşivi altında gruplamıştır:
1. **`Data.pk2` (~2.04 GB):** Metin veritabanı tabloları (`textdata`), arayüz şablonları, eşya/beceri parametreleri ve `.ddj` dokuları.
2. **`Map.pk2` (~886 MB):** Arazi poligonları, 96x96 yükseklik haritaları, NavMesh (`.nvm`) navigasyon ızgaraları.
3. **`Media.pk2` (~602 MB):** 3D meşler (`.bms`), animasyonlar (`.ban`), iskeletler (`.bsk`), materyaller (`.bmt`) ve kaynak dosyaları (`.bsr`).
4. **`Particles.pk2` (~77.4 MB):** Parçacık sistemleri ve büyü efektleri.
5. **`Music.pk2` (~59.3 MB):** Arka plan müzikleri (BGM) ve ses efektleri (WAV).

---

### 2. 256 Baytlık Sabit Başlık Yapısı (Header Structure)

Tüm PK2 arşivleri, dosyanın en başında yer alan **256 baytlık (0x100)** sabit bir başlık bloğu ile başlar:

Bu gizli bloğun içeriği yalnızca şu üyeler tarafından görülebilir. Bu İçerik Premium Üyelere Özeldir. Engelsiz Tüm Gizli İçerikleri Görmek İçin Premium Üyelik satın alabilirsiniz. Ücretli Üyelikler


---

### 3. Blowfish ECB Şifreleme ve "169841" Anahtar Türetimi

PK2 dosyasında **0x100 ofsetinden sonraki tüm veriler** 8 baytlık bloklar halinde Blowfish algoritmasıyla şifrelenmiştir. Şifreleme kipi **ECB (Electronic Codebook)** olarak seçilmiştir.

#### 3.1 ECB Kipi ve Örüntü Sızıntısı (Pattern Leakage)
ECB kipinde aynı açık metin (plaintext) blokları her zaman birebir aynı şifreli metin (ciphertext) bloklarını üretir. Tüm PK2 arşivlerinin `0x100` ofsetindeki ilk şifreli bloğu çözüldüğünde ana kök dizin girişine ulaşılır:
- `0x100`: `b4 c2 b9 53 09 f0 0b 01` (İlk dizin bloğu şifreli hali)
- `0x108`: `5f 0a 39 be a2 f0 6a 2f` (Sürekli tekrarlayan blok)

> **Kriptografik Tespit:** `5f 0a 39 be a2 f0 6a 2f` bloğunun ardışık olarak yüzlerce kez tekrarlanması, o blokların **tamamen sıfırlardan (`0x00`) oluşan boşluk/dolgu blokları** olduğunu doğrudan ele verir.

Bu gizli bloğun içeriği yalnızca şu üyeler tarafından görülebilir. Bu İçerik Premium Üyelere Özeldir. Engelsiz Tüm Gizli İçerikleri Görmek İçin Premium Üyelik satın alabilirsiniz. Ücretli Üyelikler


---

### 4. Dizin Giriş Formatı (Directory Entry Tree)

Çözülen bloklar, PK2 içerisinde hiyerarşik bir dosya/klasör ağacı oluşturur. Her dizin bloğu 20 adet giriş (Entry) barındırabilir.

Bu gizli bloğun içeriği yalnızca şu üyeler tarafından görülebilir. Bu İçerik Premium Üyelere Özeldir. Engelsiz Tüm Gizli İçerikleri Görmek İçin Premium Üyelik satın alabilirsiniz. Ücretli Üyelikler


---

### 5. PK2 İçerisindeki Varlık Format Dağılımı

PK2 sanal arşivleri çözüldüğünde ortaya çıkan 80.000'den fazla dosyanın dağılımı:

| Uzantı | Format İmzası | Açıklama | Dosya Sayısı |
| :--- | :--- | :--- | :--- |
| `.ddj` | `JMXVDDJ ` | Joymax tescilli DDS doku sarmalayıcısı (20 bayt başlık) | 31.073 |
| `.dds` | `DDS ` | Standart DirectDraw Surface sıkıştırılmış doku | 18.902 |
| `.bms` | `JMXVBMS ` | 3D Geometri ve tepe noktası (Vertex/Face) meş verisi | 16.852 |
| `.bsr` | `JMXVRES ` | Varlık kök tanımı (Meş, materyal, iskelet bağlayıcı) | 5.563 |
| `.nvm` | `JMXVNVM ` | Arazi NavMesh navigasyon ve engel ızgarası | 5.040 |
| `.ban` | `JMXVBAN ` | Kemik animasyon ve rotasyon anahtar kareleri | 3.564 |
| `.bmt` | `JMXVBMT ` | Materyal tanımı, kaplama ve gölgelendirici bayrakları | 3.133 |
| `.wav` | `RIFF` | Ses ve efekt dalga formları | 2.159 |
| `.bsk` | `JMXVBSK ` | Karakter ve canavar kemik iskelet hiyerarşisi | 810 |
| `.txt` | Unicode | UTF-16LE sekme ayrımlı referans veri tabloları | 437 |
| `.cpd` | `JMXVCPD ` | Karakter parametre ve simülasyon verileri | 70 |
| `.2dt` | UI Template | Arayüz pencere ve düğme şablonları | 42 |
| `.dof` | `JMXVDOF ` | Zindan ve kapalı alan nesne konumlandırma verisi | 21 |
| `.ifo` | `JMXVOBJI` | Harita nesne ve karo dizin dosyaları | 4 |
| `.mfo` | `JMXVMFO ` | Harita küme tanımı ve genel dünya bilgisi | 1 |

> **JMXV Başlık Kuralı:** Joymax'ın tüm tescilli 3D ve grafik dosyaları 12 baytlık `JMXV` başlığıyla başlar: 4 bayt `"JMXV"` + 4 bayt Format ID (Örn: `"BMS "`) + 4 bayt Format Sürümü (Örn: `"0109"`).

---

### 6. `GFXFileManager.dll` Sınıf Mimarisi ve PDB İmzası

PK2 arşiv yöneticisinin dahili C++ mimarisi nesne yönelimli soyutlamalar üzerine kurulmuştur:
- `CBlowFish`: 8 baytlık blok şifreleme motoru.
- `CFMFile`: PK2 girdilerini sanal bir dosya tanıtıcısı (Handle) olarak sunan soyutlama.
- `IFileManager`: Dosya yöneticisi arayüzü.
- `CPFileManager`: Fiziksel PK2 arşivlerini okuyan ana motor.
- `CWFileManager`: Arşivlere yeni dosya ekleyen ve yeniden paketleyen yazıcı sınıf.

Bu gizli bloğun içeriği yalnızca şu üyeler tarafından görülebilir. Bu İçerik Premium Üyelere Özeldir. Engelsiz Tüm Gizli İçerikleri Görmek İçin Premium Üyelik satın alabilirsiniz. Ücretli Üyelikler


---

### 7. Araç Geliştiricileri İçin Round-Trip ve Bütünlük Kuralları

1. **Byte-Exact Round-Trip:** Bir PK2 dosyasından çıkarılan varlık tekrar içeri yazıldığında bayt birebir aynı kalmalıdır. Çıkarma esnasında dosya boyutları veya başlık bilgileri tahrif edilirse istemci okuma kancaları başarısız olur.
2. **8-Bayt Blok Hizalaması (Padding):** PK2 içerisine yeni dosya enjekte edilirken veya dizin blokları yazılırken veri mutlaka 8 baytın katı olacak şekilde sıfır dolgusu (`0x00`) ile hizalanmalı ve Blowfish ECB kuralına göre şifrelenmelidir.
3. **Little-Endian Dönüşümü:** Özel araç geliştirenler standart Blowfish implementasyonunu doğrudan kullanmamalı; 4'er baytlık iki tamsayı arasındaki Little-Endian / Big-Endian takasını mutlaka icra etmelidir.

🙏 Silkroad Geliştirici Camiasına Teşekkür ve Saygı

Bu kapsamlı teknik dokümantasyon, tersine mühendislik mimarisi ve protokol analizlerinin gün ışığına çıkmasında Silkroad ekosistemine yıllardır karşılıksız devasa emekler veren ve bu mirası ileriye taşımaya devam eden öncü geliştiricilerimize en içten teşekkürlerimizi sunarız:

⭐ DaxterSoul — Paket filtreleme, proxy mimarileri ve sunucu güvenliğindeki temel çalışmaları ve topluluğa kazandırdığı standartlar için,
⭐ florian0 — İstemci (Client) ve GameServer ikili (binary) tersine mühendisliği, hook ve assembly düzeyindeki rehber niteliğindeki araştırmaları için,
⭐ JellyBitz — Açık kaynak Silkroad araçları, paket analiz kütüphaneleri ve geliştirici ekosistemine sunduğu paha biçilmez açık kaynak yazılımlar için,
⭐ ferdoran — İstemci-sunucu protokol analizlerinin, opcode referanslarının ve teknik dokümantasyonun derlenip topluluğa kazandırılmasındaki büyük gayretleri için.

Silkroad geliştirici topluluğuna kattığınız değer, paylaştığınız bilgi birikimi ve sunduğunuz vizyon için sonsuz teşekkürler. İyi ki varsınız!
 

Konuyu görüntüleyenler

Yükleniyor...
Yükleniyor...
Şu anda sitemizde 17,793 Aktif Kullanıcı
Çevrimiçi üyeler
Konular 1,209
Mesajlar 4,051
Kullanıcılar 1,597
Son üye serkankacan
Geri
Üst