
Kita hidup di masa yang menakjubkan. Di sekitar kita terdapat banyak teknologi: telepon, komputer, jam tangan pintar, dan gadget lainnya. Setiap hari, pabrikan merilis lebih banyak perangkat ke pasar. Kebanyakan dari mereka ditakdirkan untuk hidup yang pendek dan cerah (atau tidak begitu): perusahaan pemasaran yang kuat pada saat rilis, 1-2 tahun dukungan penuh oleh produsen, dan kemudian lambat terlupakan. Perangkat sederhana dapat bekerja selama bertahun-tahun setelah berakhirnya periode dukungan resmi. Dengan perangkat pintar, semakin sulit. Ada baiknya jika gadget setidaknya terus berfungsi setelah memutuskan hubungan server / layanan pabrikan. Dan beruntung jika pembaruan OS, driver atau perangkat lunak lain berikutnya tidak mengalahkan kompatibilitas.
Sayangnya, peristiwa semakin berkembang sesuai dengan skenario pesimistis. Dan 5-10 tahun setelah pembelian, kami memiliki perangkat suara teknis di tangan kami, yang bagaimanapun tidak dapat digunakan karena kurangnya dukungan perangkat lunak. Tentu saja, gadget yang rusak tidak menyenangkan. Tetapi jauh lebih tidak menyenangkan jika ada data pengguna dalam format yang tidak kompatibel dengan apa pun. Data ini dapat dianggap hilang jika perangkat berhenti berfungsi. Dalam kasus saya, yang terburuk belum terjadi, tetapi bel alarm sudah berdering.
Jadi, ada perusahaan terkenal Korg, yang memproduksi peralatan musik yang sangat berkualitas tinggi. Pada 2010, saya membeli synthesizer dari perusahaan ini untuk berlatih musik sebagai hobi. Korg microstation adalah model yang cukup canggih. Antara lain, ia memiliki sequencer on board untuk merekam treknya dan dapat menulis data ke kartu memori dalam format SNG yang dipatenkan. Dimungkinkan untuk mengekspor ke format midi yang umum, tetapi hampir semua metadata hilang: informasi tentang efek dan filter yang dilapiskan, berbagai pengaturan instrumen virtual, dll. Masalah utama bagi saya pribadi adalah kecepatan transisi untuk merekam ide-ide musik. Muse adalah ciptaan yang aneh, dan sebagian besar waktu saya menemukan ide yang menarik hanya dengan berimprovisasi atau memainkan sesuatu yang tidak rumit. Semakin cepat saya menekan tombol rekam tanpa berkeliaran di sekitar menu, semakin besar kemungkinan saya dapat mengulangi dan merekam fragmen yang menarik, yang di masa depan mungkin menjadi bagian dari pekerjaan yang lengkap. Tentu saja, pendekatan ini tidak sempurna, tetapi kita berbicara tentang hobi. Dengan satu atau lain cara, selama hampir sepuluh tahun, saya telah mengumpulkan sekitar seribu sketsa dan sketsa musik dalam format SNG.
Bel berbunyi dalam bentuk serangkaian gangguan synthesizer, yang membutuhkan perangkat berkedip. Dan saya berpikir untuk mengubah semua data yang terakumulasi ke dalam format Midi, terlebih lagi karena itu akan membuatnya lebih mudah untuk menyimpan, mengatur dan mengeditnya. Pencarian konverter di Google tidak memberikan apa-apa. Ada banyak permintaan di semua jenis forum, sejarah telah berlangsung selama 20 tahun, jika tidak lebih. Yang saya temukan hanyalah utilitas Windows kuno milik orang lain, secara alami tidak kompatibel dengan file saya.
Dan kemudian saya memutuskan untuk mencoba melihat apa sebenarnya format SNG ini? Mungkin di suatu tempat di dalam sana ada data MIDI normal yang dapat Anda tarik dan simpan dengan mudah?
Upaya untuk memecahkan masalah "dahi"
Jadi, dari instruksi untuk synthesizer, Anda dapat mengetahui bahwa format SNG adalah sebuah wadah di mana apa yang disebut "lagu" disimpan. Setiap lagu berisi 16 trek sequencer dengan data musik, serta pengaturan untuk suara dan efek. Saat mengekspor ke format Midi melalui menu synthesizer, setiap "lagu" diekspor ke file .MID yang terpisah, dan semua pengaturan untuk suara dan efek hilang. Karena Saya memutar ide saya dalam bentuk paling sederhana dan tanpa efek, masalahnya justru sejumlah besar file SNG dan ketidaknyamanan proses konversi manual. Mari kita lihat apakah proses ini dapat dipercepat atau otomatis.
Pertama, mari kita ingat apa itu data MIDI. Sederhananya, ini adalah aliran acara musik: menekan dan melepaskan kunci, menekan dan melepaskan pedal penopang, mengubah tempo, patch (instrumen virtual) dan parameter lainnya. Setiap acara berisi delta waktu dari saat acara dan data sebelumnya, misalnya, intensitas catatan dan nada. Format file midi sangat sederhana: selain header dan data itu sendiri, praktis tidak ada apa-apa di sana.
Pink adalah acara Note On. Kuning pucat adalah delta waktu. Biru - Acara Catatan Mati.Mari kita coba mencari data midi kita di file SNG. Untuk melakukan ini, tulis urutan beberapa catatan pada synthesizer dan ekspor ke kedua format. Karena Karena kami tidak tahu di mana tepatnya data musik berada dalam file biner, kami akan mencoba mengulangi proses dengan urutan catatan yang berbeda.
Selanjutnya saya menggunakan Hex-editor Synalyze It! Kemampuannya di masa depan akan sangat berguna bagi kita. Sementara itu, cukup gunakan fungsi perbandingan biner.

Bahkan, hanya nama "lagu" yang bertepatan. Membandingkan dua file SNG dengan urutan catatan yang berbeda, kita dapat kira-kira menebak di mana tepatnya data musik disimpan, tetapi untuk sekarang ini tidak akan membantu kita dengan cara apa pun - format data berbeda. File itu sendiri sepuluh kali lebih besar daripada file Midi dan tampaknya mengandung banyak informasi tambahan. Anda dapat melihat tanda tangan KORG dalam empat byte pertama dan beberapa baris lainnya, termasuk nama "lagu" dan nama tambalan (nada) yang ditetapkan untuk trek.
Parsing struktur blok data
Ini bisa diselesaikan jika, untungnya, tidak ada alat yang membuatnya relatif mudah untuk menganalisis dan memahami struktur data biner. Program yang sama Synalaze It! Akan membantu kami dengan ini, yang memungkinkan Anda untuk membuat dan menerapkan "tata bahasa" untuk menganalisis file biner.
Tata bahasa adalah struktur deskriptif hirarkis yang memungkinkan Anda untuk merepresentasikan data biner dalam bentuk yang dapat dibaca manusia. Program ini memungkinkan Anda mengunduh tata bahasa untuk beberapa format. Misalnya, untuk midi yang sama:

Untuk format SNG, tidak ada tata bahasa siap pakai yang diharapkan. Baiklah, mari kita lihat apa yang bisa kita ekstrak dari file kita sendiri.
Mari kita mulai dengan judul. Biasanya, bagian ini berisi tanda tangan file, informasi versi, ukuran dan offset blok data. Setelah membandingkan beberapa file SNG yang berbeda, kami menemukan bagian-bagian yang tidak berubah-ubah dan lebih memperhatikan yang berubah

Buat struktur judul di editor tata bahasa. 4 byte pertama jelas merupakan tanda tangan dari file tersebut. Asumsikan 4 byte berikut ini versi. Beberapa puluh byte berikutnya tidak berubah dan tidak mengandung sesuatu yang menarik - kami akan membuatkan mereka binaryData dengan ukuran yang sesuai. Tapi kemudian kesenangan dimulai. Anda dapat melihat beberapa pola dalam perilaku byte di offset 0x13 dan 0x1b. Yang kedua tampaknya sesuai dengan jumlah "lagu" di file kami. Dan yang pertama juga tumbuh dengan jumlah data di header - ini tampaknya menjadi ukuran, hanya hitungan mundur tidak datang dari awal file, tetapi dari byte berikutnya 0x14. Pada tahap ini, kita hanya bisa menebak tentang jenis data numerik. Misalkan ukurannya adalah tipe UInt32, mis. membutuhkan 4 byte. Tambahkan mereka ke struktur kita. Sekarang kita dapat mengatur ukuran struktur header (ukuran + 20).

Tata bahasa dengan struktur tajuk file yang ditambahkan Mari kita lihat apa yang terjadi selanjutnya. Jika Anda melihat lebih dekat, Anda akan melihat bahwa singkatan tiga huruf tersebar di seluruh file: SNG1, SDK1, SGS1, dan sebagainya. Karakter-karakter ini ditemukan di semua file SNG, jadi kita dapat mengasumsikan bahwa ini adalah tanda tangan dari blok tertentu. Selain itu, judul kami berakhir dengan sangat sukses tepat sebelum salah satu dari tanda tangan ini. Bandingkan perilaku 4 byte berikut dalam file dengan ukuran berbeda. Dapat dilihat bahwa nilai meningkat dengan meningkatnya jumlah data.

Beberapa percobaan, analisis, dan perhitungan lagi, dan gambar berikut mulai muncul:

Tampilan bagan alternatif Dengan demikian, file kami terdiri dari hierarki blok yang cukup sederhana. Ada blok induk yang dapat berisi beberapa blok anak. Ada blok daun (dalam terminologi pohon biner) yang tidak mengandung blok lain.
Kemudian keajaiban dimulai.
Dengan hanya beberapa struktur tata bahasa, kita dapat sepenuhnya mem-parsing struktur file blokJadi, buat struktur template DataChunk dengan bidang-bidang berikut (ukurannya ditunjukkan dalam tanda kurung siku):
id: String [4]
ukuran: Int [4]
hierarki: Int [4]
data: struktur
Sekarang buat struktur parentChunk yang mewarisi DataChunk. Di properti hierarki, tentukan Nilai Tetap 0x400 - ini adalah tanda blok induk. Pastikan untuk mencentang kotak Harus cocok.
Demikian pula, buat childChunk. Hierarki dalam kasus ini akan memiliki dua nilai: 0x240100 dan 0x100
Tambahkan referensi ke struktur parentChunk dan childChunk ke struktur data parentChunk - dengan cara ini kita membuat rekursi.
Akhirnya, tambahkan referensi ke struktur parentChunk di simpul utama.

Urutan elemen dalam struktur data parentChunk harus Variabel, juga diharuskan untuk menetapkan jumlah minimum dan maksimum anak-anak dari struktur ini: 0 dan Tidak Terbatas, masing-masing.
Mari kita terapkan perubahannya, dan voila - file kita diuraikan dengan baik ke dalam blok utama

Kami masih belum tahu apa-apa tentang data itu sendiri, tetapi sekarang kami dapat lebih mudah menavigasi dalam file dan fokus pada menemukan informasi yang kami butuhkan.
Parsing blok yang berisi daftar isi file
Untuk pelatihan, mari kita coba menguraikan beberapa blok sederhana, misalnya, SDK1. Rupanya, itu berisi sesuatu seperti daftar isi - daftar lagu dan mungkin beberapa offset / ukuran.

Buat struktur sdk1Chunk yang mewarisi childChunk. Kami akan mengedit bidang ID, yang menunjukkan tanda tangan dari blok kami di bidang Nilai Tetap. Jangan lupa tentang kotak centang Harus cocok. Dalam blok data, seseorang dapat mengamati pola berulang yang cukup jelas: nama "lagu" dan data yang sejauh ini tidak diketahui. Perhatikan bahwa ukuran fragmen berulang adalah 64 byte. Juga, membandingkan versi file dengan jumlah "lagu" yang berbeda, Anda dapat menentukan bahwa nomor tersebut disimpan dalam empat byte pertama. Dengan menggunakan perhitungan sederhana dan membuat beberapa asumsi, kami mendapatkan versi struktur berikut dalam tata bahasa:

Di sini saya membuat struktur anak songInfo 64 byte dan menunjukkan kemampuan untuk mengulangi jumlah kali. Berikut adalah hasil penerapan tata bahasa:

Analisis file lebih lanjut tetap menjadi masalah teknis. Saya mengubah pengaturan umum "lagu" dan parameter masing-masing trek pada synthesizer. Dengan membandingkan versi file dengan berbagai perubahan, Anda dapat meningkatkan dan memperbaiki tata bahasa. Setelah jumlah iterasi yang cukup besar, hampir tidak ada bagian data yang tidak dikenal dalam file. Saya agak terbawa oleh proses dan memilah-milah hampir semua bagian file, meskipun ini tidak diperlukan untuk tugas asli.
Sebagian kecil tata bahasa file SNG setelah 8 jam penguraian Saya akan melewatkan detail dari proses ini - di masa depan kita akan fokus pada analisis data musikal secara langsung.
Tetapi lebih lanjut tentang itu di bagian selanjutnya. Di sana kita akan menghadapi tugas konversi data yang menarik (sangat cocok untuk wawancara), kami akan mencoba menyelesaikannya dengan skrip kecil dan kami akan mendengar hasil konversi tes yang agak tidak biasa.
Hasil Awal
Kebutuhan untuk membalikkan file biner dapat terjadi secara tak terduga. Misalnya, untuk menganalisis firmware perangkat, mengonversi dari format data langka, menganalisis ancaman digital, atau bahkan mengubah secara sepintas game save. Alat modern memungkinkan Anda untuk memecahkan masalah ini dengan cepat dan efisien. Sekitar 10 tahun yang lalu, saya sedang meneliti firmware laptop dan proses ini bisa memakan waktu beberapa minggu. Kemudian diminta untuk menulis skrip secara manual untuk menganalisis blok data dan menyusun struktur. Dengan pendekatan parsial otomatis baru, saya membuat tata bahasa file yang hampir lengkap hanya dalam beberapa hari.
Anda dapat memulai analisis file biner dengan mencari string - mereka dapat memberikan petunjuk pertama dan mempercepat proses analisis. Seringkali file biner terdiri dari blok data yang disusun dalam struktur hierarkis atau linier. Jika Anda berurusan dengan struktur ini, maka analisis lebih lanjut akan jauh lebih mudah. Header file dapat memberikan petunjuk tentang offset / ukuran blok data. Pada tahap pertama, masuk akal untuk fokus pada deskripsi struktur dan balok yang jelas. Tugas analisis sangat disederhanakan oleh kemampuan untuk membuat versi baru file dengan pengaturan, parameter, data yang berbeda. Ada sejumlah kesulitan yang terkait dengan tipe data yang tidak diketahui dan urutan byte dalam representasi biner mereka (Endianness). Kami akan menyentuh pertanyaan-pertanyaan ini di bagian selanjutnya.
Bacaan yang Disarankan
Andreas Pehnack. Cara Pendekatan Analisis Format File Biner