Steganography ayon sa mga file: direktang pagtatago ng data sa mga sektor

Isang maikling paunang salita

Ang steganography, kung may hindi nakakaalala, ay nagtatago ng impormasyon sa ilang lalagyan. Halimbawa, sa mga larawan (tinalakay dito ΠΈ dito). Maaari mo ring itago ang data sa mga talahanayan ng serbisyo ng file system (ito ay isinulat tungkol sa dito), at kahit na sa mga packet ng serbisyo ng TCP protocol. Sa kasamaang palad, ang lahat ng mga pamamaraang ito ay may isang disbentaha: upang hindi mahahalata na "ipasok" ang impormasyon sa isang lalagyan, kailangan mo ng mga tusong algorithm na isinasaalang-alang ang mga kakaiba ng panloob na istraktura ng lalagyan. At lumitaw ang mga problema sa paglaban ng lalagyan sa pagmamanipula: halimbawa, kung bahagyang i-edit mo ang larawan, mawawala ang nakatagong impormasyon.

Posible bang gawin kahit papaano nang walang tusong mga algorithm at banayad na pagmamanipula sa data, at tinitiyak pa rin ang pag-andar ng lalagyan at isang katanggap-tanggap na antas ng seguridad ng nakatagong data? Sa hinaharap, sasabihin ko - oo, kaya mo! Mag-aalok pa ako ng utility.

Mga madugong detalye ng pamamaraan

Ang pangunahing ideya ay kasing simple ng isang suntok sa noo: may mga lugar sa disk na hindi kailanman sinusulatan ng operating system (o nagsusulat sa mga bihirang kaso). Upang maiwasan ang pangangailangang hanapin ang mga lugar na ito gamit ang mga tusong algorithm, gagamitin namin ang redundancy - iyon ay, ido-duplicate namin ang aming nakatagong impormasyon nang marami, maraming beses sa lahat ng sektor ng disk. Pagkatapos, sa ibabaw ng lahat ng karangyaan na ito, maaari kang lumikha ng mga kinakailangang partisyon, mag-format ng mga file system, magsulat ng mga file at mag-install ng mga OS - pareho, bahagi ng lihim na data ang mai-save at maaaring makuha, at ang paulit-ulit na pagdoble ay makakatulong sa amin pagsamahin ang orihinal na kabuuan mula sa mga piraso.

Ang bentahe ng pamamaraang ito ay halata: hindi kami nakadepende sa format ng file, o kahit sa uri ng file system na ginamit.

Ang mga disadvantages ay din, sa palagay ko, halata:

  • Mababago lamang ang lihim na data sa pamamagitan ng ganap na muling pagsusulat sa buong disk, na sinusundan ng muling paggawa ng nilalamang nakikita ng user. Gayunpaman, hindi ka maaaring gumamit ng software na muling nililikha ang disk mula sa isang imahe: ito ay muling gagawa ng nakaraang lihim na data.
  • Kung mas malaki ang dami ng lihim na data, mas malaki ang posibilidad na mawala ang ilang impormasyon.
  • Ang pagkuha ng data mula sa disk ay maaaring tumagal ng mahabang panahon. Mula sa ilang minuto hanggang ilang araw (malalaki ang mga modernong disk).

Ngayon ay lumipat tayo sa mga detalye.

Malinaw na kung pahid ka lang ng lihim na data sa buong disk, ito ay maitatago lamang sa mata. Kung nilagyan mo ang iyong tingin ng, sabihin nating, isang disk editor, ang data ay lilitaw sa lahat ng kaluwalhatian nito. Samakatuwid, magandang ideya na i-encrypt ang data upang hindi ito lumabas. Mag-e-encrypt kami nang simple, ngunit masarap: gamit ang aes256-cbc algorithm. Hihilingin namin sa user ang encryption key at hayaan siyang makabuo ng magandang password.

Ang susunod na tanong ay kung paano natin makikilala ang "magandang" data mula sa masamang data. Narito ang isang checksum ay makakatulong sa amin, ngunit hindi isang simple, ngunit SHA1. At ano? Ito ay sapat na mabuti para sa git, kaya ito ay angkop din sa amin. Nagpasya: binibigyan namin ang bawat naka-imbak na piraso ng impormasyon ng checksum, at kung pagkatapos ng pag-decryption ay tumugma ito, nangangahulugan ito na matagumpay ang pag-decryption.

Kakailanganin mo rin ang numero ng fragment at ang kabuuang haba ng lihim na data. Fragment number - upang subaybayan kung aling mga piraso ang na-decrypt na namin at kung alin ang naiwan. Ang kabuuang haba ay magiging kapaki-pakinabang sa amin kapag pinoproseso ang huling fragment, upang hindi magsulat ng hindi kinakailangang data (iyon ay, padding). Well, dahil mayroon pa kaming header, idaragdag namin ang pangalan ng lihim na file doon. Ito ay magiging kapaki-pakinabang pagkatapos ng pag-decryption, upang hindi hulaan kung paano ito buksan.

Pagsubok sa pamamaraan sa pagsasanay

Upang suriin, kunin natin ang pinakakaraniwang medium - isang flash drive. Nakakita ako ng luma na may kapasidad na 1 GB, na medyo angkop para sa mga eksperimento. Kung ikaw, tulad ko, ay may ideya na huwag mag-abala sa pisikal na media, ngunit subukan ito sa isang file - isang imahe ng disk, pagkatapos ay sasabihin ko kaagad: hindi ito gagana. Kapag nagfo-format ng ganoong "disk," nililikha muli ng Linux ang file, at ang lahat ng hindi nagamit na sektor ay mapupuno ng mga zero.

Bilang isang makina na may Linux, sa kasamaang-palad, kinailangan kong gumamit ng weather station sa Raspberry Pi 3 na nakahiga sa balkonahe. Walang masyadong memory doon, kaya hindi namin itatago ang malalaking file. Nililimitahan namin ang aming sarili sa maximum na laki na 10 megabytes. Wala ring punto sa pagtatago ng mga file na masyadong maliit: ang utility ay nagsusulat ng data sa disk sa 4 KB na mga kumpol. Samakatuwid, sa ibaba ay lilimitahan natin ang ating sarili sa isang 3 kb na file - umaangkop ito sa isang ganoong kumpol.

Kukutyain namin ang flash drive sa mga yugto, sinusuri pagkatapos ng bawat yugto kung ang nakatagong impormasyon ay nababasa:

  1. Mabilis na pag-format sa FAT16 na format na may laki ng cluster na 16 KB. Ito ang inaalok ng Windows 7 na gawin sa isang flash drive na walang file system.
  2. Ang pagpuno sa flash drive ng lahat ng uri ng basura ng 50%.
  3. Ang pagpuno sa flash drive ng lahat ng uri ng basura ng 100%.
  4. "Mahabang" pag-format sa FAT16 na format (patungan ang lahat).

Ang unang dalawang pagsubok, tulad ng inaasahan, ay natapos sa kumpletong tagumpay: ang utility ay matagumpay na nakakuha ng 10 megabytes ng lihim na data mula sa flash drive. Ngunit pagkatapos mapuno ang flash drive sa kapasidad ng mga file, naganap ang isang pagkabigo:

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

Gaya ng nakikita mo, 158 cluster lang ang matagumpay na na-decrypt (632 kilobytes ng raw data, na nagbibigay ng 636424 bytes ng payload). Malinaw na walang paraan upang makakuha ng 10 megabytes dito, ngunit sa mga kumpol na ito ay may malinaw na mga duplicate. Hindi ka makakabawi ng 1 megabyte sa ganitong paraan. Ngunit maaari naming garantiya na mababawi namin ang 3 kilobytes ng lihim na data mula sa isang flash drive kahit na matapos itong ma-format at nakasulat sa kapasidad. Gayunpaman, ipinapakita ng mga eksperimento na posible na kunin ang isang file na 120 kilobytes ang haba mula sa naturang flash drive.

Ang huling pagsubok, sa kasamaang-palad, ay nagpakita na ang buong flash drive ay na-overwrite:

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

Wala ni isang kumpol ang nakaligtas... Malungkot, ngunit hindi trahedya! Bago ang pag-format, subukan nating lumikha ng isang partisyon sa flash drive, at nasa loob na ito ng isang file system. Siyanga pala, nanggaling ito sa factory na may eksaktong ganitong pag-format, kaya wala kaming ginagawang kahina-hinala.
Ito ay lubos na inaasahan na ang magagamit na espasyo sa flash drive ay bahagyang nabawasan.

Inaasahan din na ang 10 megabytes ay hindi maitatago sa isang ganap na buong disk. Ngunit ngayon ang bilang ng matagumpay na na-decrypt na mga kumpol ay higit sa doble!

Total clusters read: 250752, decrypted: 405

Sa kasamaang palad, imposibleng mag-ipon ng isang megabyte mula sa mga piraso, ngunit madali ang dalawang daang kilobyte.

Well, ang balita tungkol sa huling, ika-4 na tseke, oras na ito ay nagagalak: ganap na pag-format ng tulad ng isang flash drive ay hindi humantong sa pagkawasak ng lahat ng impormasyon! Ang 120 kilobytes ng lihim na data ay akmang akma sa hindi nagamit na espasyo.

Talahanayan ng buod ng pagsubok:

Steganography ayon sa mga file: direktang pagtatago ng data sa mga sektor

Isang maliit na teorya: tungkol sa libreng espasyo at hindi nagamit na mga sektor

Kung nahati mo na ang iyong hard drive sa mga partisyon, maaaring napansin mo na hindi laging posible na ilaan ang lahat ng libreng espasyo sa disk. Palaging nagsisimula ang unang seksyon sa ilang indentation (karaniwang 1 megabyte, o 2048 na sektor). Sa likod ng huling seksyon, nangyayari rin na may nananatiling maliit na "buntot" ng mga hindi nagamit na sektor. At kung minsan may mga gaps sa pagitan ng mga seksyon, bagaman bihira.

Sa madaling salita, may mga sektor sa disk na hindi ma-access sa panahon ng normal na trabaho sa disk, ngunit ang data ay maaaring isulat sa mga sektor na ito! At ibig sabihin ay basahin mo rin ito. Naayos para sa katotohanan na mayroon ding partition table at bootloader code, na matatagpuan sa walang laman na lugar sa simula ng disk.

Magpahinga muna tayo sa mga seksyon at tingnan ang disk mula sa isang bird's eye view, wika nga. Narito mayroon kaming isang walang laman na partisyon sa disk. Gumawa tayo ng file system dito. Maaari ba nating sabihin na ang ilang mga sektor sa disk ay nananatiling hindi nabubura?

E-e-e - drum roll! Ang sagot ay halos palaging oo! Sa katunayan, sa karamihan ng mga kaso, ang paglikha ng isang file system ay nagmumula sa pagsulat lamang ng ilang mga bloke ng impormasyon ng serbisyo sa disk, at kung hindi man ang mga nilalaman ng partisyon ay hindi nagbabago.

At gayundin - puro empirically - maaari nating ipagpalagay na ang file system ay hindi maaaring palaging sumasakop sa lahat ng puwang na inilaan dito hanggang sa huling sektor. Halimbawa, ang isang FAT16 file system na may laki ng cluster na 64 kilobytes ay malinaw na hindi maaaring ganap na sakupin ang isang partition na may sukat na hindi isang multiple ng 64 kilobytes. Sa dulo ng naturang seksyon ay magkakaroon ng isang "buntot" ng ilang mga sektor, hindi naa-access para sa pag-iimbak ng data ng gumagamit. Gayunpaman, ang pagpapalagay na ito ay hindi makumpirma sa eksperimentong paraan.

Kaya, para ma-maximize ang espasyong magagamit para sa steganogram, kailangan mong gumamit ng file system na may mas malaking laki ng kumpol. Maaari ka ring lumikha ng isang partition, kahit na ito ay hindi kinakailangan (sa isang flash drive, halimbawa). Hindi na kailangang lumikha ng mga walang laman na seksyon o mag-iwan ng mga hindi inilalaang lugar - ito ay maakit ang atensyon ng mga interesadong mamamayan.

Utility para sa mga eksperimento

Maaari mong pindutin ang source code ng utility dito

Upang bumuo, kakailanganin mo ng Qt na bersyon 5.0 o mas mataas at OpenSSL. Kung may hindi gumana, maaaring kailanganin mong i-edit ang steganodisk.pro file.

Maaari mong baguhin ang laki ng kumpol mula 4 KB sa, sabihin nating, 512 bytes (sa secretfile.h). Kasabay nito, ang halaga ng impormasyon ng serbisyo ay tataas: ang header at checksum ay sumasakop sa isang nakapirming 68 byte.

Kailangan mong patakbuhin ang utility, siyempre, nang may mga karapatan sa root user, at may pag-iingat. Walang mga itatanong bago i-overwrite ang tinukoy na file o device!

Enjoy.

Pinagmulan: www.habr.com

Magdagdag ng komento