Сокрытие архива в JPEG файле(реализация C++)

C++   16 января 2012  Автор статьи:  
geekbrains.ru/

В данной работе мы самым подробным образом рассмотрим один из методов скрытия информации. Он заключается в сокрытие архива с данными внутри графического файла формата JPEG. Данный метод возможен благодаря тому, что архив может быть прочитан даже в том случае, если в файле до блока, где начинается сам архив, хранится какая-либо другая информация. В нашем примере мы будем работать с расширениями «rar» и «jpeg». Для начала рассмотрим возможность применения данного метода с помощью использования командной строки.

Сначала поместим файлы, которые нам необходимо скрыть в архив с расширением «rar», после чего выберем картинку с расширением «jpeg» и поместим оба файла в папку. Затем в меню пуск нажмите «Выполнить» и наберите «cmd». После этих действий перед вами появится командная строка, следующим шагом является переход в папку, куда мы предварительно поместили наш архив и картинку. Для этого прописываем команду cd и путь к папке . Затем выполняем операцию копирования объектов в новый объект. Для этого вызываем функцию copy /b и указываем файлы которые мы хотим копировать между файлами пишем знак «+» затем через пробел пишем название нового файла с расширением jpeg и нажимаем «Enter» (пример: copy /b test.jpg+secret.rar  ouput.jpg).Стоит заметить, что при копировании необходимо сначала указывать графическое изображение, а потом архив. После проделанных действий в папке где раньше находились картинка и архив, появится еще одна картинка. Если мы просто откроем ее с помощью клика мыши, она откроется в графическом редакторе без всяких искажений изображения. Но если мы попытаемся открыть ее с помощью архиватора «Winrar», то она откроется как архив, и мы увидим скрытые нами файлы.

Одним из минусов данного метода является довольно утомительная процедура набора команд через командную строку. Для того чтобы избавиться от этого недостатка в моей работе реализована программа, использование которое более удобно, нежели работа с командной строкой. Для написания программы мною была использована среда разработки «C++ Builder 6». Так как в языке C++ удобно реализована работа с файлами, а данная реализация C++ наилучшим образом подходит для реализации графического интерфейса.  Графический интерфейс данного приложения состоит из 4 кнопок и 4 полей для ввода и вывода текста. Кнопка «Выбрать картинку» отвечает за выбор графического файла, который будет использоваться в качестве контейнера. После нажатия данной кнопки, осуществляется метод «Execute()» у компонента «OpenDialog1» и на экране появится окно с проводником, где вам необходимо выбрать непосредственно сам файл. После этого аналогичным образом выбирается и архив который мы будем скрывать путем нажатия кнопки «выбрать архив», за выбор этого файла отвечает аналогичный метод у компонента «OpenDialog2»  . После выбора файлов необходимо выбрать название нового файла и место его расположения. Для этого в программе предусмотрена кнопка «Выбрать папку для сохранения и имя файла» после ее нажатия перед вами появится уже знакомое вам окно проводника, в котором вы должны выбрать папку для хранения создаваемого файла и непосредственно его название и расширение в нашем случае необходимо указать расширение «jpeg». В момент нажатия в программе используется метод «Execute()» у компонента «SaveDialog1»  . После того как мы выбрали оба файла и имя создаваемого файла с его местонахождением в соответствующих полях появятся абсолютные адреса этих файлов. Так же эти адреса будут записаны в соответствующие переменные. После выполнения этих действий достаточно нажать кнопку скрыть, и начнется выполнение алгоритма по скрытию файла. Давайте рассмотрим его подробнее. Первым делом программа создает указатель на файл с картинкой, используя адрес введенный пользователем, далее этот файл записывается в байт массив. Далее тоже действие производится с файлом содержащем архив, таким образом, мы получаем два байт массива. После этого необходимо создать по адресу, который указал пользователь новый файл, далее мы последовательно записываем два массива в третий массив который был предварительно создан, и в заключении мы записываем данные третьего массива непосредственно в сам файл. Если программе удалось создать новый файл со скрытыми данными, то она выведет сообщение об успешном сокрытии, в противном случае сообщение об ошибке.

Давайте рассмотрим плюсы и минусы данного метода, с одно стороны даже программная реализация  данного метода не должна вызвать особых сложностей у людей достаточно хорошо знакомых с языками программирования высокого уровня, что несомненно является большим плюсом данного метода. Так же простоту доступа к скрытым данным можно отнести к плюсам данного метода. Но любой квалифицированный хакер легко вычислит данный метод. Для этого достаточно просмотреть код данного приложения, или же просто написать небольшую программу, которая будет просматривать все графические файлы компьютера на предмет их возможного открытия через архиватор. Из вышесказанного можно сделать довольно однозначный вывод, если вам необходим способ, который помог бы вам скрыть некие файлы небольшого размера от ваших родственников или друзей, который не обладают достаточной квалификацией в сфере информационных технологий, то данный способ идеально подходит для этого. Но для скрытия ценной информации, касающейся номеров кредитных карт, паролей или чего-то подобного, данный способ не является надежным, и я не советую использовать его в таких целях. Стоит отметить, что этот метод возможно реализовать не только с расширением «jpeg», но и с другими графическими форматами.

#include
#pragma hdrstop
#include "kursach.h"
#include
#include
#include

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include ;

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

int inf=100000000;

void __fastcall TForm1::Button1Click(TObject *Sender)

{

//OpenDialog1->Execute();

String s2,s1;

s1=Edit1->Text;

s2= Edit2->Text;

FILE *fp1;

if((fp1=fopen(s1.c_str(), "rb"))==NULL){

Edit3->Text="Произошла ошибка при загрузке картинки";

}

byte* file1=new byte[inf];

int n1=fread(file1,sizeof(byte),inf,fp1);

FILE *fp2;

if((fp2=fopen(s2.c_str(), "rb"))==NULL){

Edit3->Text="Произошла ошибка при загрузке архива";

}

String s3=SaveDialog1->FileName;

byte* file2=new byte[inf];

int n2=fread(file2,sizeof(byte),inf,fp2);

FILE *fp3;

if((fp3=fopen(s3.c_str(), "wb+"))!=NULL){ Edit3->Text="Произошла ошибка при создании файла";

}

byte* file3=new byte[n1+n2];

for(int i=0;iText="Создание файла выполнено успешно";};

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)

{

OpenDialog1->Execute();

Edit1->Text= OpenDialog1->FileName;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

OpenDialog1->Execute();

Edit2->Text= OpenDialog1->FileName;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)

{

SaveDialog1->Execute();}

Научиться программировать

  • на Delphi

  • на Java

  • на C++

geekbrains.ru/
geekbrains.ru/