Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Стеганография


Автор: Urod 10.4.2004, 23:55
[color=crimson][/color][size=8][/size]
sad.gif ОЧЕНЬ нужны материлы про стеганографию в исполняемых файлах!!!!!!!!!!! У кого что-то есть (ссылки, проги, статьи), подскажите.

Автор: cardinal 11.4.2004, 01:41
Читай здесь:
http://forum.vingrad.ru/index.php?showtopic=17367
(это свое форумское smile.gif)

Автор: chipset 11.4.2004, 02:04
Ещё посмотри на http://www.mycomp.com.ua
там статья Невидимые чернила в 51 номере за преидущий год, сам не могу посмотреть инет больно тормозит и глючит sad.gif
после того как запрячешь в BMP суй её к EXEшнику как ресурс и будет тебе счастья smile.gif

Автор: Urod 11.4.2004, 14:06
Спасиб, но мне нужна информация принципиально об исполняемых файлах! Такова моя тема диплома, ничего другого преподы слушать не будут. Если есть что по теме - скиньте. notify.gif hmmm.gif sad.gif

Автор: cardinal 11.4.2004, 14:19
Цитата
но мне нужна информация принципиально об исполняемых файлах

ну а стеганография тогда здесь причем?

Автор: Urod 11.4.2004, 19:29
Цитата(cardinal @ 11.4.2004, 14:19)
ну а стеганография тогда здесь причем?

Ну при том, что информацию можно запрятывать не только в графику и тексты, но и программки (и при том, так, чтобы программа нормально функционаровала, ее вес не изменился принципиально и т.п., т.е. чтобы противник ничего не заподозрил). Вот, что мне надо.
Это могут быть самостоятельные наработки или уже какие-то имеющиеся, типа:
Метод незначащих бит
Данный класс алгоритмов весьма интересен и широко используется на практике. Он основан на том факте, что в некоторых форматах файлов (в большинстве случаев - мультимедиа данные) младшие биты значений хотя и присутствуют в файле, но не влияют на восприятие звука или изображения человеком. Кстати, на этом же принципе основано и сжатие с потерями (JPEG, MP3, MP4 и т.п.). Именно в таких "неиспользуемых" местах в файлах можно хранить стегосообщения. Наиболее часто контейнерами служат графические форматы с прямым цветокодированием в 24 и более бит на пиксел (BMP, TIFF). Реже - звуковые файлы с абсолютным кодированием амплитуды аудиосигнала (WAV). При разумном наполнении контейнера исходный файл не отличит от заполненного без специального анализа даже опытный специалист.
Кстати, в цветных графических изображениях заменять младшие биты можно у каждой из составляющих (R, G, B или C, M, Y, K). И еще одно соображение: если вы предполагаете, что кто-то заподозрит в вашем файле стегосообщение - в качестве контейнера нужно выбирать не искусственно созданные картинки (стего в них обманет только неискушенного пользователя), а отсканированные фотоизображения. Только в них присутствуют шумы квантования - случайное заполнение младших бит, под которые и маскируются кусочки стегосообщения. Необходимо избегать фотографий с большими областями очень ярких и черного цветов. На таких картинках большие области в исходном файле имеют цветовые составляющие 255 и 0, соответственно и стегобайты будут характерно выделяться при просмотре файла в кодах своими 254 и 1.
Ниже приведена основная часть алгоритма, записывающего и считывающего стегосообщение. Контейнером служит 24-битный BMP-файл (полный текст программы и рабочий проект с примером стегосообщения можно найти на сайте журнала). В примере в каждом байте используется только 1 младший бит. Длина сообщения записывается не прямым 16-битным кодом, а в два этапа - это позволяет избежать подозрительной последовательности нулей в начале сообщения, если его длина мала. Сначала в 4 битах записывается N - "длина длины" сообщения, затем в N последующих битах собственно длина стего-сообщения в битах (старший (N+1)-ый бит считается установленным). Максимальная длина стегосообщения - 8 килобайт.
procedure AddLSBStego(const ContainerFileName:string; const Stego; BitCnt:integer);
var
Header:TBMPHeader; F:TFileStream;
Buffer:array[0..$103FF] of byte;
Ps,i,x,CntLen,BytesInLine,BytesRead:integer;

procedure AddLeastBit(Bit:integer);
begin
if Header.Width*3 <= Ps mod BytesInLine then
// перепрыгиваем выравнивание BMP-строк по границе dword
inc(Ps,BytesInLine-Header.Width*3);
Buffer[Ps]:=((Buffer[Ps]) and $FE) or (Bit and $01);
inc(Ps)
end;

begin
if (BitCnt<=$FFFF) and FileExists(ContainerFileName) then
begin
F:=TFileStream.Create(ContainerFileName,fmOpenReadWrite or fmShareExclusive);
F.Read(Header,sizeof(TBMPHeader));
if (Header.Signature=$4D42) and (Header.BMOffset=sizeof(TBMPHeader)) and (Header.ColorDepth=24) and (Header.Width*Header.Height*3>BitCnt) then
begin
BytesInLine:=(((Header.Width*3)+3) div 4)*4;
BytesRead:=F.Read(Buffer,sizeof(Buffer)); Ps:=0;
x:=BitCnt; CntLen:=0;
while x>0 do // определяем "длину длины"
begin x:=x shr 1; inc(CntLen) end;
for i:=0 to 3 do // записываем "длину длины"
AddLeastBit(CntLen shr (3-i));
for i:=0 to CntLen-2 do // записываем длину
AddLeastBit(BitCnt shr (CntLen-2-i));
for i:=0 to BitCnt-1 do // записываем саму стеганограмму
AddLeastBit(TByteArray(Stego)[i div 8] shr (7-(i mod 8)));
// возвращаемся и записываем измененный буфер на место
F.Seek(sizeof(TBMPHeader),soFromBeginning);
F.Write(Buffer,BytesRead);
end;
F.Free;
end;
end;

procedure ReadLSBStego(const ContainerFileName:string; var Stego; var BitCnt:integer);
var
Header:TBMPHeader; F:TFileStream;
Buffer:array[0..$103FF] of byte;
Ps,i,x,CntLen,BytesInLine:integer;

function ReadLeastBit:integer;
begin
if Header.Width*3 <= Ps mod BytesInLine then
// перепрыгиваем выравнивание BMP-строк по границе dword
inc(Ps,BytesInLine-Header.Width*3);
Result:=Buffer[Ps] and $01; inc(Ps)
end;

begin
if FileExists(ContainerFileName) then
begin
F:=TFileStream.Create(ContainerFileName,fmOpenRead or fmShareExclusive);
F.Read(Header,sizeof(TBMPHeader));
if (Header.Signature=$4D42) and (Header.BMOffset=sizeof(TBMPHeader)) and (Header.ColorDepth=24) then
begin
BytesInLine:=(((Header.Width*3)+3) div 4)*4;
F.Read(Buffer,sizeof(Buffer)); Ps:=0;
CntLen:=0; // определяем "длину длины"
for i:=0 to 3 do
CntLen:=(CntLen shl 1) or ReadLeastBit;
if CntLen=0 then CntLen:=16;
BitCnt:=1; // определяем длину
for i:=0 to CntLen-2 do
BitCnt:=(BitCnt shl 1) or ReadLeastBit;
x:=0; // считываем стеганограмму
for i:=0 to BitCnt-1 do
begin
x:=(x shl 1) or ReadLeastBit;
if i mod 8 = 7 then
begin TByteArray(Stego)[i div 8]:=x; x:=0 end;
end;
// "досмещение" и запись последнего неполного байта (если он был)
if BitCnt mod 8 <> 0 then
begin
x:=x shl (8-(BitCnt mod 8));
TByteArray(Stego)[BitCnt div 8]:=x;
end
end;
F.Free;
end;
end;

Только про исполянемые файлы. Есть что-нибудь?

Автор: cardinal 12.4.2004, 00:38
Цитата
Ну при том, что информацию можно запрятывать не только в графику и тексты, но и программки (и при том, так, чтобы программа нормально функционаровала, ее вес не изменился принципиально и т.п., т.е. чтобы противник ничего не заподозрил).

Извиняюсь... Думал стеганография - это только в картинки, а это оказывается обобщенное название...

Вот тут немного про exe:
http://www.cio-world.ru/bsolutions/e-safety/28763/

Автор: chipset 12.4.2004, 00:45
Всем понятно что в BMP можно прятать инфу без критических последствий!
Это очень легко на практике осуществить потому как безразлично будет если цвет будет немного(этого зрение не заметит) чуть более краснее!
А вот если в проге какой нибудь jmp замениться на mov ... то будет неприятно, а ведь для полного выведения программы из строя достаточно где нить один битик заменить и все!
Вот только я подумал, если находить граф. изображения в EXEшнике и там в этих изображениях менять всё, а также если кто знает как в тексте без ущерба сохранять, то в EXEшниках текста полным полно...вот только надо как то найти где можно безопасно изменить инфу... без выведения из строя проги

Автор: Guest 12.4.2004, 12:39
Цитата(cardinal @ 12.4.2004, 00:38)
Вот тут немного про exe:
http://www.cio-world.ru/bsolutions/e-safety/28763/

Да, смотрела уже. Тут, конечно, неплохая информация, но МАЛО. sad.gif

Автор: Urod 12.4.2004, 12:47
Цитата(chipset @ 12.4.2004, 00:45)
Вот только я подумал, если находить граф. изображения в EXEшнике и там в этих изображениях менять всё, а также если кто знает как в тексте без ущерба сохранять, то в EXEшниках текста полным полно...вот только надо как то найти где можно безопасно изменить инфу... без выведения из строя проги

Не поняла, т.е. предлагается следующее: брать код проги, которую мы хотим незаметно для противника передать, представлять его в виде граф. изображения, уже граф. изображение прятать в стегоконтейнер. Так? Если так, то изначально идея не та, т.к. суть заключается именно в передаче какого-либо сообщения в проге, именно прога выступает в роли стегоконтейнера.
Надеюсь, я тебя неправильно поняла, и ты мне подскажешь идею...

Автор: Mephisto 13.4.2004, 17:07
Просто клеить в конец ехешника. Попробуй, у меня раньше получалось. Только вот нада научится потом вытаскивать!!!

Автор: Urod 13.4.2004, 18:09
Ну объясните толком. Что клеить в конец exeшника? И как это графика в exeшнике? Я что-то не понимаю. Можно весь метод описать полностью? bored.gif

Автор: Monty 15.4.2004, 03:27
lol smile.gif

Old.exe + Top.Secret = New.exe smile.gif .... тоесть, то что ты прячешь дописываем в любой exe ...... но это очень плохая идея!

Автор: Urod 15.4.2004, 12:15
Не, очевидно я не точно высказалась. Мне нужно следующее: встраивание информации (секретной) в код программы и при том, чтоб программа не портилась, т.е. нормально функционировала. Чтобы все выглядело мирно: я передаю кому-то программу (в которую запрятала информацию), а злоумышленник ничего не заподозрил, т.к. программа нормально функционирует.

Автор: sergejzr 16.4.2004, 19:26
Цитата
Urod
а злоумышленник ничего не заподозрил

Терзают меня смутные сомнения, что злоумышленник это как раз ты. biggrin.gif biggrin.gif

Конечно можно писать в строчку "This programm can not run under DOS mode" (или как там?), но различные компилеры могут создавать разные файлы и универсально внести изменения в прогу без последствий ИМХО не является возможным.

2Monty
Обьясни пожалуйста, почему встраивание информации на конец ехе (kak предлагает Mephisto) плохая идея. По идее никаких джампов туда быть не должно. А ехе, который работает в зависимости от своего размера если и существует, то создать его будет довольно мерзопакостно.. hmmm.gif
  • Насчёт вставки на конец файла:
    Я написал похожую прогу, но для тестирования, можно ли таким образом прицеплять к файлам МЕТА-дата.
    Прёт как танк на ехе,bmp,gif,... По идее проблемы возникнут с файлами - потоками (как wav), в которых используются ВСЕ байты файла.
  • Если кого нибудь интересует, предлагаю открыть проеткт для дальнейшей разработки. Главная проблема, которая должна быть решена таким способом: Скачал ты где нибудь файл, а программа закачки записала в файл, откуда он + сам добавил кое какие даты. Можно например прицеплять HTML-файлы, картинки итп.
  • Скачать версию 0.0 можно здесь.
    http://www.iwi-iuk.org/cashmere/pr/utagger.zip
  • Если кому надо, код u алгоритм распечатаю в этой теме.
  • Специально для "Стенаграфистов" можно добавить опцию, что бы эту информацию кодировать ключом. Тогда "злоумышленник" если и заподозрит изменение файла, (размер оригинала на будет совпадать с размером резултата ровно в N байт добавленной информации и то в explorer'r это не увидишь если информация 100 байт, а размер файла был 3 МБ) то информациu всё равно расшифровать не сможет.










Автор: Monty 18.4.2004, 04:53
sergej.z, дело в том что я их легко обнаружу smile.gif .... на многих программах у которых есть CRC проверка своего кода, пишут его в конец biggrin.gif ...... можно записать в другое место, в серединку ;) .... вот что я имел ввиду .... а про то что там нет джампов я и сам знаю smile.gif .... так же работают SFX модули архиваторов smile.gif ....... глупо так стенографироваться smile.gif ..... стенография превращается в криптографию, так как задача спрятать инфу так чтобы ее не выцарапали не выполняется smile.gif ........
Добавлено @ 04:55
а если прятаемая инфа не шифруется, то это хренография smile.gif

Автор: sergejzr 19.4.2004, 21:19
2Monty
Всё ясно! Мне просто был интересен сам факт добавления информации. Конечно стеганографией здесь и не пахнет. biggrin.gif
"От криптографии стеганография отличается тем, что с помощью криптографии можно скрыть содержание сообщения, а, пользуясь стеганографией, можно скрыть само существование сообщения."

Ну в конец ехе, можно вписывать не только техт, но и графику. Задача обнаружения информации сводится к обнаружению таковой в графическом файле. При этом наличе "хвоста" ещё не будет говорить о наличии секретной информации.

2Urod
Ну если для диплома такой вариант исключить то возможно тебе поможет то факт, что в 32- битных приложениях можно заменять ресурсы(иконки, картинки итд) при помощи той же http://www.users.on.net/johnson/resourcehacker/.
Заменяй пожалуйста иконки на "стеганографированные".

Опять же универсально (для любого рода исполняемых файлов) эта задача ИМХО не может быть решена(кроме как записи в хвост). Возможно же написать свой компилер, создающий приложения без ресурсов.

Ещё к дипломной работе: Очень легко обнаружить добавленную информацию в ехе. Достаточно сравнить два файла побитно.





Автор: Urod 20.4.2004, 18:38
Цитата(sergej @ 19.4.2004, 21:19)
в 32- битных приложениях можно заменять ресурсы(иконки, картинки итд) при помощи той же http://www.users.on.net/johnson/resourcehacker/.
Заменяй пожалуйста иконки на "стеганографированные"

Что за приложения? Похоже, я уже ни фига не опнимаю...
Речь идет о замене только части исполняемого файла (картинок, включенных в него)? Если да, то это оопять же сводится к графике (а это уже не то).

Автор: Urod 23.4.2004, 13:15
Какие-нибудь работы Куна кто-то может подсказать?

Автор: sergejzr 23.4.2004, 14:07
Цитата
Urod
Что за приложения?

32-битные приложения это ехе файлы. Они могут содержать рессурсы(картинки), но если тебе графика всё равно не подойдёт, то выкинем это из головы.

Ещё раз по твоей дипломной:
Наличие информации в картинке не возможно доказать, если копии оригинала не существует.
Ну например я сфотал лес, закодил в фотку послание, а оригинал удалил. Кто сможет восстановить оригинал? Ведь никто этот лес так же сфотать не сможет.
Другое дело, если я возьму картинку из интернета, и запишу туда инфу. "Злоумышленник" без проблем определит наличие информации, если сравнит эти две картинки.

Примем во внимание теоретическую возможность применения стеганографии на ехе.
Получатся два пути:
  • Первый: ехе создаёшь ты сама, модифицируешь, а оригинал удаляешь.
    В этом случае информацию можно было закодить до компиляции в исходном коде. Потом только сообщить её позицию в ехе файле.
  • Второй:
    Ты берёшь существующий ехе, модифицируешь. Вот тут то от стеганографии остаётся только криптография, поскольку будет очень легко "выудить" посредством сравнения оригинала и твоего файла побитно. А о доказательства наличии инфы и говорить не приходится.

Теоретически можно изменить биты в ехе. Если комманда проверяет на & два константных числа. Можно у этих чисел пару бит поменять. Причём бит, изменяемый в первом числе должен быть изменён и во втором. Да поправят меня ассемблерщики! (кстати на ассемблерском форуме можешь задать такой вопрос. Они лучше в коммандах и ехе разбираются).

Удачи!
Сергей

Автор: Urod 23.4.2004, 17:57
Цитата(sergej @ 23.4.2004, 14:07)
[ Ты берёшь существующий ехе, модифицируешь. Вот тут то от стеганографии остаётся только криптография, поскольку будет очень легко "выудить" посредством сравнения оригинала и твоего файла побитно. А о доказательства наличии инфы и говорить не приходится.
[/LIST]
Теоретически можно изменить биты в ехе. Если комманда проверяет на & два константных числа. Можно у этих чисел пару бит поменять. Причём бит, изменяемый в первом числе должен быть изменён и во втором. Да поправят меня ассемблерщики! (кстати на ассемблерском форуме можешь задать такой вопрос. Они лучше в коммандах и ехе разбираются).

Удачи!
Сергей

Вот что-то второй способ мне не очень понятен. В exeшнике-то биты надо менять с умом, так, чтобы программа не перестала работать! И как ты предлагаешь это сделать.
И, у тебя нет примера по первому способу: с информацией, запрятанной в коде exe-программы, до и после компиляции. Так, случайно, вдруг ты этим увлекался. wink.gif Было бы здорово!

Автор: chipset 24.4.2004, 20:40
Кроме того можно шифровать текст который есть в файле, но таким образом придется как то распозновать что текст а что код, хотя все равно обнаружат по размеру, если оригинал не удалишь...

Автор: Guest 24.4.2004, 22:37
Цитата(chipset @ 24.4.2004, 20:40)
Кроме того можно шифровать текст который есть в файле, но таким образом придется как то распозновать что текст а что код, хотя все равно обнаружат по размеру, если оригинал не удалишь...

Ну оригинал оригиналом - это 2-й аспект. Главное - это полноценное функционирование программы после вшивания в нее информации! Злоумышленник, просмотрев прогу, не должен ничего заподозрить, а если она будет битая, то тут все ясно! Есть ли какой-то конкретный МЕТОД вшивания информации в проги с сохранением функционирования проги? Вот, что мне надо. Типа, как метод незначащих бит у графики...

Автор: chipset 25.4.2004, 02:18
http://www.dev.vitgroup.com/modules.php?op=modload&name=phpBB_14&file=index&action=viewtopic&topic=2248&start=0 кажется то что тебе нужно...

Автор: Urod 26.4.2004, 12:40
Мда, предзащита 7 мая, а у меня не густо по сути диплома sad.gif . Ну да и фиг с ним, думаю, что-нибудь придумается! smile.gif

Автор: Urod 26.4.2004, 12:56
"Более сложный механизм маскировки реализован создателем вируса Win95.CIH. Этот вирус внедряется в *.exe файл, используя особенности формата PE (Portable Executable), принятого в системе Windows начиная с Windows 95. В Windows исполнимый файл *.exe может содержать не только код, но и многочисленные дополнительные данные. Это пиктограммы, различные служебные данные и дополнительная информация, например, об экспортируемых и импортируемых функциях. Каждый вид данных, содержащихся в файле формата РЕ, это отдельный объект. Для хранения всех объектов файл формата РЕ разбивается на ряд секций фиксированного размера. Каждый объект начинается с новой секции. Если объект не занимает всего объема секции, то эта часть секции не используется. Поэтому в файле формата РЕ всегда достаточно свободного места/
Больше всего свободного места в первой секции, в которую записывается только заголовок файла (PE header). В эти свободные места можно упрятать достаточно много информации, и при этом размер файла не изменится и работоспособность файла не нарушится."

Есть ли у кого информация о мерах против таких программ-закладок? notify.gif

Автор: sergejzr 26.4.2004, 23:29
--------------------------------------------------------------------------------------------------------------------------
Цитата
Вот что-то второй способ мне не очень понятен. В exeшнике-то биты надо менять с умом

Описанием вторго пути я хотел только привести аргумент против стеганографии в ехе файлах, оригиналы которых "злоумышленник" может получить. При этом возможность использования ехе как стегоконтейнера была чисто теоретической. Как я уже говорил извлечение информации это не проблема и осталось бы только "раскодировать" послание.

Добавить информацию на этапе компиляции однако не составит особого труда. Вот пример:
Код

int main()
{
char* stego="Cats don't like dogs. But cats like milk. One cat likes to hunt mouses, another one prefers to drink milk. But no dog likes mousehunting."
return 1;
}

(Я попробовал написать что нибудь толковое по англицкий, даже если это выглядит иначе.)
Скомпилируй сей исходник в ехе. Открой полученный ехе любым текстовым редактором. Как ты видишь массив лежит в файле "открытым текстом".
Теперь слова cats/catзаменяй на 1, а gog/dogs на 0.
Получим 10110 что обозначает число 22 в двоичной системе.
Но я думаю, что ты сама это знаешь.

Теперь по поводу изменения бит в существующем ехе.
Предположим в ехе находится текст (Что весьма вероятно).
Как мы поняли этот текст открытый. То есть функциональность файла при изменении техта в БОЛьШИНСТВЕ случаев не будет нарушена. Как ты изменить техт, тут уже от случая к случаю надо решать. Допустим вариант:
Вставлять орфографические ошибки. Звучиы грубо, но если ты навставляешь/постираешь запятых....
например говоришь, что предложение с одной запятой - 1, а без запятых - 0.
Самое главное, писать можно ТОЛьКО в техт.
-----------------------------------------------------------------------------------------------------------------------------------------------
Цитата
особенности формата PE (Portable Executable), принятого в системе Windows начиная с Windows 95

Как я и говорил, невозможно этого сделать для ЛЮБЫХ ехе/out.
То, что ты описала - частичный случай.

Автор: Гость_XpyDi 27.4.2004, 09:17
Есть несколько методов, которые достаточно сильно меняют внутренности exe файла, но при этом сохраняют его функциональность.
К несчатью, это не соответствует требованию стегонографии, что нехнакомый человек не должен догадаться, что данный обьект является стегоконтейнером.

Самый хороший метод по моему, это использование неявного контроля, для сокрытия части информации.

Автор: Гость_XpyDi 27.4.2004, 09:21
Вот ссылка на неплохой материал с описанием http://kpnc.opennet.ru/n2k_shld.pdf в программах.

Автор: Urod 27.4.2004, 12:26
Ребята (думаю, не оишиблась), ОГРОМНОЕ вам спасибо! Хотя мой препод сказал, что диплом неплохой, ваша помощь неоценима, т.к. такие штуки я обязательно включу в диплом! adv/76.gif adv/party.gif

Автор: Гость_XpyDi 28.4.2004, 10:52
Относительно меня могу сказать, что это была не шутка, т. к. метод который описан в приведенной мною статье подходит не только для защиты программ, но и для сокрытия информации. Если ты сама пишешь программу то данный метод впихнуть намного проще, чем если ты используешь чужую программу в качестве стегоконтейнера.

Автор: Urod 28.4.2004, 11:11
Да, статья неплохая! Но в ней речь идет о скрытом аудите (я бы даже сказала самоаудите) системы, и, каким образом это можно применить к стеганографии, мне что-то не очень понятно.
Может, какой-нибудь пример в контексте данной статьи? wink.gif

Автор: XpyDi 30.4.2004, 01:31
Да там речь идёт о самоаудите, просто я дал ссылку на эту статью так как в ней описан метод, который можно использовать и для хранения скрытой информации в своих программах. Так, например, для вот такой структуры:
Код

st = Record
buf : array [1..5] of Byte;
Byte1 : Byte;
W : Word;
Byte2 : Byte;
end;

если нигде в программе нет явного обращения к полю byte1, то очень тяжело сказать каков размер массива buf - 5 или 6 байт, при этом если в начале работы программы туда было записано вот такое значение:
$68 $65 $6C $6C $6F (это строка hello), а в байт Byte1 значение 15 (просто часть нашего скрываемого сообщения), то если в ходе работы копировать в него всякую ерунду(т.е. использовать его по назначению) при это не затрагивая байты с нашим стего-сообщением(в данном случае это Byte1), то стего-сообщение можно будет извлечь даже из работающей программы(или её дампа). Можно конечно затереть в ходе работы Byte1, в данном случае становиться намного тяжелее догадаться, что 6 байт в структуре st это часть стего-сообщения, а не просто какая-то служебная информация используемая где-то программой в своих целях.
Также при определенных настройках компилятора в выходном exe файле части структуры st могут оказаться выровнеными на границу 4(хотя возможно и 2) байта, т.е. чтобы увеличить скорость доступа к данным копилятор впихнул в структуру несколько неиспользуемых байт, которые ты можешь использовать по своему усмотрению.
Также чем хороша программа в роли стего-контейнера, т.к. она использует динамически подключаемые библиотеки и ты вполне можешь размазать стего-сообщение по всем файлам необходимым для запуска программы, причем для каждого файла по своему, т.е. часть стего-сообщения в упаковынные файлы, часть в графические, часть в ..., часть в файлы с данных, потом dll и сам exe.
Также я заметил, что очень часто программисты используют тип integer (int - для C) который занимает 4 байта(при компиляции под Win32, практически всех pascal-компиляторов) практически для всх целочисленных переменных, при этом нередко засылаемое значение меньше 10000(а иногда и эта граница намного ниже). Так вот эти старшие байты и можно использовать для своих целей.

Теперь как все это реализовать, если ты не разработчик программы. Только полным или частичным дизассемблированием программы и анализом использоумых в ней структур данных, при этом надо учесть, что в данном случае нет 100%, что файл будет работать после того как ты впихнешь в него своё стего-сообщение. По этой тематике могу посоветовать посмотреть материалы посвященные пермутациям(технология используемая в вирусах для изменения собственного кода, с сохранением функциональности) и реверсирующим вирусам, т.к. там теме дизассемблирования и сборки с сохранением работоспособности уделяется больше внимания, нежели в различных публикациях по дизассемблированию.
Кстати защита от копирования Star-Force 3.0 анализирует исполняемый файл и большую част кода переводит в байт-код своей виртуальной машины, и потом защищенный исполняемый файл работает уже через виртуальную машину. Так что вот наглядный пример автоматического анализа чужой программы.

Я описал пожалуй самый эффективный метод(известный мне) встраивания сообщения в исполняемый файл. Но есть еще несколько от видоизменения кода до использования релоков и других системных структур исполняемого файла.

Автор: Urod 30.4.2004, 08:32
Цитата(sergej @ 26.4.2004, 23:29)
Открой полученный ехе любым текстовым редактором. Как ты видишь массив лежит в файле "открытым текстом".

Например, через Far посмотреть F3? Об этом идет речь? smile.gif

Автор: Urod 30.4.2004, 13:26
Цитата(XpyDi @ 30.4.2004, 01:31)
Так, например, для вот такой структуры:
Код

st = Record
buf : array [1..5] of Byte;
Byte1 : Byte;
W : Word;
Byte2 : Byte;
end;

если нигде в программе нет явного обращения к полю byte1, то очень тяжело сказать каков размер массива buf - 5 или 6 байт,

А почему? sad.gif (я про размер массива)

Автор: sergejzr 30.4.2004, 14:46
Цитата
Например, через Far посмотреть F3

Это ведь вроде текстовый редактор (не встречался..)? Тогда да!

XpyDi Натолкнул на мысль. Такую прикольную, что я возьму свои слова обратно насчёт невозможности изменения сущ. ехе.
Информации туда напихать можно. Предлагаю на рассмотрение след. факты.
Идеи:
  • При декларации переменной в большинстве случаев значение ей не присваивается(в паскале то точно, вообще никогда).
    Код
    int main()
    {
    int a;
    a=3+7;
    cout<<a;
    }
  • Если учесть тот факт, что значение присвоится позже, то мы имеем ячейку для записи своей информации без каких либо изменений функциональности ехе!Больше!
  • Рассмотрим значения, которые принимает функция. В ехе эти ячейки существуют, но релевантными значениями заполнятся только при вызове этой функции. До того момента они могут содержать любую(!) информацию. Почему не нашу?
Решения:
  • Остаётся анализ дизассемблированого кода. Насколько я понимаю, не составит труда выловить такие ячейки.
  • Обязательным условием является то, что присваивание значения ячейке происходит позже в программе(до того, как эта ячейка будет программой использована).
Тут я бы предпочёл передать эту задачу специалистам по ассемблеру, которые возможно опровергнут/подтвердят такую возможность.
В случае позитивного ответа, такой способ действительно будет универсальным для ЛЮБОГО приложения.

Автор: Monty 30.4.2004, 21:08
ох ... Запехните скрываемое сообщение в, допустим, calc.exe ... не выйдет и слова я свои не заберу smile.gif ... а вот в свою программу, я _легко_ спрячу скрываемое сообщение smile.gif ......

PS лень расписывать ... все кратко

Автор: XpyDi 4.5.2004, 19:35
Urod
Просто случай из практики.
Я не имея исходных текстов программы не мог точно сказать, что за стурктура и какой ёе размер пока не увидел конкретных обращений к элементам массива, но с массивом можно работать поэлементно, а можно просто скопировать его в какой-нибудь буфер и работать с ним уже не как с массивом, а как с записью, и вот тут если жо этого все элементы массива были размером байт, то в записи некоторые стали размером 4 байта, некоторые 5 байт, а некоторые так и остались 1 байтовыми. И без анализа кода который с ним работает ничего конкретно сказать нельзя.
sergej.z
Некоторая поправка, если ты не проинициализируешь переменную, то физически в файл она записана не будет. Но все константы указанные в программе записываються в саму программу. Т.е. строка проинициализированная явным образом или массив или структура и т.д.
Monty
Не обижайся, но мне все равно заберешь ты свои слова или нет. Я только хочу сказать, что в где-то 80% случаев это можно сделать для чужой программы. А для своей я думаю, что это самый простой и эффективный способ.
Насчет того реально ли найти такие излишки в программе автоматическом режиме или нет. Думаю что реально, но обязательно нужен потом прогон программы, хотя и он не дает гарантии, что теперь все работает. Так же если данный способ не пройдет то в программе очень много мест в которые можно запихнуть по 1 байту, хотя оно и очень сильно ограниченно поэтому в программу вряд ли удастся запихнуть сообщение представляющее собой хотя бы 50 % размера программы, а может и 25%

P.S. Разделаюсь сессией и попытаюсь впихнуть что-нибудь в calc.exe для демонстрации реальности всего вышеизоложенного.

Автор: Guest 8.5.2004, 14:09
А нельзя ли о встраивании стего в бинарники как-нибудь по-проще? Так сказать на качественном уровне. XpyDi
sergej.z

Автор: Urod 13.5.2004, 10:28
XpyDi
Прокомментируй, пожалуйста, свою идею. notify.gif

Автор: XpyDi 16.5.2004, 08:40
Цитата
А нельзя ли о встраивании стего в бинарники как-нибудь по-проще? Так сказать на качественном уровне. XpyDi
sergej.z

А чем тебе это не качественный уровен. Дело в том, что все выше описанное, да теперь и ниже в полной мере официально нигде не применяется и если ты ожидал увидеть здесь код который методом copy&paste ты просто откомпилируешь и получишь готовую программу, которыю легко подогнать под собственные нужды, то хочу тебя разачаровать не будет этого по-моему слишком рано выкладывать код, пока не все нюансы описанного метода известны.


Извиняюсь, что долго не отвечал, был занят.
Вообщем так. В чем отличие исполняемого файла от графического? В графическом мы можем незначительно изменять данные и этого никто не увидит, но при этом мы не можем менять структуру файла, т.е. насколько мне известно она достаточно жесткая, т.е. вначале заголовок, потом данные. В отличие от графических файлов, структура исполняемого файла формата PE более свободна, т.е. некоторые таблицы могут быть, а могут не быть, да и расположены они могут быть в различных местах, но в пределах дозволенного.

Так вот самое первое, что приходит на ум, это во первых заполнять своими данными таблицы, которые присутвуют в файле, но не используются(да и такие есть, вот они современные оптимизаторы) например практически во всех файлах генерируемых компилятором Delphi есть талица reloc'ов, но в связи с тем, что exe всегда грузится по фиксированному адресу, то она становится не нужна. Также некоторые таблицы мы можем изменять так, что бы запихнуть туда насколько наших байтов или битов, например: таблица импорта, а точнее название библиотек и функций. Про изменение ресурсов и так сказано уже достаточно. Теперь перейдем к видоизменению кода и данных. ТУт дело обстоит сложнее, т.к. в отличии от графических файлов данные тут приктически никак не изменяются. Но у кода ингда встречаются неспользуемые куски, их можно найти автоматическим дизассемблированием и анализом файла(а иногда они встречаются, но используются динамически, и тогда файлу кранты). Но с кодом мы всегда можем произвести одну простую операцию это его сжать, потом сжать наше стегосообщение и в освободившееся место впихнуть всё что нам нужно. Визуально файл будет работать, как работал(пример того бесчисленное количество пакеров и протекторов для исполняемых файлов), но если заглянуть туда hex-редактором то определить, что он запакован не составит труда(а каким пакором не важно их сейчас столько появилось), правда чтобы определить есть ли там стегосообщение в некоторых случаях потребуеться анализ распаковывающего кода .

Теперь про данные, этот метод я описывал выше. Он основывается на том, что практически всегда оптимизатор увеличивает обьем используемых данных для того, чтобы величить скорость доступа к ним (т.е. из-за выравнивания). Я предлагаю находить эти дырки и записывать туда наши данные, правда количество таких дирок слишком мало, чтобы записать туда что-либо отличное от иконки(да и то для больших программ), так что в данном случае первый кандидат чтобы туда впихнуть это простой ЦВД (т.е. водяной знак). Этот метод больше всего подходит для встраивания каких-либо стегосообшений в свои собственные программы. Т.е. создавая переменные через мекросы, которые потом размажут наше стегосообщение по секции данным мы потом соберем поиском неиспользуемых дырок.

Достаточно кратенько больше лени расписывать, да и нехочеться одну(или несколько) идей заливать водой.

Автор: Urod 25.5.2004, 13:44
XpyDi
Подитожив способы:
1. Просто писать наше сообщение в незаполненые (или частично заполеннные) таблицы PE-файлов. Например, в их заголовки (там места больше). Или писать в таблицы импорта. При этом функциональность PE-файла не нарушается. Так?

2. Главное - мне понять, что ты подразумеваешь под понятиями код и данные. Т.к. для меня код - это текст программы, видимо наше понимание несколько отличается. Уточни, пож-та.
Так вот: Находим пустые куски в коде дизассемблированием и/или анализом файла и заполняем их своим сообщением. Не поняла, что будет, если пустые куски файла "используются динамически"?
Еще один метод встраивания стего в код - это его сжатие. Но, как я понимаю, сжатый файл наталкивает на размышления. Следовательно, вопрос: под какие случаи такое специальное сжатие файла (чтобы в его освободившиеся места впихнуть стего) можно замаскировать? Так сказать, я это сделал для того, чтобы... Чтобы не возникало у рецензента лишних подозрений и желаний проверить этот сжатый ф-л.

3. Мне непонятно, как, увеличивая объем данных, появляются дырки. Т.е. тоже кол-во данных просто размазывается по увеличенному объему, и соответственно, где-то появлюются дырки? Так? Но эти дырки слишком малы, чтобы вставить в них аообщение, поэтому данный способ подходит в основсном для ЦВЗ.

Скажа, пож-та, правильно ли я тебя поняла. smile.gif

Автор: XpyDi 27.5.2004, 22:58
Цитата
1. Просто писать наше сообщение в незаполненые (или частично заполеннные) таблицы PE-файлов. Например, в их заголовки (там места больше). Или писать в таблицы импорта. При этом функциональность PE-файла не нарушается. Так?

Да, если редактировать с умом, т.к. иначе можно повредить важную таблицу (или её часть). Тут самое главное то, что можно редактировать все, что не используется загрузчиком, при этом есть несколько минусов:

  • загрузчики Win 9x/Me/NT/2k/XP иногда достаточо сильно отличаются друг от друга, соответвенно у них разные требования к файлу.
  • можно изменить таблицы не используемые загрузчиком, но используемые другими программами, а наличие некоректной таблицы может оказаться подозрительным, хотя это еще не значит файл является стегоконтейнером, существует еще несколько ситуаций, когда в файле находится не совсем корректная информация.


Цитата
Главное - мне понять, что ты подразумеваешь под понятиями код и данные. Т.к. для меня код - это текст программы, видимо наше понимание несколько отличается. Уточни, пож-та.

Код - это те осмысленные инструкции на которые хотя бы один раз в процессе работы программы может исполнится процессором.
Данные же это все остальные байты, т.е. те на которые передав управление программа скорее всего аварийно завершится.
Так, например, если сожмем программу, то полученные после сжатия байты будут данными, но после того как мы ей (программу) распакуем и передадим её управление это будет код. Так и в любой программе есть куски кода (т.е. те которые исполняются) и данные.
Я хотел сказать, что в некоторых случаях одни и теже байты могут быть как данными, так и кодом. Т.е. пока процессор не стал исполнять записанные там инструкции это данные, как только исполнил хоть раз, значит код.
Вроде выразился как мог, надеюсь понятно что я хотел сказать.

Цитата
Так вот: Находим пустые куски в коде дизассемблированием и/или анализом файла и заполняем их своим сообщением. Не поняла, что будет, если пустые куски файла "используются динамически"?

Я написал не пустые, а не используемые. Это несколько разные вещи. Пустые в моем понимании это забитые нулями, а неиспользуемые это остаточная информация от каких-то таблиц, возможно какие-то данные или код, который оптимизитор случайно впихнул из-за своей несовершенности. Проблема в том, что могут найтись такие куски на которые нет явных ссылок, но управление на них передается конструкцией вида:
Код

 mov eax, 15
 lea eax, [eax*2+3]
 call eax

В таком случае очень тяжело в автоматическом режиме определить какой кусок кода выполнится после прогона этого куска (показан достаточно простая конструкция, которую все же можно посчитать автоматически, но если в эту конструкцию впихнуть что-нибудь что читает какие-то байты из памяти и на основе их считает адрес, то автоматический анализ не поможет кроме разве что трасировки да и то не 100% вариант)

Цитата
Еще один метод встраивания стего в код - это его сжатие. Но, как я понимаю, сжатый файл наталкивает на размышления. Следовательно, вопрос: под какие случаи такое специальное сжатие файла (чтобы в его освободившиеся места впихнуть стего) можно замаскировать? Так сказать, я это сделал для того, чтобы... Чтобы не возникало у рецензента лишних подозрений и желаний проверить этот сжатый ф-л.

На самом деле сейчас существует просто бешенное количество программа для сжатия исполняемых файлов, что определить чем и для чего сжат файл иногда просто невозможно. А сжимают файлы по нескольким банальным причинам:

  • Уменьшить место занимаемое программой на диске. Реальный размер программы без распаковки узнать вряд ли удастся. Из-за этого программу можно выдать просто за несколько большую по размерам. Да и рецензент обратит внимание на то что программа сжата, только если залезет в неё дизассемблером или чем-то в этом роде.
  • Просто в сжатому коду был дописан какой-нибудь кусок который защищает его от различные модефикаций его взломщиками.
    Так же можно на самом деле впихнуть в файл подобных трюков байт на 20-30.

Цитата
3. Мне непонятно, как, увеличивая объем данных, появляются дырки. Т.е. тоже кол-во данных просто размазывается по увеличенному объему, и соответственно, где-то появлюются дырки? Так? Но эти дырки слишком малы, чтобы вставить в них аообщение, поэтому данный способ подходит в основсном для ЦВЗ.

Из-за выравнивания. Выравнивание - это дополнение некоторых структур нулевыми байтами, так что-бы все они располагались на границе(по адресу) кратному, например 2 байтам (сейчас чаще можно встретить 4,8 байт),
Из-за того что программист может плохо расположить различные структуры в программе её размер за счет выравнивания может немного увеличиться (относительно размера всей программы 10%-20%). А встраивание ЦВЗ это наиболее подходящий вариант для исполняемых файлов, т.к. что ни говори, а размер свободного места в файле под стегосообщение всеже сильно (по сравнению с музыкальными и графическими файлами) ограничено.
Единственное, что хочу напомнить, так это то, что ты можешь одно стего сообщение размазать по различным местам нашего файла и не только конкретного, но и тех, без которого запуск данной программы просто невозможен.

Автор: Urod 15.6.2004, 13:56
Всем спасибо! К сожалению нет права поднять репутацию sergej.z и
XpyDi за помощь и поддержку. Если это сделаю модераторы - это будет справедливо!


Автор: podval 15.6.2004, 21:41
Цитата(Urod @ 15.6.2004, 14:56)
Всем спасибо! К сожалению нет права поднять репутацию sergej.z и
XpyDi за помощь и поддержку. Если это сделаю модераторы - это будет справедливо!

Сделал smile.gif

Автор: Urod 17.6.2004, 10:31
podval
Замечательно! smile.gif

Автор: Marriage 6.7.2004, 22:28
А про Wav может мне кто - либо рассказать интернесного ???
И как можно улучшить этот метод ???

Автор: chipset 7.7.2004, 06:15
А что собссно? Берёшь читаешь спецификацию wav, и записываешь в каждую двухбайтку(одно) инфу, как и с BMP собссна...

Автор: Marriage 7.7.2004, 21:27
Я спрашивал не как сделать, а как улучшить ...
Вопрос наводящий ...
Можно ли создать файл Wav ручками(я задавал уже этот вопрос в другом разделе, но так ответа конкретного и не дождался sad.gif )
Иожно ли забивать вручную звук в файл ??

Автор: teRmit 8.7.2004, 14:11
Вручную то можно... но вот что ты в итоге получишь... скорее всего файл с шумами вместо музыки tounge.gif . Или можешь звук снимать с какого-нибудь источника (типа микрофона или line-in) и записывать его в файл.

Автор: Marriage 8.7.2004, 21:57
ДА ...
БУдем мудрить и пробовать в ручную ...

Автор: teRmit 10.7.2004, 10:53
А оно тебе надо? Бери готовые файлы.

Автор: Marriage 10.7.2004, 21:42
НУ как бы сказать ...
Если просто заменять "избыточные" биты просто наабум, или по какому-нить алгоритму, то получиться большая корелляция "1" и "0". Ктому же если на слух заметить разницу не возможно, то ее можно найти с помощью мат.статистики (та же самая корелляция "0" и "1")
ТАк что просто хотелось бы что-то новое привнести ...
Вот ...

Автор: Shutt1 27.9.2011, 13:56
Писал дипломную по стеганографии на вижуал студио, есть исходники проги которая скрывает информацию в видео файл AVI. Кому надо пишите на мейл: [email protected]

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)