![]() |
|
![]() ![]() ![]() |
|
Гость_XpyDi |
|
|||
Unregistered |
Относительно меня могу сказать, что это была не шутка, т. к. метод который описан в приведенной мною статье подходит не только для защиты программ, но и для сокрытия информации. Если ты сама пишешь программу то данный метод впихнуть намного проще, чем если ты используешь чужую программу в качестве стегоконтейнера.
|
|||
|
||||
Urod |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 376 Регистрация: 10.4.2004 Где: Москва Репутация: 1 Всего: -1 |
Да, статья неплохая! Но в ней речь идет о скрытом аудите (я бы даже сказала самоаудите) системы, и, каким образом это можно применить к стеганографии, мне что-то не очень понятно.
Может, какой-нибудь пример в контексте данной статьи? ![]() |
|||
|
||||
XpyDi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 25.11.2002 Где: USSR Репутация: 2 Всего: 2 |
Да там речь идёт о самоаудите, просто я дал ссылку на эту статью так как в ней описан метод, который можно использовать и для хранения скрытой информации в своих программах. Так, например, для вот такой структуры:
если нигде в программе нет явного обращения к полю 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 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 376 Регистрация: 10.4.2004 Где: Москва Репутация: 1 Всего: -1 |
Например, через Far посмотреть F3? Об этом идет речь? ![]() |
|||
|
||||
Urod |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 376 Регистрация: 10.4.2004 Где: Москва Репутация: 1 Всего: -1 |
А почему? ![]() |
||||
|
|||||
sergejzr |
|
||||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 4 Всего: 360 |
Это ведь вроде текстовый редактор (не встречался..)? Тогда да! XpyDi Натолкнул на мысль. Такую прикольную, что я возьму свои слова обратно насчёт невозможности изменения сущ. ехе. Информации туда напихать можно. Предлагаю на рассмотрение след. факты. Идеи:
В случае позитивного ответа, такой способ действительно будет универсальным для ЛЮБОГО приложения. Это сообщение отредактировал(а) sergej.z - 30.4.2004, 15:16 |
||||
|
|||||
Monty |
|
|||
![]() Advanced Lamer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3511 Регистрация: 3.4.2003 Где: Гваделупа Репутация: нет Всего: 27 |
ох ... Запехните скрываемое сообщение в, допустим, calc.exe ... не выйдет и слова я свои не заберу
![]() ![]() PS лень расписывать ... все кратко -------------------- ... О, вещая моя печаль, О, тихая моя свобода И неживого небосвода Всегда смеющийся хрусталь! |
|||
|
||||
XpyDi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 25.11.2002 Где: USSR Репутация: 2 Всего: 2 |
Urod
Просто случай из практики. Я не имея исходных текстов программы не мог точно сказать, что за стурктура и какой ёе размер пока не увидел конкретных обращений к элементам массива, но с массивом можно работать поэлементно, а можно просто скопировать его в какой-нибудь буфер и работать с ним уже не как с массивом, а как с записью, и вот тут если жо этого все элементы массива были размером байт, то в записи некоторые стали размером 4 байта, некоторые 5 байт, а некоторые так и остались 1 байтовыми. И без анализа кода который с ним работает ничего конкретно сказать нельзя. sergej.z Некоторая поправка, если ты не проинициализируешь переменную, то физически в файл она записана не будет. Но все константы указанные в программе записываються в саму программу. Т.е. строка проинициализированная явным образом или массив или структура и т.д. Monty Не обижайся, но мне все равно заберешь ты свои слова или нет. Я только хочу сказать, что в где-то 80% случаев это можно сделать для чужой программы. А для своей я думаю, что это самый простой и эффективный способ. Насчет того реально ли найти такие излишки в программе автоматическом режиме или нет. Думаю что реально, но обязательно нужен потом прогон программы, хотя и он не дает гарантии, что теперь все работает. Так же если данный способ не пройдет то в программе очень много мест в которые можно запихнуть по 1 байту, хотя оно и очень сильно ограниченно поэтому в программу вряд ли удастся запихнуть сообщение представляющее собой хотя бы 50 % размера программы, а может и 25% P.S. Разделаюсь сессией и попытаюсь впихнуть что-нибудь в calc.exe для демонстрации реальности всего вышеизоложенного. |
|||
|
||||
Guest |
|
|||
Unregistered |
А нельзя ли о встраивании стего в бинарники как-нибудь по-проще? Так сказать на качественном уровне. XpyDi
sergej.z |
|||
|
||||
Urod |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 376 Регистрация: 10.4.2004 Где: Москва Репутация: 1 Всего: -1 |
XpyDi
Прокомментируй, пожалуйста, свою идею. ![]() |
|||
|
||||
XpyDi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 25.11.2002 Где: USSR Репутация: 2 Всего: 2 |
А чем тебе это не качественный уровен. Дело в том, что все выше описанное, да теперь и ниже в полной мере официально нигде не применяется и если ты ожидал увидеть здесь код который методом copy&paste ты просто откомпилируешь и получишь готовую программу, которыю легко подогнать под собственные нужды, то хочу тебя разачаровать не будет этого по-моему слишком рано выкладывать код, пока не все нюансы описанного метода известны. Извиняюсь, что долго не отвечал, был занят. Вообщем так. В чем отличие исполняемого файла от графического? В графическом мы можем незначительно изменять данные и этого никто не увидит, но при этом мы не можем менять структуру файла, т.е. насколько мне известно она достаточно жесткая, т.е. вначале заголовок, потом данные. В отличие от графических файлов, структура исполняемого файла формата PE более свободна, т.е. некоторые таблицы могут быть, а могут не быть, да и расположены они могут быть в различных местах, но в пределах дозволенного. Так вот самое первое, что приходит на ум, это во первых заполнять своими данными таблицы, которые присутвуют в файле, но не используются(да и такие есть, вот они современные оптимизаторы) например практически во всех файлах генерируемых компилятором Delphi есть талица reloc'ов, но в связи с тем, что exe всегда грузится по фиксированному адресу, то она становится не нужна. Также некоторые таблицы мы можем изменять так, что бы запихнуть туда насколько наших байтов или битов, например: таблица импорта, а точнее название библиотек и функций. Про изменение ресурсов и так сказано уже достаточно. Теперь перейдем к видоизменению кода и данных. ТУт дело обстоит сложнее, т.к. в отличии от графических файлов данные тут приктически никак не изменяются. Но у кода ингда встречаются неспользуемые куски, их можно найти автоматическим дизассемблированием и анализом файла(а иногда они встречаются, но используются динамически, и тогда файлу кранты). Но с кодом мы всегда можем произвести одну простую операцию это его сжать, потом сжать наше стегосообщение и в освободившееся место впихнуть всё что нам нужно. Визуально файл будет работать, как работал(пример того бесчисленное количество пакеров и протекторов для исполняемых файлов), но если заглянуть туда hex-редактором то определить, что он запакован не составит труда(а каким пакором не важно их сейчас столько появилось), правда чтобы определить есть ли там стегосообщение в некоторых случаях потребуеться анализ распаковывающего кода . Теперь про данные, этот метод я описывал выше. Он основывается на том, что практически всегда оптимизатор увеличивает обьем используемых данных для того, чтобы величить скорость доступа к ним (т.е. из-за выравнивания). Я предлагаю находить эти дырки и записывать туда наши данные, правда количество таких дирок слишком мало, чтобы записать туда что-либо отличное от иконки(да и то для больших программ), так что в данном случае первый кандидат чтобы туда впихнуть это простой ЦВД (т.е. водяной знак). Этот метод больше всего подходит для встраивания каких-либо стегосообшений в свои собственные программы. Т.е. создавая переменные через мекросы, которые потом размажут наше стегосообщение по секции данным мы потом соберем поиском неиспользуемых дырок. Достаточно кратенько больше лени расписывать, да и нехочеться одну(или несколько) идей заливать водой. Это сообщение отредактировал(а) XpyDi - 16.5.2004, 08:43 |
|||
|
||||
Urod |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 376 Регистрация: 10.4.2004 Где: Москва Репутация: 1 Всего: -1 |
XpyDi
Подитожив способы: 1. Просто писать наше сообщение в незаполненые (или частично заполеннные) таблицы PE-файлов. Например, в их заголовки (там места больше). Или писать в таблицы импорта. При этом функциональность PE-файла не нарушается. Так? 2. Главное - мне понять, что ты подразумеваешь под понятиями код и данные. Т.к. для меня код - это текст программы, видимо наше понимание несколько отличается. Уточни, пож-та. Так вот: Находим пустые куски в коде дизассемблированием и/или анализом файла и заполняем их своим сообщением. Не поняла, что будет, если пустые куски файла "используются динамически"? Еще один метод встраивания стего в код - это его сжатие. Но, как я понимаю, сжатый файл наталкивает на размышления. Следовательно, вопрос: под какие случаи такое специальное сжатие файла (чтобы в его освободившиеся места впихнуть стего) можно замаскировать? Так сказать, я это сделал для того, чтобы... Чтобы не возникало у рецензента лишних подозрений и желаний проверить этот сжатый ф-л. 3. Мне непонятно, как, увеличивая объем данных, появляются дырки. Т.е. тоже кол-во данных просто размазывается по увеличенному объему, и соответственно, где-то появлюются дырки? Так? Но эти дырки слишком малы, чтобы вставить в них аообщение, поэтому данный способ подходит в основсном для ЦВЗ. Скажа, пож-та, правильно ли я тебя поняла. ![]() |
|||
|
||||
XpyDi |
|
||||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 25.11.2002 Где: USSR Репутация: 2 Всего: 2 |
Да, если редактировать с умом, т.к. иначе можно повредить важную таблицу (или её часть). Тут самое главное то, что можно редактировать все, что не используется загрузчиком, при этом есть несколько минусов:
Код - это те осмысленные инструкции на которые хотя бы один раз в процессе работы программы может исполнится процессором. Данные же это все остальные байты, т.е. те на которые передав управление программа скорее всего аварийно завершится. Так, например, если сожмем программу, то полученные после сжатия байты будут данными, но после того как мы ей (программу) распакуем и передадим её управление это будет код. Так и в любой программе есть куски кода (т.е. те которые исполняются) и данные. Я хотел сказать, что в некоторых случаях одни и теже байты могут быть как данными, так и кодом. Т.е. пока процессор не стал исполнять записанные там инструкции это данные, как только исполнил хоть раз, значит код. Вроде выразился как мог, надеюсь понятно что я хотел сказать.
Я написал не пустые, а не используемые. Это несколько разные вещи. Пустые в моем понимании это забитые нулями, а неиспользуемые это остаточная информация от каких-то таблиц, возможно какие-то данные или код, который оптимизитор случайно впихнул из-за своей несовершенности. Проблема в том, что могут найтись такие куски на которые нет явных ссылок, но управление на них передается конструкцией вида:
В таком случае очень тяжело в автоматическом режиме определить какой кусок кода выполнится после прогона этого куска (показан достаточно простая конструкция, которую все же можно посчитать автоматически, но если в эту конструкцию впихнуть что-нибудь что читает какие-то байты из памяти и на основе их считает адрес, то автоматический анализ не поможет кроме разве что трасировки да и то не 100% вариант)
На самом деле сейчас существует просто бешенное количество программа для сжатия исполняемых файлов, что определить чем и для чего сжат файл иногда просто невозможно. А сжимают файлы по нескольким банальным причинам:
Из-за выравнивания. Выравнивание - это дополнение некоторых структур нулевыми байтами, так что-бы все они располагались на границе(по адресу) кратному, например 2 байтам (сейчас чаще можно встретить 4,8 байт), Из-за того что программист может плохо расположить различные структуры в программе её размер за счет выравнивания может немного увеличиться (относительно размера всей программы 10%-20%). А встраивание ЦВЗ это наиболее подходящий вариант для исполняемых файлов, т.к. что ни говори, а размер свободного места в файле под стегосообщение всеже сильно (по сравнению с музыкальными и графическими файлами) ограничено. Единственное, что хочу напомнить, так это то, что ты можешь одно стего сообщение размазать по различным местам нашего файла и не только конкретного, но и тех, без которого запуск данной программы просто невозможен. |
||||||||||||
|
|||||||||||||
Urod |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 376 Регистрация: 10.4.2004 Где: Москва Репутация: 1 Всего: -1 |
Всем спасибо! К сожалению нет права поднять репутацию sergej.z и
XpyDi за помощь и поддержку. Если это сделаю модераторы - это будет справедливо! |
|||
|
||||
podval |
|
|||
![]() Где я? Кто я? ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3094 Регистрация: 25.3.2002 Где: СПб Репутация: 18 Всего: 62 |
Сделал ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |