-
Notifications
You must be signed in to change notification settings - Fork 0
MKX Format
Binary format specification for MKX .xxx files. File version 677 (0x2A5), licensee version 157 (0x9D), FourCC "MK10".
Unlike IJ2's fixed 100-byte header, MKX serializes FString and TArray fields inline, making the header variable-size.
| # | Field | Type | Notes |
|---|---|---|---|
| 1 | Magic | u32 | 0x9E2A83C1 |
| 2 | FileVersion | u32 | Low u16 = 0x2A5 (677), high u16 = 0x9D (157) |
| 3 | TotalHeaderSize | u32 | Offset where export data begins |
| 4 | MidwayTeamFourCC | 4B | "MK10" |
| 5 | MidwayTeamVersion | u32 | 80 |
| 6 | ShaderVersion | u32 | 102 |
| 7 | MetadataVersion | 16B | MD5 hash (not in IJ2 or MK11) |
| 8 | FolderName | FString | Typically "None\0" (not in IJ2 or MK11) |
| 9 | PackageFlags | u32 | |
| 10 | NameCount | u32 | |
| 11 | NameOffset | u64 | |
| 12 | ExportCount | u32 | |
| 13 | ExportOffset | u64 | |
| 14 | ImportCount | u32 | |
| 15 | ImportOffset | u64 | |
| 16 | GameThreadExportCount | u32 | |
| 17 | DependsOffset | u64 | Not in IJ2 |
| 18 | BulkDataOffset | u64 | Not in IJ2 |
| 19 | ImportExportGuidsOffset | u64 | |
| 20 | ImportGuidsCount | u32 | |
| 21 | ExportGuidsCount | u32 | |
| 22 | ThumbnailTableOffset | u64 | |
| 23 | GUID | 16B | |
| 24 | EngineVersion | u32 | |
| 25 | CookedContentVersion | u32 | |
| 26 | CompressionFlags | u32 | 0x02 = ZLIB |
| 27 | CompressedChunks | TArray | u32 count + FCompressedChunk[] (inline) |
| 28 | AdditionalPackagesToCook | TArray | u32 count + FString[] |
After the TArrays: DiskSizeOfMD5Set (u32+skip), DiskSizeOfClassVersionTable (u32+skip), LinkerRootFullyQualifiedPath (FString, licensee >= 0x75).
| Field | Size | Type |
|---|---|---|
| UncompressedOffset | 8 | u64 |
| UncompressedSize | 4 | u32 |
| CompressedOffset | 8 | u64 |
| CompressedSize | 4 | u32 |
Variable size due to ComponentMap TMap. Minimum 88 bytes (when ComponentMap count = 0).
| Field | Size | Type | Notes |
|---|---|---|---|
| ClassIndex | 4 | i32 | resolve_object |
| SuperIndex | 4 | i32 | resolve_object |
| OuterIndex | 4 | i32 | resolve_object |
| ObjectName | 8 | FName | index + number |
| ObjectGuid | 16 | GUID | Before ArchetypeIndex (IJ2 puts it after ObjectFlags) |
| ArchetypeIndex | 4 | i32 | resolve_object |
| ReferencedObjects | 4 | i32 | |
| ObjectFlags | 8 | u64 | |
| SerialSize | 4 | u32 | Export data size |
| SerialOffset | 8 | u64 | Export data offset |
| ComponentMap | var | TMap | u32 count + entries (12B each: FName + i32) |
| ExportFlags | 4 | u32 | |
| PackageGuid | 16 | GUID | Not in IJ2 |
| Field | Size | Type | Notes |
|---|---|---|---|
| ClassPackage | 8 | FName | |
| ClassName | 8 | FName | |
| OuterIndex | 4 | i32 | |
| ObjectName | 8 | FName | |
| ObjectGuid | 16 | GUID | Not in IJ2 (IJ2 imports are 28 bytes) |
Algorithm: ZLIB (flag 0x02). NOT Oodle.
Block framing is the same as IJ2:
- BlockHeader (32B): Magic (u32) + Padding (u32) + ChunkSize (u64) + CompressedSize (u64) + DecompressedSize (u64)
- ChunkHeader (16B): CompressedSize (u64) + DecompressedSize (u64)
Also supports LZO (flag 0x01).
Uses TFC companion files (same mechanism as IJ2), not PSF tables (like MK11).
Vertex data stored in separated buffers (unlike IJ2's interleaved FSoftSkinVertex chunks):
Sections → IndexBuffer → ShadowIndices → ActiveBoneIndices →
Chunks → NumVertices → Edges → RequiredBones →
PositionVertexBuffer → TangentVertexBuffer → WeightVertexBuffer →
UVVertexBuffer → [ColorVertexBuffer] → DQBlendWeightVertexBuffer →
VertexBufferGPUMorphSkin → AdjacencyIndexBuffer
Position buffer applies X-negation for LH→RH coordinate conversion.
Header: 72 bytes (18 × u32), same as IJ2. Key difference: field 13 is tweakvars_size (byte count) in MKX vs tweakvars (item count) in IJ2.
Function headers: 80 bytes. Uses u64 offsets vs u32 + padding in IJ2.
Section order differs from IJ2: MKX puts bytecode at the END (after all tables), IJ2 puts it at the START. Checked pointers are 4 bytes in MKX (vs 8 in IJ2). Parse success: 462/463 files (99.8%).
SND packages contain FmodDesignerProject, FmodEventFile, FmodSourceData, and FmodEvent exports.
FSB encryption: type 1 cipher — decrypted[i] = reverse_bits(encrypted[i]) ^ key[i % key_len]. Key: 996164B5FC0F402983F61F220BB51DC6 (32-byte ASCII). The bIsEncrypted flag at project offset +200 bit 2 controls application.
| Feature | MKX (0x2A5) | IJ2 (0x2DC) | MK11 (0x301) |
|---|---|---|---|
| FourCC | MK10 | DCF2 | MK11 |
| Header | Variable (FString+TArray inline) | Fixed 100B | Fixed 104B |
| MetadataVersion | 16-byte MD5 | Not present | Not present |
| FolderName | FString in header | Not present | Not present |
| Compressed chunks | Inline TArray | After header (flat) | Named packages |
| FObjectExport | 88B+ (has PackageGuid) | 72B | 76B |
| FObjectImport | 44B (has ObjectGuid) | 28B | 20B |
| Compression | ZLIB / LZO | Oodle v4 | Oodle v5 |
| Bulk data | TFC files | TFC files | PSF tables |
NRS Asset Manager
Architecture
Game Formats
Game Documentation
- Injustice 2 (DCF2)
- Mortal Kombat X (MK10)
- Mortal Kombat 11 (MK11)
- Mortal Kombat 1 (MK12)
Export Handlers
Reference