Di Balik Format File Biner: Header PNG, ZIP, dan Mach-O Dijelaskan
Setiap format file yang Anda gunakan sehari-hari, gambar, arsip, executable, memiliki struktur yang ditentukan hingga ke byte, dan hampir tidak ada dari struktur itu yang terlihat melalui alat yang biasa Anda pakai untuk membuka file tersebut. Preview menunjukkan sebuah gambar. Archive Utility menunjukkan file yang diekstrak. Keduanya tidak menunjukkan byte yang memungkinkan hasil itu. Berikut tampilan sebenarnya dari tiga format umum di baliknya, dan cara melihatnya sendiri.
PNG: rangkaian chunk berlabel
Setiap file PNG dimulai dengan delapan byte yang sama: 89 50 4E 47 0D 0A 1A 0A. Itu bukan data gambar, melainkan tanda tangan, sengaja dipilih untuk menyertakan byte yang menjadi tidak dapat dipakai jika file secara tidak sengaja ditransfer sebagai teks (0x0A dan 0x0D adalah karakter baris baru, jadi transfer mode-teks yang rusak akan mengorupsinya dengan cara yang mudah dideteksi).
Setelah tanda tangan, segala sesuatu dalam PNG adalah chunk, dan setiap chunk mengikuti tata letak empat bagian yang sama:
- Length (4 byte): berapa banyak byte data yang mengikuti, tidak termasuk type atau CRC.
- Type (4 byte, selalu ASCII): kode empat huruf seperti
IHDR(header gambar, selalu pertama),IDAT(data piksel terkompresi, bisa ada beberapa), atauIEND(menandai akhir file). - Data: apa pun yang ditentukan tipe chunk itu. Data
IHDRadalah lebar, tinggi, bit depth, dan tipe warna, selalu dengan tata letak tetap yang sama. - CRC (4 byte): checksum dari type dan data, sehingga decoder dapat mendeteksi chunk yang korup alih-alih salah membacanya secara diam-diam.
Itulah keseluruhan formatnya. Decoder PNG hanya menelusuri chunk demi chunk, membaca length untuk tahu seberapa jauh harus melompat, hingga menemukan IEND.
ZIP: local header, lalu direktori di akhir
Arsip ZIP menyimpan setiap file dengan local file header-nya sendiri, ditandai dengan tanda tangan 50 4B 03 04 (PK di awal adalah rujukan ke Phil Katz, pencipta format ini). Header itu mencakup nama file, metode kompresi, serta ukuran terkompresi dan tak terkompresi, langsung diikuti oleh data terkompresi file tersebut.
Bagian yang membingungkan orang: ukuran dan checksum per-file di local header terkadang bernilai nol, dengan nilai sebenarnya disimpan kemudian dalam sebuah “data descriptor”, karena ZIP dirancang untuk mendukung penulisan streaming di mana ukuran akhir belum diketahui hingga data selesai ditulis. Daftar definitif tentang apa yang sebenarnya ada di dalam arsip berada dalam sebuah central directory di ujung akhir file, yang juga menjadi alasan mengapa beberapa ZIP yang korup atau terpotong bisa tampak seolah memiliki isi saat Anda memindai dari awal, tetapi gagal terbuka, karena alat yang Anda pakai membaca central directory terlebih dahulu dan bagian itu hilang atau rusak.
Mach-O: magic number, lalu load command
Mach-O adalah format executable yang digunakan macOS untuk biner terkompilasi. Ia dibuka dengan magic number yang memberi tahu loader dua hal sekaligus: apakah 32-bit atau 64-bit, dan urutan byte mana yang digunakan sisa file. 0xFEEDFACE adalah 32-bit, 0xFEEDFACF adalah 64-bit, dan jika Anda melihat byte-nya terbalik (0xCEFAEDFE atau 0xCFFAEDFE), itu berarti file ditulis dalam urutan byte yang berlawanan dengan mesin yang membacanya.
Setelah magic number datang header tetap (tipe CPU, tipe file, dan jumlah load command), diikuti sebanyak itu load command secara berurutan. Load command adalah cara file Mach-O menjelaskan segala sesuatu yang dibutuhkan loader: segmen mana yang dipetakan ke memori, pustaka dinamis mana yang ditautkan, di mana entry point-nya. Idenya serupa dengan chunk PNG: header tetap, lalu rangkaian rekaman yang mendeskripsikan dirinya sendiri, masing-masing memberi tahu pembaca berapa banyak yang harus dilewati untuk mencapai yang berikutnya.
Melihatnya sendiri
Tidak satu pun dari ini memerlukan penulisan parser. Buka PNG, ZIP, atau file Mach-O mana pun di Hexter dan tab Analyze mengenali format secara otomatis, menelusuri struktur chunk atau load command sebenarnya dan menampilkannya sebagai pohon di samping hex mentah, sehingga Anda dapat mengeklik sebuah field dan melihat persis byte mana asalnya. Ini baca-saja secara default, jadi ini benar-benar aman dilakukan pada file sungguhan, biner aplikasi, tangkapan layar, arsip yang Anda unduh, tanpa risiko mengubahnya.
Jika Anda ingin memverifikasi hal di atas secara manual: buka sebuah PNG dan periksa bahwa delapan byte pertama cocok dengan tanda tangan, lalu lihat byte 8 hingga 11 (length dari chunk pertama) dan byte 12 hingga 15 (type-nya, yang seharusnya terbaca IHDR). Ini latihan yang cukup kecil untuk dikerjakan dalam beberapa menit, dan merupakan cara yang benar-benar berguna untuk memahami format file yang telah Anda gunakan seumur hidup tetapi belum pernah benar-benar Anda lihat.