Загадка файла: невидимый

Загадка файла: невидимый

460

Не так издавна, когда вы окончили работать по иной статье на хабре, я решил opravit разглядеть его на собственного друга. д.), я упаковал его в zip-архив и выслал адресату. Через 5 минут я получил обратную связь, которая, вопреки моим ожиданиям, был связан не с самой статьи, и тот факт, что архив был на сто процентов пустой. Почесывая затылок и думая, что я тупой с архивацией, я повторил функцию, убедившись, что они предоставили все нужное для запаковывания файлов. Сохранение HTML-странички со всем окружением (изображения, таблицы стилей и т. Несколько минут спустя знакомый опять вспыхнуло удивленное «ты шутишь?», а я не шучу.
Я начал, чтоб собрать воедино все элементы головоломки. Во-первых, я выяснила, что он пробует открыть архив. Вдруг, как зритель он употребляет какой-то залежалый мусор не получите ни от 1-го разраба? Я употреблял Тотал коммандер ом как пакет и просмотреть приобретенный архив, и в моем случае это был не пустой: Тем не наименее, он был по умолчанию explorer.exe.

Я попробовал открыть этот же архив на комп с помощью explorer.exe и, в конце концов, поверил собственному другу — архив вправду смотрелся пустым: Что, этот sbrocca xxxWindowsUltimateEditionxxx разочаровать?

Давайте поглядим правде в глаза. Кто виноват в таком поведении?
Перед чтением данной статьи настоятельно рекомендую прочесть предыдущую. Как проходил процесс, и что из этого вышло, читайте под катом (осторожно, много скриншотов).
Дальше, я нашел, что при использовании 7-zip как архив утилиты, содержимое получившегося архива расслабленно возникает в explorer.exe. Проверить «проблемный» архив на наличие ошибок с строить-в 7-zip, также ничего не выявили: Экспериментальным методом я установил, что неувязка воспроизводится, по последней мере, в присутствии знака ‘»‘ в имени архивного файла (к примеру, «»some_file.txt»).

7-zip файл-менеджер, в свою очередь, был заменен с ‘»‘ знак ‘<‘: Кстати, вы направили внимание, что заместо знаков ‘»‘ и ‘»‘ в уникальном архиве командер указывает знак подчеркивания (‘_’)?

Что это было? Не будем гадать и поглядим, что разных zip-архивов в случае, когда один Упакован с интегрированный архиватор общего командира, а 2-ой 7-zip’ом.
ситуация — я тормознул у пустой файл «»some_file.txt» (итоговый архив будет называться «»some_file.zip»). Потом оба архива распаковываются и занимают XVI32, который открывает оба приобретенный архив: Во-первых, мы создаем малый пример, который воспроизводит делему.

Неувязка архиве

Обычный архив

Чтоб быть уверенной, что конкретно разница меж этими файлами, давайте поглядим на спецификацию и на посторониих описание формата ZIP и «пропасти» нашей б на составные части: Уже невооруженным глазом, что их содержание различается друг от друга. Тем не наименее, это обязано не вызывать особенных чувств, поэтому что архиваторы могут написать информацию о для себя возлюбленной в любые «излишние» поля.

20 00 00 00 — Наружная АТР. 00 00 00 00 — смещение локального заголовка
3С 73 6Е 6Д 5Ф 65 66 69 74 78 74 65 6с 2е — Имя файла («<some_file.txt»)

Конец центрального каталога рекорд

50 4В 05 06 — подпись
00 00 — номер этого диска
00 00 — номер диска, на котором Центральный каталог начинается
01 00 — число центрального каталога записи на этот диск
01 00 — Общее число записей в центральный каталог
3С 00 00 00 — Центральный каталог Размер
2С 00 00 00 — смещение компакт-WRT на один диск
00 00 лен — комментарий время
Неизменного тока 46 — мод. Дата
00 00 00 00 — CRC 32 контрольных суммы
00 00 00 00 — сжатый Размер
00 00 00 00 — Несжатый Размер
0Е 00 — Имя файла лен
00 00 — доп поле лен
00 00 — файл комм. лен
00 00 — номер диска, на котором этот файл существует
00 00 — Внутренняя АТР. Неувязка архиве

Локального заголовка файла

50 4В 03 04 — подпись
14 00 — в pkzip версии не требуется, чтоб извлечь
02 00 — общее назначение бита флаг
00 00 — сжатие
83 55 — мод. время
Неизменного тока 46 — мод. Дата
00 00 00 00 — CRC 32 контрольных суммы
00 00 00 00 — сжатый Размер
00 00 00 00 — Несжатый Размер
0Е 00 — Имя файла лен
00 00 — доп поле лен
3С 73 6Е 6Д 5Ф 65 66 69 74 78 74 65 6с 2е — Имя файла («<some_file.txt»)

Центральный Каталог файлов заголовка

4Б 50 01 02 — подпись
14 00 — Версия
14 00 — PRZip версию нужно извлечь
02 00 — флаги
00 00 — сжатие
83 55 — мод.

Дата
00 00 00 00 — CRC 32 контрольных суммы
00 00 00 00 — сжатый Размер
00 00 00 00 — Несжатый Размер
0С 00 — Имя файла лен
00 00 — доп поле лен
С2 АВ 73 6Е 6Д 5Ф 65 66 69 74 78 74 65 6с 2е — Имя файла («B<<some_file.txt»)

Центральный Каталог файлов заголовка

4Б 50 01 02 — подпись
3ф 00 — Версия
0А 00 — PRZip версию нужно извлечь
00 08 — флаги
00 00 — сжатие
84 55 — мод. время
Неизменного тока 46 — мод. 20 00 00 00 — Наружная АТР. лен
00 00 — номер диска, на котором этот файл существует
00 00 — Внутренняя АТР. Обычный архив

Локального заголовка файла

50 4В 03 04 — подпись
0А 00 — в pkzip версии не требуется, чтоб извлечь
00 08 — общее назначение бита флаг
00 00 — сжатие
84 55 — мод. 00 00 00 00 — смещение локального заголовка
С2 АВ 73 6Е 6Д 5Ф 65 66 69 74 78 74 65 6с 2е — Имя файла («B<<some_file.txt»)
0А 00 20 00 00 00 00 00 01 00 18 00 при F0 88 3ф Д4 6Д В1 Н0 01 88 Ф0 3ф Д4 6Д В1 Н0 01 88 Ф0 3ф Д4 6Д В1 Н0 01 — доп поля

Конец центрального каталога рекорд

50 4В 05 06 — подпись
00 00 — номер этого диска
00 00 — номер диска, на котором Центральный каталог начинается
01 00 — число центрального каталога записи на этот диск
01 00 — Общее число записей в центральный каталог
61 00 00 00 — Центральный каталог Размер
В 2D 00 00 00 — смещение компакт-WRT на один диск
00 00 лен — комментарий Дата
00 00 00 00 — CRC 32 контрольных суммы
00 00 00 00 — сжатый Размер
00 00 00 00 — Несжатый Размер
0С 00 — Имя файла лен
24 00 — доп поле лен
00 00 — файл комм. время
Неизменного тока 46 — мод.
Как вы сможете созидать, в случае проблематично архива знак ‘»‘ вправду почему-то «перевоплотился» в ‘<‘ (0x3C), в то время как в обыкновенном архиве он продолжает оставаться самим собой (0xC2 0xAB — конкретно так, как она представлена в шифровке utf-8).
Модель 0x3C в 0xC2 0xAB (обратите внимание, что это обязано быть изготовлено в 2-ух местах), от 0x00 0x0E (Имя файла лен) от 0x00 0x0F (это также обязано быть изготовлено в 2-ух местах), 0x3C от 0x00 до 0x00 от 0x00 (Центральный каталог размер) от 0x00 0x3D от 0x00 до 0x00 (ведь мы в прошлых наших действий прирастили Размер Центрального каталога) и 0x2C от 0x00 до 0x00 от 0x00 (смещение компакт-WRT на один диск) на 0x2D от 0x00 от 0x00 до 0x00. Что раз мы просто заменить ‘<‘ в проблемных архив ‘»‘, естественно, сразу изменяя значения других байтов, который мы можем влиять таковым образом? Итог должен быть последующим:

Откройте архив, в explorer.exe и вижу:

Да, файл сейчас видна, но имя его очевидно что-то не так. Бродят по спецификации в поиск слово «юникод» и находим последующее:
Приложение D — Язык кодировки (ЭФС)
Для устранения этого ограничения, эта Спецификация будет поддерживать
последующие конфигурации. Это ограничивает хранение
Заглавие файла знаки лишь в уникальной МС-ДОС спектр значений
и подабающим образом не поддерживает имена файлов в остальных шифровках знаков, либо
языки. 1, Формат zip, исторически поддерживается лишь уникальный ПК IBM персонажа
кодирование набора, традиционно упоминается как IBM кодовая страничка 437. Д.
В шифровке utf-8 данные, хранящиеся снутри файлов zip
ожидается, что не имеется маркер порядка байтов (bom)
Поглядим, раз 11 битов поля флаги в наших вариантах: Эталон Unicode является размещенный в Юникоде
Консорциум (www.unicode.org). Раз общие цели 11 бит установлен, то
именованием и комментарий должен поддерживать Эталон Unicode, Версия 4.1.0 либо
больше, используя шифровку знаков, форма которой определена в шифровке utf-8 для хранения
Спецификация. 2 общие цели, раз бит 11 установлен, Имя файла и комментарий должен соответствовать
от начального zip-файла шифровку. Д.

Неувязка архиве

Обычный архив

Давайте ставить этот флаг в том случае, раз проблемный файл (инструменты -> манипуляцию бита)

и испытать опять получить доступ к нашему архиву в explorer.exe:

Верно, мы запамятовали, что поле flags на самом деле два:

Поставить нужные биты в этом поле и повторное открытие нашего архива:

Загрузить его к PE Tools с помощью клавиши Alt-1, Нажмите на «необязательный Заголовок» и убедиться, что база не поменяется (наиболее подробное описание этого процесса я рекомендую поглядеть в предшествующей статье): Для того чтоб осознать это, возьмем в руки OllyDbg и запустить его в исследуемых файловый менеджер. Но почему Тотал коммандер «делает» знак ‘»‘ на ‘<‘? Хотя, подождите, давайте проверим, является ли функция aslr технологии для totalcmd.exe. Здорово!

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

Удалить точки останова, срабатывающие на каждое ненужное действие (к примеру, в случае получения в ТК фокус окна по адресу 0x00567264):

Нажмите Alt-F5 (в ярлычек для архивирования файлов в Тотал коммандер е), нажмите на клавишу «OK» и оказываемся тут:

Для этого откройте окно «Memory» с Альт-М «- > левой клавишей мыши на первой строке -> Ctrl » и » Б -> введите «<some_file.txt» в поле «формате ASCII»: Давайте попробуем разобраться, уже сделал ТК преобразования знака ‘»‘ в ‘<‘.

Нажмите на «ОК» и мы лицезреем, что уже на данный момент приложение прибегали к конверсии:

Нажмите сочетание кнопок Alt + K, чтоб узреть Стек вызовов:

Установите точки останова в начале каждого из действий в перечне, нажмите кнопку F9, удалите архив и удостоверьтесь, что в памяти нет больше строчки «<some_file.txt». Потом опять запустите архив и приостановить процесс в самом начале с первой процедуры было показано ранее Стек вызовов у Dan:

Опять ищем ту же строчку в памяти процесса и отыскать ее…:

Ну и крайний логичный на данный момент поставить точки останова в начале крайнего вызова процедуры Стек е, из которых, фактически, нас сюда и позвал:

Прыгать на звонок (правой клавишей мыши по строке с адресом текущей процедуре в окно вызова стека а -> Показать вызову), подбегаем к предлагаемой OllyDbg начала процедуры и поставить бряк на это:

Ищем ту же строчку… и опять находим ее: Выполните те же шаги, что и ранее (тяжело нажмите кнопку F9, архив должен быть удален, проверьте память процесса в отсутствие строчки «<some_file.txt» нажмите Alt-F5 и клавиша «OK») и останавливаться лишь на тормоз.

Беря во внимание, что Стек вызовов пуст, мы можем представить, что мы не в главном потоке и потоке либо попали сюда в итоге условного либо безусловного перехода. Нажмите Ctrl-R и лицезреем:

Прыгать на одной ссылкой, нажав кнопку ввод:

Взор, который в свою очередь ссылается на эту строчку:

Прыгать там:

Заходим вовнутрь несколько процедур и поглядеть вызов функции также WinAPI функции createthread:

В принципе, вы сможете узреть это еще один метод сделать это, просто поглядите на ЦП Заголовок окна, который в моем случае был информирован о том, что идентификатор потока равен 0x000013B8:

В окне «журнальчик», открыть, нажав клавиши Alt-Л, понятно, что идентификатор главенствующего потока равна 0x00001E30:

Нажмите Alt-F5 на, ставим бряки на вызовы функции createthread

нажмите на «ОК» и останавливаться на уже знакомые нам:

Смотря пристально на то, что происходит снутри него, мы можем найти вызовы WinAPI пока функция CharToOem: Поглядите на Стек вызовов и способом «бинарного поиска» (разделите число входных характеристик в половину и поглядеть на итог) раскручивать цепочку вызовов разных процедур до состояния, когда становится понятно, что опосля звонка, который в памяти процесса возникает строчка «<some_file.txt» — это процесс, который находится по адресу 0x00491780.

Согласно официальной документации, эта функция преобразует переданную строчку в сектор OEM-определенный набор знаков, и, раз применять ANSI-версию, мы можем выполнить так именуемый «перевод на месте» (в src и dest могут указывать на один адресок, который избавит от необходимости создавать отдельный буфер для конца строчки), что и происходит в случае с ТС:
lpszDst [выход]
Тип: LPSTR
В мотивированной буфер, который получает переведенный текст. Это не может быть изготовлено, раз CharToOem употребляется как многобайтовая знаковая функция
Да, опосля того, как она именуется, переданный буфер уже содержит знак ‘<‘ заместо ‘»‘: Раз функция CharToOem употребляется как ANSI функция, строчка может быть переведена в место, установив lpszDst параметр по тому же адресу, что lpszSrc параметр.

Но давайте поначалу поглядим на характеристики архивации в ТК: Для чего нам патч?

По умолчанию опцию «пакет именами в формате Юникод» установить «спрашивать каждый раз Юникода имя встречается». Следовательно, ТС не считает, что встречали имя в Юникоде. А раз вы попробуете заархивировать файл, к примеру, с китайскими иероглифами?

В случае знак ‘»‘ такое сообщение, быстрее всего поэтому, что много кода страничек и (в моем случае, видимо, Шифровка cp1251) содержат знак в отведенной им доп «клеточки». Как видите, в данном случае, ТК показывает окно с сообщением нашел, что Имя файла содержит знаки, хорошие от кодовой странички, используемой. Но раз вы установите этот параметр, чтоб «все как utf-8, Раз по последней мере один содержит знаки>127», мы увидим, что файл «»some_file.txt верно Упакованные и потом возникает в explorer.exe.
Тот факт, что ‘<‘ является одним из знаков, которые запрещены для использования в именах каталогов и файлов в случае файловой системы NTFS: Вы сможете спросить: «почему, даже раз Имя файла было изменено с «»some_file.txt» на «<some_file.txt», explorer.exe не умеет выводить его хотя бы изменил заглавие»?
Последующие зарезервированные знаки:
< (меньше чем)
> (больше чем)
: (двоеточие)
«(двойная кавычка)
/ (косая черта)
(обратная косая черта)
| (вертикальная полоса либо труба)? Во-первых, из-за знака ‘»‘ во имя архива: (вопросительный символ)
* (звездочка)
Не считая того, распаковать этот архив-это интегрированные в Windows инструменты также не будет работать.

Во-вторых, из-за его содержимого:

Послесловие
В любом продукте есть баги / индивидуальности (именуйте как желаете), которые могут появляться в самых неожиданных местах, и чем труднее программная система, тем, как правило, чем больше ошибок вы отыщите. Не поленитесь изучить предпосылки lotniczego ваше поведение, поэтому что не исключено, что в процессе разведки, Вы узнаете что-то новое.
habrahabr.ru Спасибо за внимание, и еще раз надеюсь, что статья кому-нибудь понадобится.