Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > Стеганография |
Автор: Urod 10.4.2004, 23:55 |
[color=crimson][/color][size=8][/size] ![]() |
Автор: cardinal 11.4.2004, 01:41 |
Читай здесь: http://forum.vingrad.ru/index.php?showtopic=17367 (это свое форумское ![]() |
Автор: chipset 11.4.2004, 02:04 |
Ещё посмотри на http://www.mycomp.com.ua там статья Невидимые чернила в 51 номере за преидущий год, сам не могу посмотреть инет больно тормозит и глючит ![]() после того как запрячешь в BMP суй её к EXEшнику как ресурс и будет тебе счастья ![]() |
Автор: Urod 11.4.2004, 14:06 |
Спасиб, но мне нужна информация принципиально об исполняемых файлах! Такова моя тема диплома, ничего другого преподы слушать не будут. Если есть что по теме - скиньте. ![]() ![]() ![]() |
Автор: cardinal 11.4.2004, 14:19 | ||
ну а стеганография тогда здесь причем? |
Автор: Urod 11.4.2004, 19:29 | ||
Ну при том, что информацию можно запрятывать не только в графику и тексты, но и программки (и при том, так, чтобы программа нормально функционаровала, ее вес не изменился принципиально и т.п., т.е. чтобы противник ничего не заподозрил). Вот, что мне надо. Это могут быть самостоятельные наработки или уже какие-то имеющиеся, типа: Метод незначащих бит Данный класс алгоритмов весьма интересен и широко используется на практике. Он основан на том факте, что в некоторых форматах файлов (в большинстве случаев - мультимедиа данные) младшие биты значений хотя и присутствуют в файле, но не влияют на восприятие звука или изображения человеком. Кстати, на этом же принципе основано и сжатие с потерями (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 | ||
Да, смотрела уже. Тут, конечно, неплохая информация, но МАЛО. ![]() |
Автор: Urod 12.4.2004, 12:47 | ||
Не поняла, т.е. предлагается следующее: брать код проги, которую мы хотим незаметно для противника передать, представлять его в виде граф. изображения, уже граф. изображение прятать в стегоконтейнер. Так? Если так, то изначально идея не та, т.к. суть заключается именно в передаче какого-либо сообщения в проге, именно прога выступает в роли стегоконтейнера. Надеюсь, я тебя неправильно поняла, и ты мне подскажешь идею... |
Автор: Mephisto 13.4.2004, 17:07 |
Просто клеить в конец ехешника. Попробуй, у меня раньше получалось. Только вот нада научится потом вытаскивать!!! |
Автор: Urod 13.4.2004, 18:09 |
Ну объясните толком. Что клеить в конец exeшника? И как это графика в exeшнике? Я что-то не понимаю. Можно весь метод описать полностью? ![]() |
Автор: Monty 15.4.2004, 03:27 |
lol ![]() Old.exe + Top.Secret = New.exe ![]() |
Автор: Urod 15.4.2004, 12:15 |
Не, очевидно я не точно высказалась. Мне нужно следующее: встраивание информации (секретной) в код программы и при том, чтоб программа не портилась, т.е. нормально функционировала. Чтобы все выглядело мирно: я передаю кому-то программу (в которую запрятала информацию), а злоумышленник ничего не заподозрил, т.к. программа нормально функционирует. |
Автор: sergejzr 16.4.2004, 19:26 | ||
Терзают меня смутные сомнения, что злоумышленник это как раз ты. ![]() ![]() Конечно можно писать в строчку "This programm can not run under DOS mode" (или как там?), но различные компилеры могут создавать разные файлы и универсально внести изменения в прогу без последствий ИМХО не является возможным. 2Monty Обьясни пожалуйста, почему встраивание информации на конец ехе (kak предлагает Mephisto) плохая идея. По идее никаких джампов туда быть не должно. А ехе, который работает в зависимости от своего размера если и существует, то создать его будет довольно мерзопакостно.. ![]()
|
Автор: Monty 18.4.2004, 04:53 |
sergej.z, дело в том что я их легко обнаружу ![]() ![]() ![]() ![]() ![]() ![]() Добавлено @ 04:55 а если прятаемая инфа не шифруется, то это хренография ![]() |
Автор: sergejzr 19.4.2004, 21:19 |
2Monty Всё ясно! Мне просто был интересен сам факт добавления информации. Конечно стеганографией здесь и не пахнет. ![]() "От криптографии стеганография отличается тем, что с помощью криптографии можно скрыть содержание сообщения, а, пользуясь стеганографией, можно скрыть само существование сообщения." Ну в конец ехе, можно вписывать не только техт, но и графику. Задача обнаружения информации сводится к обнаружению таковой в графическом файле. При этом наличе "хвоста" ещё не будет говорить о наличии секретной информации. 2Urod Ну если для диплома такой вариант исключить то возможно тебе поможет то факт, что в 32- битных приложениях можно заменять ресурсы(иконки, картинки итд) при помощи той же http://www.users.on.net/johnson/resourcehacker/. Заменяй пожалуйста иконки на "стеганографированные". Опять же универсально (для любого рода исполняемых файлов) эта задача ИМХО не может быть решена(кроме как записи в хвост). Возможно же написать свой компилер, создающий приложения без ресурсов. Ещё к дипломной работе: Очень легко обнаружить добавленную информацию в ехе. Достаточно сравнить два файла побитно. |
Автор: Urod 20.4.2004, 18:38 | ||
Что за приложения? Похоже, я уже ни фига не опнимаю... Речь идет о замене только части исполняемого файла (картинок, включенных в него)? Если да, то это оопять же сводится к графике (а это уже не то). |
Автор: Urod 23.4.2004, 13:15 |
Какие-нибудь работы Куна кто-то может подсказать? |
Автор: sergejzr 23.4.2004, 14:07 | ||
32-битные приложения это ехе файлы. Они могут содержать рессурсы(картинки), но если тебе графика всё равно не подойдёт, то выкинем это из головы. Ещё раз по твоей дипломной: Наличие информации в картинке не возможно доказать, если копии оригинала не существует. Ну например я сфотал лес, закодил в фотку послание, а оригинал удалил. Кто сможет восстановить оригинал? Ведь никто этот лес так же сфотать не сможет. Другое дело, если я возьму картинку из интернета, и запишу туда инфу. "Злоумышленник" без проблем определит наличие информации, если сравнит эти две картинки. Примем во внимание теоретическую возможность применения стеганографии на ехе. Получатся два пути:
Теоретически можно изменить биты в ехе. Если комманда проверяет на & два константных числа. Можно у этих чисел пару бит поменять. Причём бит, изменяемый в первом числе должен быть изменён и во втором. Да поправят меня ассемблерщики! (кстати на ассемблерском форуме можешь задать такой вопрос. Они лучше в коммандах и ехе разбираются). Удачи! Сергей |
Автор: Urod 23.4.2004, 17:57 | ||
Вот что-то второй способ мне не очень понятен. В exeшнике-то биты надо менять с умом, так, чтобы программа не перестала работать! И как ты предлагаешь это сделать. И, у тебя нет примера по первому способу: с информацией, запрятанной в коде exe-программы, до и после компиляции. Так, случайно, вдруг ты этим увлекался. ![]() |
Автор: chipset 24.4.2004, 20:40 |
Кроме того можно шифровать текст который есть в файле, но таким образом придется как то распозновать что текст а что код, хотя все равно обнаружат по размеру, если оригинал не удалишь... |
Автор: Guest 24.4.2004, 22:37 | ||
Ну оригинал оригиналом - это 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 мая, а у меня не густо по сути диплома ![]() ![]() |
Автор: Urod 26.4.2004, 12:56 |
"Более сложный механизм маскировки реализован создателем вируса Win95.CIH. Этот вирус внедряется в *.exe файл, используя особенности формата PE (Portable Executable), принятого в системе Windows начиная с Windows 95. В Windows исполнимый файл *.exe может содержать не только код, но и многочисленные дополнительные данные. Это пиктограммы, различные служебные данные и дополнительная информация, например, об экспортируемых и импортируемых функциях. Каждый вид данных, содержащихся в файле формата РЕ, это отдельный объект. Для хранения всех объектов файл формата РЕ разбивается на ряд секций фиксированного размера. Каждый объект начинается с новой секции. Если объект не занимает всего объема секции, то эта часть секции не используется. Поэтому в файле формата РЕ всегда достаточно свободного места/ Больше всего свободного места в первой секции, в которую записывается только заголовок файла (PE header). В эти свободные места можно упрятать достаточно много информации, и при этом размер файла не изменится и работоспособность файла не нарушится." Есть ли у кого информация о мерах против таких программ-закладок? ![]() |
Автор: sergejzr 26.4.2004, 23:29 | ||||||
--------------------------------------------------------------------------------------------------------------------------
Описанием вторго пути я хотел только привести аргумент против стеганографии в ехе файлах, оригиналы которых "злоумышленник" может получить. При этом возможность использования ехе как стегоконтейнера была чисто теоретической. Как я уже говорил извлечение информации это не проблема и осталось бы только "раскодировать" послание. Добавить информацию на этапе компиляции однако не составит особого труда. Вот пример:
(Я попробовал написать что нибудь толковое по англицкий, даже если это выглядит иначе.) Скомпилируй сей исходник в ехе. Открой полученный ехе любым текстовым редактором. Как ты видишь массив лежит в файле "открытым текстом". Теперь слова cats/catзаменяй на 1, а gog/dogs на 0. Получим 10110 что обозначает число 22 в двоичной системе. Но я думаю, что ты сама это знаешь. Теперь по поводу изменения бит в существующем ехе. Предположим в ехе находится текст (Что весьма вероятно). Как мы поняли этот текст открытый. То есть функциональность файла при изменении техта в БОЛьШИНСТВЕ случаев не будет нарушена. Как ты изменить техт, тут уже от случая к случаю надо решать. Допустим вариант: Вставлять орфографические ошибки. Звучиы грубо, но если ты навставляешь/постираешь запятых.... например говоришь, что предложение с одной запятой - 1, а без запятых - 0. Самое главное, писать можно ТОЛьКО в техт. -----------------------------------------------------------------------------------------------------------------------------------------------
Как я и говорил, невозможно этого сделать для ЛЮБЫХ ехе/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 |
Ребята (думаю, не оишиблась), ОГРОМНОЕ вам спасибо! Хотя мой препод сказал, что диплом неплохой, ваша помощь неоценима, т.к. такие штуки я обязательно включу в диплом! ![]() ![]() |
Автор: Гость_XpyDi 28.4.2004, 10:52 |
Относительно меня могу сказать, что это была не шутка, т. к. метод который описан в приведенной мною статье подходит не только для защиты программ, но и для сокрытия информации. Если ты сама пишешь программу то данный метод впихнуть намного проще, чем если ты используешь чужую программу в качестве стегоконтейнера. |
Автор: Urod 28.4.2004, 11:11 |
Да, статья неплохая! Но в ней речь идет о скрытом аудите (я бы даже сказала самоаудите) системы, и, каким образом это можно применить к стеганографии, мне что-то не очень понятно. Может, какой-нибудь пример в контексте данной статьи? ![]() |
Автор: XpyDi 30.4.2004, 01:31 | ||
Да там речь идёт о самоаудите, просто я дал ссылку на эту статью так как в ней описан метод, который можно использовать и для хранения скрытой информации в своих программах. Так, например, для вот такой структуры:
если нигде в программе нет явного обращения к полю 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 | ||
Например, через Far посмотреть F3? Об этом идет речь? ![]() |
Автор: Urod 30.4.2004, 13:26 | ||||
А почему? ![]() |
Автор: sergejzr 30.4.2004, 14:46 | ||||
Это ведь вроде текстовый редактор (не встречался..)? Тогда да! XpyDi Натолкнул на мысль. Такую прикольную, что я возьму свои слова обратно насчёт невозможности изменения сущ. ехе. Информации туда напихать можно. Предлагаю на рассмотрение след. факты. Идеи:
В случае позитивного ответа, такой способ действительно будет универсальным для ЛЮБОГО приложения. |
Автор: Monty 30.4.2004, 21:08 |
ох ... Запехните скрываемое сообщение в, допустим, calc.exe ... не выйдет и слова я свои не заберу ![]() ![]() 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 Прокомментируй, пожалуйста, свою идею. ![]() |
Автор: XpyDi 16.5.2004, 08:40 | ||
А чем тебе это не качественный уровен. Дело в том, что все выше описанное, да теперь и ниже в полной мере официально нигде не применяется и если ты ожидал увидеть здесь код который методом copy&paste ты просто откомпилируешь и получишь готовую программу, которыю легко подогнать под собственные нужды, то хочу тебя разачаровать не будет этого по-моему слишком рано выкладывать код, пока не все нюансы описанного метода известны. Извиняюсь, что долго не отвечал, был занят. Вообщем так. В чем отличие исполняемого файла от графического? В графическом мы можем незначительно изменять данные и этого никто не увидит, но при этом мы не можем менять структуру файла, т.е. насколько мне известно она достаточно жесткая, т.е. вначале заголовок, потом данные. В отличие от графических файлов, структура исполняемого файла формата PE более свободна, т.е. некоторые таблицы могут быть, а могут не быть, да и расположены они могут быть в различных местах, но в пределах дозволенного. Так вот самое первое, что приходит на ум, это во первых заполнять своими данными таблицы, которые присутвуют в файле, но не используются(да и такие есть, вот они современные оптимизаторы) например практически во всех файлах генерируемых компилятором Delphi есть талица reloc'ов, но в связи с тем, что exe всегда грузится по фиксированному адресу, то она становится не нужна. Также некоторые таблицы мы можем изменять так, что бы запихнуть туда насколько наших байтов или битов, например: таблица импорта, а точнее название библиотек и функций. Про изменение ресурсов и так сказано уже достаточно. Теперь перейдем к видоизменению кода и данных. ТУт дело обстоит сложнее, т.к. в отличии от графических файлов данные тут приктически никак не изменяются. Но у кода ингда встречаются неспользуемые куски, их можно найти автоматическим дизассемблированием и анализом файла(а иногда они встречаются, но используются динамически, и тогда файлу кранты). Но с кодом мы всегда можем произвести одну простую операцию это его сжать, потом сжать наше стегосообщение и в освободившееся место впихнуть всё что нам нужно. Визуально файл будет работать, как работал(пример того бесчисленное количество пакеров и протекторов для исполняемых файлов), но если заглянуть туда hex-редактором то определить, что он запакован не составит труда(а каким пакором не важно их сейчас столько появилось), правда чтобы определить есть ли там стегосообщение в некоторых случаях потребуеться анализ распаковывающего кода . Теперь про данные, этот метод я описывал выше. Он основывается на том, что практически всегда оптимизатор увеличивает обьем используемых данных для того, чтобы величить скорость доступа к ним (т.е. из-за выравнивания). Я предлагаю находить эти дырки и записывать туда наши данные, правда количество таких дирок слишком мало, чтобы записать туда что-либо отличное от иконки(да и то для больших программ), так что в данном случае первый кандидат чтобы туда впихнуть это простой ЦВД (т.е. водяной знак). Этот метод больше всего подходит для встраивания каких-либо стегосообшений в свои собственные программы. Т.е. создавая переменные через мекросы, которые потом размажут наше стегосообщение по секции данным мы потом соберем поиском неиспользуемых дырок. Достаточно кратенько больше лени расписывать, да и нехочеться одну(или несколько) идей заливать водой. |
Автор: Urod 25.5.2004, 13:44 |
XpyDi Подитожив способы: 1. Просто писать наше сообщение в незаполненые (или частично заполеннные) таблицы PE-файлов. Например, в их заголовки (там места больше). Или писать в таблицы импорта. При этом функциональность PE-файла не нарушается. Так? 2. Главное - мне понять, что ты подразумеваешь под понятиями код и данные. Т.к. для меня код - это текст программы, видимо наше понимание несколько отличается. Уточни, пож-та. Так вот: Находим пустые куски в коде дизассемблированием и/или анализом файла и заполняем их своим сообщением. Не поняла, что будет, если пустые куски файла "используются динамически"? Еще один метод встраивания стего в код - это его сжатие. Но, как я понимаю, сжатый файл наталкивает на размышления. Следовательно, вопрос: под какие случаи такое специальное сжатие файла (чтобы в его освободившиеся места впихнуть стего) можно замаскировать? Так сказать, я это сделал для того, чтобы... Чтобы не возникало у рецензента лишних подозрений и желаний проверить этот сжатый ф-л. 3. Мне непонятно, как, увеличивая объем данных, появляются дырки. Т.е. тоже кол-во данных просто размазывается по увеличенному объему, и соответственно, где-то появлюются дырки? Так? Но эти дырки слишком малы, чтобы вставить в них аообщение, поэтому данный способ подходит в основсном для ЦВЗ. Скажа, пож-та, правильно ли я тебя поняла. ![]() |
Автор: XpyDi 27.5.2004, 22:58 | ||||||||||||
Да, если редактировать с умом, т.к. иначе можно повредить важную таблицу (или её часть). Тут самое главное то, что можно редактировать все, что не используется загрузчиком, при этом есть несколько минусов:
Код - это те осмысленные инструкции на которые хотя бы один раз в процессе работы программы может исполнится процессором. Данные же это все остальные байты, т.е. те на которые передав управление программа скорее всего аварийно завершится. Так, например, если сожмем программу, то полученные после сжатия байты будут данными, но после того как мы ей (программу) распакуем и передадим её управление это будет код. Так и в любой программе есть куски кода (т.е. те которые исполняются) и данные. Я хотел сказать, что в некоторых случаях одни и теже байты могут быть как данными, так и кодом. Т.е. пока процессор не стал исполнять записанные там инструкции это данные, как только исполнил хоть раз, значит код. Вроде выразился как мог, надеюсь понятно что я хотел сказать.
Я написал не пустые, а не используемые. Это несколько разные вещи. Пустые в моем понимании это забитые нулями, а неиспользуемые это остаточная информация от каких-то таблиц, возможно какие-то данные или код, который оптимизитор случайно впихнул из-за своей несовершенности. Проблема в том, что могут найтись такие куски на которые нет явных ссылок, но управление на них передается конструкцией вида:
В таком случае очень тяжело в автоматическом режиме определить какой кусок кода выполнится после прогона этого куска (показан достаточно простая конструкция, которую все же можно посчитать автоматически, но если в эту конструкцию впихнуть что-нибудь что читает какие-то байты из памяти и на основе их считает адрес, то автоматический анализ не поможет кроме разве что трасировки да и то не 100% вариант)
На самом деле сейчас существует просто бешенное количество программа для сжатия исполняемых файлов, что определить чем и для чего сжат файл иногда просто невозможно. А сжимают файлы по нескольким банальным причинам:
Из-за выравнивания. Выравнивание - это дополнение некоторых структур нулевыми байтами, так что-бы все они располагались на границе(по адресу) кратному, например 2 байтам (сейчас чаще можно встретить 4,8 байт), Из-за того что программист может плохо расположить различные структуры в программе её размер за счет выравнивания может немного увеличиться (относительно размера всей программы 10%-20%). А встраивание ЦВЗ это наиболее подходящий вариант для исполняемых файлов, т.к. что ни говори, а размер свободного места в файле под стегосообщение всеже сильно (по сравнению с музыкальными и графическими файлами) ограничено. Единственное, что хочу напомнить, так это то, что ты можешь одно стего сообщение размазать по различным местам нашего файла и не только конкретного, но и тех, без которого запуск данной программы просто невозможен. |
Автор: Urod 15.6.2004, 13:56 |
Всем спасибо! К сожалению нет права поднять репутацию sergej.z и XpyDi за помощь и поддержку. Если это сделаю модераторы - это будет справедливо! |
Автор: podval 15.6.2004, 21:41 | ||
Сделал ![]() |
Автор: Urod 17.6.2004, 10:31 |
podval Замечательно! ![]() |
Автор: Marriage 6.7.2004, 22:28 |
А про Wav может мне кто - либо рассказать интернесного ??? И как можно улучшить этот метод ??? |
Автор: chipset 7.7.2004, 06:15 |
А что собссно? Берёшь читаешь спецификацию wav, и записываешь в каждую двухбайтку(одно) инфу, как и с BMP собссна... |
Автор: Marriage 7.7.2004, 21:27 |
Я спрашивал не как сделать, а как улучшить ... Вопрос наводящий ... Можно ли создать файл Wav ручками(я задавал уже этот вопрос в другом разделе, но так ответа конкретного и не дождался ![]() Иожно ли забивать вручную звук в файл ?? |
Автор: teRmit 8.7.2004, 14:11 |
Вручную то можно... но вот что ты в итоге получишь... скорее всего файл с шумами вместо музыки ![]() |
Автор: 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] |