Как декодировать файл правильно
В этой фирме есть сотрудник, почту любящий читать. Открывает как-то файл, кем-то вложенный нарочно, в недра письмеца пришедшего. Запустив без задней мысли «Благодарственное письмо.hta» и не увидев поздравления, покурить решил немного. Возвращаясь с перекура, он читает в беспокойстве:
pz8FkWJXdijcajJcWfhJ27TGPgcNNEKXDBcsdyzfX+lUoq68eAptVmGNIYLD8eti1kwicdOR59pwOC7XM7T+YLccqyeJqc5loxMCKy4pklzbMJBRm и т.д.
Теперь тоже самое другими словами. Сотруднику пришло письмо с вложением «Благодарственное письмо.rar» В теле письма указывалось что архив запаролен и давался пароль. Так уж совпало что в эти дни клиенты слали подобные письма и сотрудник ничего не заподозрил. Открыв архив и запустив вложение «Благодарственное письмо.hta». Через некоторое время почти все файлы приобрели расширение .BMCODE (дописалось в конец, не удаляя текст оригинального расширения) и в каждой папке лежала READ_ME_NOW. txt c указанным выше текстом. Пользователь сообщил «куда надо» и за дело взялись «кто надо».
Первым делом без паники взглянули в это *.hta и увидели:
Оригинальный код здесь и далее немного изменён и закомментирован дабы не было случайных запусков.
Смотрим дальше (у отдела началась истерика от смеха насколько всё гениально и просто):
Читаем, читаем и облегчённо выдыхаем. Ни о каком тотальном шифровании файлов речи не идёт.
Итак. Первым делом ищем ключи. Видим строки:
и понимаем, что для ключа используется UUID компьютера. С этого момента становится ещё легче и почти смело забываем про первую часть, где формируется страшный ключ, который добавляется в *.TXT
Из этого выясняем, что шифруется не весь файл, а только первая его часть если размер файла больше 40кб, если меньше, то весь файл.
Остается узнать UUID компьютера и написать скрипт для дешифровки.
UUID узнаем той же командой
Запустив в PowerShell, который зловред заботливо закачал и не удалил из %TEMP%.
Теперь за написание скрипта. Сложность возникла только в понимании (и то из-за нехватки знаний, т.к. не приходилось раньше сталкиваться), что по примерам у M$ подобные функции передают в качестве параметра строку, а тут используют просто массив.
Собственно, что поучилось. Данный код — рабочий, без изменений и с лишними выводами для отслеживания процесса работы.
Что он делает, что надо изменить если понадобиться самим:
1)задаем в ручную переменную $ek c нужным ключом (в нашем случае UUID)
2)Описание функции декодирования, которая возвращает массив. Задаём переменные $salt и $init согласно тем, что были в исходном коде зловреда.
3)Просим запускающего указать путь, начиная с которого будет поиск файлов (ищем по вложенным папкам)
4)Каждый найденный фаил с указанным расширением (.BMCODE) декодируем и переименовываем в нормальный вид.
5)Попутно удаются файлы с именем READ_ME_NOW. TXT, которые насоздавал зловред.
Код не идеален и многое можно упростить и переписать, но главное — он работает и помогает.
Вот и всё. Надеюсь эта статья поможет всем кто уже столкнулся с подобной проблемой и не знает, что делать. Как пишут в рунете злоумышленники требуют за расшифровку от 3000 до 10000 руб, но и встречаются более сложные варианты зловредов, где просто так ключ уже не узнать.
За сим прощаюсь и надеюсь, что всёже найду время и напишу как мы в своём НИИморгорворпроме устанавливали видео наблюдение и вешали мышку в качестве звонка на двери отдела.
UPD
По результатам переписки.
Вариант .TFCODE
В варианте .TFCODE используется случайный пароль длиной 50 знаков. Файл с паролем был найден в
C:\Documents and Settings\USER\Application Data. Фаил System Product Name
В коде зловреда реализована своеобразная проверка на повторный запуск
Если в файл уже записано good значит ключ уже так просто не найти. Так, что если случайно запустили зловреда или заметили, что файлы начали менять расширения, немедленно выключайте компьютер, чтобы остановить процесс шифровки и сохранить ключ.
Встроенная шифрованная файловая система (EFS) является оним из наиболее удобных и надежных инструментов операционной системы Microsoft Windows. Выполнение задачи расшифровки зашифрованных файлов может быть выполнено пользователем даже с не очень высоким уровнем компьютерной подготовки.
- Как расшифровать зашифрованные файлы
- Как расшифровать txt
- Как раскодировать документ
Вызовите главное меню системы Microsoft Windows нажатием кнопки «Пуск и перейдите в пункт «Все программы для выполнения операции расшифровки ранее зашифрованных файлов.
Раскройте ссылку «Стандартные и укажите пункт «Проводник для запуска приложения.
Вызовите контекстное меню подлежащего расшифровке файла, папки или диска кликом правой кнопки мыши и укажите пункт «Свойства .
Перейдите на вкладку «Общие открывшегося диалогового окна и выберите команду «Другие .
Снимите флажок на поле «Шифровать содержимое для защиты данных и нажмите кнопку OK для применения выбранных изменений. Следует помнить, что при выполнении отмены шифрования папки, зашифрованные файлы и подпапки остаются зашифрованными, если не оговорено обратное, а вновь создаваемые файлы и подпапки расшифрованной папки подвергаться процедуре шифрования не будут.
Загрузите бесплатный инструмент te19decrypt.exe с официального сайта разработчика антивирусного приложения Dr.Web и запустите исполняемый файл утилиты для выполнения операции расшифровки файлов, зашифрованных вирусом Trojan.Encoder. (Этот вирус является программой-вымогателем, шифрующим файлы пользователя и самоудаляющимся после этого. При этом на системном диске остается текстовый файл crypted.txt, содержащий требование денежных переводов разных сумм для расшифровки поврежденных файлов.)
Введите полный путь к нужному файлу в диалоговом окне «Открыть и нажмите кнопку OK для подтверждения выполнения команды.
Иногда для того, чтобы преобразовать текст в более удобный формат, нужно изменить его кодировку. Это несложная процедура, которая не требует особых знаний и не занимает много времени.
- Как перекодировать текстовый файл
- Как преобразовать текстовые форматы
- Как изменить кодировку
Установите пакет программ MS Office на ваш персональный компьютер. Если вам не нужны все программы, входящие в состав данного пакета, вы можете сделать выборочную установку, т.е. установить только те, которыми планируете пользоваться. В данном случае, чтобы изменить кодировку текста, вам понадобится приложение MS Word.
Запустите этот текстовый редактор. На панели инструментов найдите пункт меню «Файл», затем «Открыть». Найдите файл, в котором вы хотите преобразовать кодировку. Откройте его. На панели инструментов выберите пункт меню «Сервис», в появившемся списке выберите пункт «Параметры». Появится окно. В нем выберите вкладку «Общие».
Найдите пункт «Подтверждать преобразование формата файла при открытии». Установите напротив него флажок. Теперь при открытии любого закодированного текстового файла вы будете иметь возможность изменить его кодировку. Закройте документ.
Откройте его снова, чтобы перекодировать текстовый файл. Появится окно. В нем найдите строку «Кодированный текст». Найдите вкладку «Другая». Вы увидите список с различными типами кодировок. Подберите среди них нужную кодировку для вашего файла.
Найдите строку «Просмотр». Чтобы посмотреть, что получилось в результате перекодирования, нажмите на нее. Если текст не преобразовался в читабельный вид, измените кодировку. Обратите внимание на то, что если текст отображается исключительно в каком-то одном типе символов, это означает, что отсутствует нужный шрифт.
В можете скачать его на официальном сайте компании Microsoft. Если кодировка была подобрана удачно, сохраните изменения. На сегодняшний день самой распространенной кодировкой является Unicode. Она поддерживает не только европейские, но и арабские алфавиты, а также алфавиты стран Азии. Если вы хотите, что ваш текст был общедоступен, сохраняйте его именно в этой кодировке.
Вам когда-нибудь хотелось узнать как устроен jpg-файл? Сейчас разберемся! Прогревайте ваш любимый компилятор и hex-редактор, будем декодировать это:
Специально взял рисунок поменьше. Это знакомый, но сильно пережатый favicon Гугла:
Последующее описание упрощено, и приведенная информация не полная, но зато потом будет легко понять спецификацию.
Даже не зная, как происходит кодирование, мы уже можем кое-что извлечь из файла.
[FF D8] — маркер начала. Он всегда находится в начале всех jpg-файлов.
Следом идут байты [FF FE]. Это маркер, означающий начало секции с комментарием. Следующие 2 байта [00 04] — длина секции (включая эти 2 байта). Значит в следующих двух [3A 29] — сам комментарий. Это коды символов ":" и ")", т.е. обычного смайлика. Вы можете увидеть его в первой строке правой части hex-редактора.
Немного теории
- Обычно изображение преобразуется из цветового пространства RGB в YCbCr.
- Часто каналы Cb и Cr прореживают, то есть блоку пикселей присваивается усредненное значение. Например, после прореживания в 2 раза по вертикали и горизонтали, пиксели будут иметь такое соответствие:
- Затем значения каналов разбиваются на блоки 8x8 (все видели эти квадратики на слишком сжатом изображении).
- Каждый блок подвергается дискретно-косинусному преобразованию (ДКП), являющемся разновидностью дискретного преобразования Фурье. Получим матрицу коэффициетов 8x8. Причем левый верхний коэффициент называется DC-коффициентом (он самый важный и является усредненным значением всех значений), а оставшиеся 63 — AC-коэффициентами.
- Получившиеся коэффициенты квантуются, т.е. каждый умножается на коэффициент матрицы квантования (каждый кодировщик обычно использует свою матрицу квантования).
- Затем они кодируются кодами Хаффмана.
Закодированные данные располагаются поочередно, небольшими частями:
Каждый блок Yij, Cbij, Crij — это матрица коэффициентов ДКП (так же 8x8), закодированная кодами Хаффмана. В файле они располагаются в таком порядке: Y00Y10Y01Y11Cb00Cr00Y20.
Чтение файла
Файл поделен на секторы, предваряемые маркерами. Маркеры имеют длину 2 байта, причем первый байт [FF]. Почти все секторы хранят свою длину в следующих 2 байта после маркера. Для удобства подсветим маркеры:
Маркер [FF DB]: DQT — таблица квантования
- [00 43] Длина: 0x43 = 67 байт
- [0_] Длина значений в таблице: 0 (0 — 1 байт, 1 — 2 байта)
- [_0] Идентификатор таблицы: 0
Оставшимися 64-мя байтами нужно заполнить таблицу 8x8.
Приглядитесь, в каком порядке заполнены значения таблицы. Этот порядок называется zigzag order:
Маркер [FF C0]: SOF0 — Baseline DCT
Этот маркер называется SOF0, и означает, что изображение закодировано базовым методом. Он очень распространен. Но в интернете не менее популярен знакомый вам progressive-метод, когда сначала загружается изображение с низким разрешением, а потом и нормальная картинка. Это позволяет понять что там изображено, не дожидаясь полной загрузки. Спецификация определяет еще несколько, как мне кажется, не очень распространенных методов.
- [00 11] Длина: 17 байт.
- [08] Precision: 8 бит. В базовом методе всегда 8. Это разрядность значений каналов.
- [00 10] Высота рисунка: 0x10 = 16
- [00 10] Ширина рисунка: 0x10 = 16
- [03] Количество каналов: 3. Чаще всего это Y, Cb, Cr или R, G, B
- [01] Идентификатор: 1
- [2_] Горизонтальное прореживание (H1): 2
- [_2] Вертикальное прореживание (V1): 2
- [00] Идентификатор таблицы квантования: 0
- [02] Идентификатор: 2
- [1_] Горизонтальное прореживание (H2): 1
- [_1] Вертикальное прореживание (V2): 1
- [01] Идентификатор таблицы квантования: 1
- [03] Идентификатор: 3
- [1_] Горизонтальное прореживание (H3): 1
- [_1] Вертикальное прореживание (V3): 1
- [01] Идентификатор таблицы квантования: 1
Находим Hmax=2 и Vmax=2. Канал i будет прорежен в Hmax/Hi раз по горизонтали и Vmax/Vi раз по вертикали.
Маркер [FF C4]: DHT (таблица Хаффмана)
Эта секция хранит коды и значения, полученные кодированием Хаффмана.
- [00 15] Длина: 21 байт
- [0_] Класс: 0 (0 — таблица DC коэффициентов, 1 — таблица AC коэффициентов).
- [_0] Идентификатор таблицы: 0
Следующие 16 значений:
Количество кодов означает количество кодов такой длины. Обратите внимание, что секция хранит только длины кодов, а не сами коды. Мы должны найти коды сами. Итак, у нас есть один код длины 1 и один — длины 2. Итого 2 кода, больше кодов в этой таблице нет.
С каждым кодом сопоставлено значение, в файле они перечислены следом. Значения однобайтовые, поэтому читаем 2 байта:
Далее в файле можно видеть еще 3 маркера [FF C4], я пропущу разбор соответствующих секций, он аналогичен вышеприведенному.
Построение дерева кодов Хаффмана
Мы должны построить бинарное дерево по таблице, которую мы получили в секции DHT. А уже по этому дереву мы узнаем каждый код. Значения добавляем в том порядке, в каком указаны в таблице. Алгоритм прост: в каком бы узле мы ни находились, всегда пытаемся добавить значение в левую ветвь. А если она занята, то в правую. А если и там нет места, то возвращаемся на уровень выше, и пробуем оттуда. Остановиться нужно на уровне равном длине кода. Левым ветвям соответствует значение 0, правым — 1.
Деревья для всех таблиц этого примера:
В кружках — значения кодов, под кружками — сами коды (поясню, что мы получили их, пройдя путь от вершины до каждого узла). Именно такими кодами закодировано само содержимое рисунка.
Маркер [FF DA]: SOS (Start of Scan)
Байт [DA] в маркере означает — «ДА! Наконец-то то мы перешли к финальной секции!». Однако секция символично называется SOS.
- [00 0C] Длина: 12 байт.
- [03] Количество каналов. У нас 3, по одному на Y, Cb, Cr.
- [01] Идентификатор канала: 1 (Y)
- [0_] Идентификатор таблицы Хаффмана для DC коэффициентов: 0
- [_0] Идентификатор таблицы Хаффмана для AC коэффициентов: 0
- [02] Идентификатор канала: 2 (Cb)
- [1_] Идентификатор таблицы Хаффмана для DC коэффициентов: 1
- [_1] Идентификатор таблицы Хаффмана для AC коэффициентов: 1
- [03] Идентификатор канала: 3 (Cr)
- [1_] Идентификатор таблицы Хаффмана для DC коэффициентов: 1
- [_1] Идентификатор таблицы Хаффмана для AC коэффициентов: 1
[00], [3F], [00] — Start of spectral or predictor selection, End of spectral selection, Successive approximation bit position. Эти значения используются только для прогрессивного режима, что выходит за рамки статьи.
Отсюда и до конца (маркера [FF D9]) закодированные данные.
Закодированные данные
Последующие значения нужно рассматривать как битовый поток. Первых 33 бит будет достаточно, чтобы построить первую таблицу коэффициентов:
Нахождение DC-коэффициента
1) Читаем последовательность битов (если встретим 2 байта [FF 00], то это не маркер, а просто байт [FF]). После каждого бита сдвигаемся по дереву Хаффмана (с соответствующим идентификатором) по ветви 0 или 1, в зависимости от прочитанного бита. Останавливаемся, если оказались в конечном узле.
2) Берем значение узла. Если оно равно 0, то коэффициент равен 0, записываем в таблицу и переходим к чтению других коэффициентов. В нашем случае — 02. Это значение — длина коэффициента в битах. Т. е. читаем следующие 2 бита, это и будет коэффициент:
3) Если первая цифра значения в двоичном представлении — 1, то оставляем как есть: DC = <значение> . Иначе преобразуем: DC = <значение>-2^<длина значения>+1 . Записываем коэффициент в таблицу в начало зигзага — левый верхний угол.
Нахождение AC-коэффициентов
1) Аналогичен п. 1, нахождения DC коэффициента. Продолжаем читать последовательность:
2) Берем значение узла. Если оно равно 0, это означает, что оставшиеся значения матрицы нужно заполнить нулями. Дальше закодирована уже следующая матрица. В нашем случае значение узла: 0x31.
- Первый полубайт: 0x3 — именно столько нулей мы должны добавить в матрицу. Это 3 нулевых коэффициента.
- Второй полубайт: 0x1 — длина коэффициента в битах. Читаем следующий бит.
Читать AC-коэффициенты нужно пока не наткнемся на нулевое значение кода, либо пока не заполнится матрица.
В нашем случае мы получим:
Вы заметили, что значения заполнены в том же зигзагообразном порядке? Причина использования такого порядка простая — так как чем больше значения v и u, тем меньшей значимостью обладает коэффициент Svu в дискретно-косинусном преобразовании. Поэтому, при высоких степенях сжатия малозначащие коэффициенты обнуляют, тем самым уменьшая размер файла.
Аналогично получаем еще 3 матрицы Y-канала…
- DC для 2-ой: 2 + (-4) = -2
- DC для 3-ой: -2 + 5 = 3
- DC для 4-ой: 3 + (-4) = -1
Теперь порядок. Это правило действует до конца файла.
… и по матрице для Cb и Cr:
Вычисления
Квантование
Вы помните, что матрица проходит этап квантования? Элементы матрицы нужно почленно перемножить с элементами матрицы квантования. Осталось выбрать нужную. Сначала мы просканировали первый канал. Он использует матрицу квантования 0 (у нас она первая из двух). Итак, после перемножения получаем 4 матрицы Y-канала:
… и по матрице для Cb и Cr.
Обратное дискретно-косинусное преобразование
Формула не должна доставить сложностей. Svu — наша полученная матрица коэффициентов. u — столбец, v — строка. Cx = 1/√2 для x = 0, а в остальных случаях = 1. syx — непосредственно значения каналов.
Приведу результат вычисления только первой матрицы канала Y (после обязательного округления):
Ко всем полученным значениям нужно прибавить по 128, а затем ограничить их диапазон от 0 до 255:
Например: 138 → 266 → 255, 92 → 220 → 220 и т. д.
YCbCr в RGB
4 матрицы Y, и по одной Cb и Cr, так как мы прореживали каналы и 4 пикселям Y соответствует по одному Cb и Cr. Поэтому вычислять так: YCbCrToRGB(Y[y,x], Cb[y/2, x/2], Cr[y/2, x/2]):
Вот полученные таблицы для каналов R, G, B для левого верхнего квадрата 8x8 нашего примера:
Конец
Вообще я не специалист по JPEG, поэтому вряд ли смогу ответить на все вопросы. Просто когда я писал свой декодер, мне часто приходилось сталкиваться с различными непонятными проблемами. И когда изображение выводилось некорректно, я не знал где допустил ошибку. Может неправильно проинтерпретировал биты, а может неправильно использовал ДКП. Очень не хватало пошагового примера, поэтому, надеюсь, эта статья поможет при написании декодера. Думаю, она покрывает описание базового метода, но все-равно нельзя обойтись только ей. Предлагаю вам ссылки, которые помогли мне:
Читайте также: