Steganografi mengikut fail: menyembunyikan data secara langsung dalam sektor

Mukadimah ringkas

Steganografi, jika ada yang tidak ingat, menyembunyikan maklumat dalam beberapa bekas. Sebagai contoh, dalam gambar (dibincangkan di sini ΠΈ di sini). Anda juga boleh menyembunyikan data dalam jadual perkhidmatan sistem fail (ini telah ditulis tentang di sini), dan juga dalam paket perkhidmatan protokol TCP. Malangnya, semua kaedah ini mempunyai satu kelemahan: untuk "memasukkan" maklumat secara tidak dapat dilihat ke dalam bekas, anda memerlukan algoritma licik yang mengambil kira keanehan struktur dalaman bekas. Dan masalah timbul dengan rintangan kontena terhadap manipulasi: contohnya, jika anda mengedit sedikit gambar, maklumat tersembunyi akan hilang.

Adakah mungkin untuk melakukan tanpa algoritma licik dan manipulasi halus dengan data, dan masih memastikan kefungsian bekas dan tahap keselamatan data tersembunyi yang boleh diterima? Melihat ke hadapan, saya akan katakan - ya, anda boleh! Saya juga akan menawarkan utiliti.

Perincian berdarah kaedah

Idea asas adalah semudah pukulan ke dahi: terdapat kawasan pada cakera yang sistem pengendalian tidak pernah menulis (atau menulis dalam kes yang jarang berlaku). Untuk mengelakkan keperluan untuk mencari kawasan ini menggunakan algoritma licik, kami akan menggunakan redundansi - iaitu, kami akan menduplikasi maklumat tersembunyi kami berkali-kali merentasi semua sektor cakera. Kemudian, di atas semua kemegahan ini, anda boleh membuat partition yang diperlukan, memformat sistem fail, menulis fail dan memasang OS - semuanya sama, sebahagian daripada data rahsia akan disimpan dan boleh diambil semula, dan penduaan berulang akan membantu kami meletakkan keseluruhan asal bersama-sama daripada kepingan.

Kelebihan kaedah ini adalah jelas: kami tidak bergantung pada format fail, malah pada jenis sistem fail yang digunakan.

Kelemahannya juga, saya fikir, jelas:

  • Data rahsia hanya boleh diubah dengan menulis semula keseluruhan cakera, diikuti dengan mencipta semula kandungan yang boleh dilihat oleh pengguna. Walau bagaimanapun, anda tidak boleh menggunakan perisian yang mencipta semula cakera daripada imej: ia juga akan mencipta semula data rahsia sebelumnya.
  • Lebih besar jumlah data rahsia, lebih besar kemungkinan kehilangan beberapa maklumat.
  • Mendapatkan semula data daripada cakera boleh mengambil masa yang lama. Dari beberapa minit hingga beberapa hari (cakera moden adalah besar).

Sekarang mari kita beralih kepada spesifik.

Adalah jelas bahawa jika anda hanya menconteng data rahsia ke seluruh cakera, ia hanya akan disembunyikan dari mata kasar. Jika anda melengkapkan pandangan anda dengan, katakan, editor cakera, data akan muncul dalam semua kemuliaannya. Oleh itu, adalah idea yang baik untuk menyulitkan data supaya ia tidak muncul. Kami akan menyulitkan secara ringkas, tetapi menarik: menggunakan algoritma aes256-cbc. Kami akan meminta pengguna untuk kunci penyulitan dan biarkan dia menghasilkan kata laluan yang baik.

Soalan seterusnya ialah bagaimana kita boleh membezakan data "baik" daripada data buruk. Di sini checksum akan membantu kami, tetapi bukan yang mudah, tetapi SHA1. Dan apa? Ia cukup baik untuk git, jadi ia juga sesuai dengan kita. Memutuskan: kami menyediakan setiap maklumat yang disimpan dengan checksum, dan jika selepas penyahsulitan ia sepadan, ini bermakna penyahsulitan berjaya.

Anda juga memerlukan nombor serpihan dan jumlah panjang data rahsia. Nombor serpihan adalah untuk menjejaki bahagian mana yang telah kita tafsirkan dan mana yang tersisa. Jumlah panjang akan berguna kepada kami apabila memproses serpihan terakhir, supaya tidak menulis data yang tidak perlu (iaitu, padding). Oleh kerana kami masih mempunyai pengepala, kami akan menambah nama fail rahsia di sana. Ia akan berguna selepas penyahsulitan, supaya tidak meneka cara membukanya.

Menguji kaedah dalam amalan

Untuk menyemak, mari kita ambil medium yang paling biasa - pemacu kilat. Saya dapati yang lama dengan kapasiti 1 GB, yang agak sesuai untuk eksperimen. Jika anda, seperti saya, datang dengan idea untuk tidak mengganggu media fizikal, tetapi mengujinya pada fail - imej cakera, maka saya akan berkata dengan segera: ia tidak akan berfungsi. Apabila memformat "cakera" sedemikian, Linux mencipta fail sekali lagi, dan semua sektor yang tidak digunakan akan diisi dengan sifar.

Sebagai mesin dengan Linux, malangnya, saya terpaksa menggunakan stesen cuaca di Raspberry Pi 3 yang terletak di balkoni. Tidak ada banyak memori di sana, jadi kami tidak akan menyembunyikan fail besar. Kami mengehadkan diri kami kepada saiz maksimum 10 megabait. Tidak ada gunanya menyembunyikan fail yang terlalu kecil: utiliti menulis data ke cakera dalam gugusan 4 KB. Oleh itu, di bawah ini kita akan mengehadkan diri kita kepada fail 3 kb - ia sesuai dengan satu kelompok tersebut.

Kami akan mengejek pemacu denyar secara berperingkat, menyemak selepas setiap peringkat sama ada maklumat tersembunyi boleh dibaca:

  1. Pemformatan pantas dalam format FAT16 dengan saiz kelompok 16 KB. Inilah yang Windows 7 tawarkan untuk dilakukan dengan pemacu kilat yang tidak mempunyai sistem fail.
  2. Mengisi pemacu kilat dengan semua jenis sampah sebanyak 50%.
  3. Mengisi pemacu kilat dengan semua jenis sampah sebanyak 100%.
  4. Pemformatan "Panjang" dalam format FAT16 (menimpa semuanya).

Dua ujian pertama, seperti yang dijangkakan, berakhir dengan kemenangan lengkap: utiliti itu berjaya mengeluarkan 10 megabait data rahsia dari pemacu denyar. Tetapi selepas pemacu denyar diisi sehingga kapasiti dengan fail, kegagalan berlaku:

Total clusters read: 250752, decrypted: 158
ERROR: cannot write incomplete secretFile

Seperti yang anda lihat, hanya 158 kluster berjaya dinyahsulit (632 kilobait data mentah, yang memberikan 636424 bait muatan). Adalah jelas bahawa tiada cara untuk mendapatkan 10 megabait di sini, namun di antara kluster ini terdapat pendua yang jelas. Anda tidak boleh memulihkan 1 megabait dengan cara ini. Tetapi kami boleh menjamin bahawa kami akan memulihkan 3 kilobait data rahsia daripada pemacu kilat walaupun selepas ia diformat dan ditulis mengikut kapasiti. Walau bagaimanapun, eksperimen menunjukkan bahawa agak mungkin untuk mengekstrak fail sepanjang 120 kilobait daripada pemacu kilat sedemikian.

Ujian terakhir, malangnya, menunjukkan bahawa keseluruhan pemacu kilat telah ditimpa:

$ sudo ./steganodisk -p password /dev/sda
Device size: 250752 clusters
250700 99%
Total clusters read: 250752, decrypted: 0
ERROR: cannot write incomplete secretFile

Tidak ada satu kelompok pun yang terselamat... Sedih, tetapi tidak tragis! Sebelum memformat, mari cuba buat partition pada pemacu kilat, dan sudah ada sistem fail di dalamnya. By the way, ia datang dari kilang dengan betul-betul pemformatan ini, jadi kami tidak melakukan apa-apa yang mencurigakan.
Adalah agak dijangka bahawa ruang yang ada pada pemacu kilat telah berkurangan sedikit.

Ia juga agak dijangka bahawa 10 megabait tidak dapat disembunyikan pada cakera penuh sepenuhnya. Tetapi kini bilangan kluster yang berjaya dinyahsulit telah meningkat lebih daripada dua kali ganda!

Total clusters read: 250752, decrypted: 405

Malangnya, adalah mustahil untuk memasang megabait daripada kepingan, tetapi dua ratus kilobait adalah mudah.

Nah, berita mengenai cek ke-4 yang terakhir, kali ini menggembirakan: memformat sepenuhnya pemacu kilat sedemikian tidak membawa kepada pemusnahan semua maklumat! 120 kilobait data rahsia sesuai dengan sempurna ke dalam ruang yang tidak digunakan.

Jadual ringkasan ujian:

Steganografi mengikut fail: menyembunyikan data secara langsung dalam sektor

Sedikit teori: tentang ruang kosong dan sektor yang tidak digunakan

Jika anda pernah membahagikan cakera keras anda kepada sekatan, anda mungkin perasan bahawa tidak selalu mungkin untuk memperuntukkan semua ruang kosong pada cakera. Bahagian pertama sentiasa bermula dengan beberapa lekukan (biasanya 1 megabait, atau 2048 sektor). Di sebalik bahagian terakhir, ia juga berlaku bahawa masih terdapat "ekor" kecil sektor yang tidak digunakan. Dan kadang-kadang terdapat jurang antara bahagian, walaupun jarang.

Dalam erti kata lain, terdapat sektor pada cakera yang tidak boleh diakses semasa kerja biasa dengan cakera, tetapi data boleh ditulis ke sektor ini! Dan itu bermakna membacanya juga. Dilaraskan untuk fakta bahawa terdapat juga jadual partition dan kod pemuat but, yang terletak di kawasan kosong pada permulaan cakera.

Mari kita berehat sebentar dari bahagian dan lihat cakera dari pandangan mata burung, boleh dikatakan. Di sini kita mempunyai partition kosong pada cakera. Mari buat sistem fail di dalamnya. Bolehkah kita mengatakan bahawa sesetengah sektor pada cakera kekal tidak dipadamkan?

E-e-e - gendang gendang! Jawapannya hampir selalu ya! Malah, dalam kebanyakan kes, mencipta sistem fail hanya menulis beberapa blok maklumat perkhidmatan ke cakera, dan sebaliknya kandungan partition tidak berubah.

Dan juga - secara empirik semata-mata - kita boleh mengandaikan bahawa sistem fail tidak boleh sentiasa menduduki semua ruang yang diperuntukkan kepadanya sehingga sektor terakhir. Sebagai contoh, sistem fail FAT16 dengan saiz kluster 64 kilobait jelas tidak dapat sepenuhnya menduduki partition dengan saiz bukan gandaan 64 kilobait. Pada penghujung bahagian sedemikian mesti ada "ekor" beberapa sektor, tidak boleh diakses untuk menyimpan data pengguna. Walau bagaimanapun, andaian ini tidak dapat disahkan secara eksperimen.

Jadi, untuk memaksimumkan ruang yang tersedia untuk steganogram, anda perlu menggunakan sistem fail dengan saiz kelompok yang lebih besar. Anda juga boleh membuat partition, walaupun ini tidak perlu (pada pemacu kilat, sebagai contoh). Tidak perlu membuat bahagian kosong atau meninggalkan kawasan yang tidak diperuntukkan - ini akan menarik perhatian warganegara yang berminat.

Utiliti untuk eksperimen

Anda boleh menyentuh kod sumber utiliti di sini

Untuk membina, anda memerlukan Qt versi 5.0 atau lebih tinggi dan OpenSSL. Jika sesuatu tidak berjaya, anda mungkin perlu mengedit fail steganodisk.pro.

Anda boleh menukar saiz kluster daripada 4 KB kepada, katakan, 512 bait (dalam secretfile.h). Pada masa yang sama, kos maklumat perkhidmatan akan meningkat: pengepala dan checksum menduduki 68 bait tetap.

Anda perlu menjalankan utiliti, sudah tentu, dengan hak pengguna root, dan dengan berhati-hati. Tiada soalan akan ditanya sebelum menulis ganti fail atau peranti yang ditentukan!

Selamat menikmati.

Sumber: www.habr.com

Tambah komen