25 мая 2012 г.

Исследование неизвестных форматов файлов...


Исследование неизвестных форматов файлов

Есть такая серия игр Максима Хорина вот здесь можете посмотреть всякие там пятнашки,карты,логические и прочие эротического содержания выигрываем переходим на следующий уровень,получаем раздетую девушку по частям :)



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

Но вот попались игры Максима Хорина,и тут я зубы обламал, так как не сломать регистрацию и не разобраться в формате хранимых фото.

Если мы заглянем в папку где игрушка наша лежит то находим странные файлы *.sgdt

Привожу свои размышления на счет ковыряния в этом формате

Открываем в тотале любой файл такого формата F3-3 что бы видеть в хекс виде или в любом хекс редакторе советую WinHex в нем жмем F2 и можем посмотреть энтропию (сжат файл или нет)

Индикатор сжатия

Идут сжатые данные

А этот блок без сжатия

2010005.sgdt
==============
И так мы знаем что данный файл это набор фото до 10 штук максимус
в среднем 5..6 фото

со смещения 00001750 начинаются упакованные или зашифрованные данные
возможно и то и другое вместе и/или вариант X(неизвестный алгоритм).

==============================================
Разделим файл на несколько логических блоков объединненых
каким либо общим свойством
==============================================
1.Если бегло просмотреть весь файл то мы и увидим все эти блоки.
Друг от друга они отличаются графически (ну псевдографически)

1.1 Желательно бы написать программу которая будет выделять разные
блоки разными цветами.Для начала можно пользователю доверить
что и каким цветом выделять.

Вариант первый это сделать пару скриншотов,обрезать лишнее и подать
программе(ну возьмем фотошоп).Открываем в фотошопе,включаем сетку
далее настраиваем клетки сетки под размер байта.
Находим хотя бы одну строчку с одинаковыми байтами (0x00 or 0xFF or etc)
Закрашиваем эту строчку каким либо светлым цветом.

Программа в идеале конечно должна сама искать одинаковые строки
по заданным шаблонам(маски пользователя) и конечно сама перебирать
различные варианты.Но оставим это реализацию для домашнего задания.

Второй вариант это использование компонента RichEdit или любого другого удобного для изменения подсветки в тексте.Так даже
проще и легче.Программа ишет строку из n байт равных 0х00 или 0хFF как самый простой вариант.
Далее изменяет цвет данной строки(подкрашивает её).Вот и все.

Мы немного отвлеклись от главной темы.Продолжим.И так что же нам дает это разделение на блоки?

Это дает нам информацию из чего же состоит данный файл.Из каких частей он смастерен.
Хорошо к примеру мы нашли 10 крупных блоков при беглом осмотре файла (утопили клавишу вниз и отмечали маркером нужные места)
и n-ое кол-во мелких блоков.Что мы можем с них получить? Как они подведут к тому что же они хранят и что с них можно практического получить?

Ответ прост нужно начинать анализ каждого отдельного блока.Забегая вперед скажу что необходимо найти ссылки(links offset's) с одного блока на другой
это можно сделать используя теорию графов (да конечно это целый раздел математики,но мы будем использовать малую долю которая применяется только в программировании
минуя лишнюю теорию и громоздкие непонятные формулы).

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

Первое что мы можем отыскать в блоке это конечно же текст.Используя различные кодировки мы можем прогнать данный блок через такой анализатор кодировок ( конечно и его
необходимо написать) анализатор будет просто сменять одну кодировку на другую и ждать действий пользователя (пользователь увидел осмысленный текст,пускай даже
не зная языка на котором он написан,но все же).Не забываем про такие техники как кодировка base-64 uue и т.п.

Итак текст мы получили.Дальше проведем такую проверку как сжат ли блок.Все тоже просто используем чужой или свой анализатор-сканер,сканер проверяет энтропию файла
Уравнение энтропии простое и найти его можно в любом поисковике ну так уж и быть вот оно: ent=-log2P где p=f(s) это фу-ия вероятности появления символа в данном блоке(либо в файле),подсчитуется кол-во одинаковых символов и делим на размер файла или блока(смотря что мы берем).Если энтропия больше 1 тогда нет сжатия иначе есть.Сканируем и получаем результат файл сжат или нет.Другой вопрос если сжат то чем?

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

Шагаем дальше.Как отличить зашифрованный файл от запакованного? Размышляем логически,запакованный файл становится меньше чем был.А вот шифрованный файл может остаться
таким каким и был,а может даже стать большим чем есть (используя тот же мусор,к тому же криптографический алгоритм сам в своей идеи может нести "эффект" увеличения размера

это нечто похожее на форматирование типов данных,например пароль должен быть 14 символов,а пользователь ввел только 10,программа сама добавляет 4 недостающих символа).
Одно можно сказать точно.Это то что
- во-первых делая частотный анализ блока или файла мы не найдем избыточную информацию(она присутствовала только в старых блочных шифрах)
- во-вторых не будет ни какой!!! закономерности в соседних байтах,словах,даже строчках и т.п это практически просто хаос-мусор

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

Самый простой шифр который мы можем взломать это xor (логическая операция ислючающее ИЛИ) ну и конечно различные примитивные шифры:шифр Вижинера,шифр Цезаря,и другие
подобные шифры использующие подстановку,замену,моноалфавитную и полиалфавитную,короче говоря блочные синхронные шифры.Ну а ксор само просто ломать технология такая:
Из ксоренного файла мы выбираем блоки различной длинны начиная от байта и до вкючая пол файла или более.Этот блок мы используем в качестве ключа,подавая на вход программе

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

Дальнейший анализ уводит нас в глубь информатики.Нам просто необходимо выяснить как блок хранит в себе информацию.Т.е каким способом он это делает.
А делать он это может только используя стандартные типы данных которые имеются в любом языке программирования.Это byte,word,dword,integer,string,char etc
это что касает паскаля.Начнем форматировать блок в начале по байтам,потом по словам и т.д.Смотря на результат.

Результат может быть таким, блок изначально мы форматировали по байтно,а после использования по словам мы увидели текст (Unicode использует 2 байта для одной буквы
вместо старых кодировок используюших по байту на символ).Или будет видно что появилась новая псевдо графика.

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

Если вернуться с небес на землю.То мы сразу видим огромный блок сжатый по самые яйца и кучу мелких блоков.Теперь нам надо разжать этот блок чтобы получить
n-ое кол-во фоток.Как мы будем действовать.Для начала необходимо прогнать на хоr по простейшим цифровым ключам 000 111 222 и т.п. и заново взглянуть на блоки
может и поможет.

Далее читаем метод кодирования хафмена и создаем такое же дерево разбора(это уже мы лезем к спискам,графам и различным деревьям,их обходам,но когда
то же надо начинать) получая промежуточные данные и так далее пока не получим расжатое изображение.Как мы узнаем что расжали? Да очень просто
посмотрим на любую фоту и увидим как она изменяется и строится.

Ключ для разгадки лежит конечно в смежных пикселах,грубо говоря соседние пикселы не начинают
резко изменять свои цвета(в нашем случае этот так) цвета не могут резко скакать иначе это будет не фото а пожеванное фото.Знающие люди конечно скажут что просто так
ничего не получится в jpg используется Дискретно Косинусное Преобразование (ДКС) матрицы квантования и т.д.Да это все там есть,но я и не даю конкретных решений,
я всего лишь размышляю,и сам являюсь бестолковым двоишником :) Описываю всего лишь множества идей может даже и не верных.

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

Удачи в исследовании.





Комментариев нет:

Отправить комментарий