Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как бы сделать zip не zip'ом


Автор: Snowy 26.11.2004, 10:39
Проблема такая:
Нужно хранить информацию в zip'е. Файл шифруется паролем. Программа распаковывает файлы напрямую в память. Расширение у файла совершенно левое. Но как бы сделать еще так, чтобы архиватор не видел, вообще, что это зип и не показывал даже список файлов?
Простая подмена заголовка не проходит. RAR, например, не может распаковать, но все равно уверенно говорит, что это zip, только поврежденный и показывает список файлов. Причем могет еще и восстановить поврежденный заголовок.
Может у кого есть умные мысли по этому поводу?

Автор: Jureth 26.11.2004, 10:48
Заксорь весь файл - процесс несложный, легко обратимый, но с уверенностью сказать что это - zip не сможет никто.

Автор: Girder 26.11.2004, 10:56
Цитата(Snowy @ 26.11.2004, 10:39)
Простая подмена заголовка не проходит.
А там их два... smile

Автор: Snowy 26.11.2004, 11:24
ксорить файл не лучший вариант: Хотелось бы перед началом работы восстановить файл, чтобы можно было работать, а при завершении работы снова его поломать. Ксор подойдет, но если файлик достаточно крупный будет, то это может занять гораздо большее время.
Как вариант да. Но каждый раз перебирать весь файл... Сейчас просто меняю первые 2 байта с PK на MZ smile
Насчет двух заголовков проверил... Нашел три smile Попробовал заменить первый и второй PK на MZ. Сработало. Теперь бы определиться как оперативно искать второй...

Автор: Snowy 26.11.2004, 11:53
Вот, блин. Почитал описание, поковырял зипы. Там заголовок в начале, заголовок в конце, да еще заголовок перед каждым файлом. А, если там 100 файлов, то и заголовков будет уже за 202.
Идет первый заголовок, потом заголовок-файл, заголовок-файл. В конце зипа еще один заголовок и снова заголовки всех файлов в архиве. Замучаешься менять! А RAR сканит побайтно весь файл в поисказ заголовков. Хоть 200 метров спереди положи, все равно находит. И распаковывает!
Не ксорить же в самом деле...

Автор: oleg1973 26.11.2004, 12:04
неужели так сложно
1) зазиповать
2) заксорить

и все

Автор: Akella 27.11.2004, 11:22
Цитата
неужели так сложно
1) зазиповать
2) заксорить


Цитата
ксорить файл не лучший вариант: Хотелось бы перед началом работы восстановить файл, чтобы можно было работать, а при завершении работы снова его поломать. Ксор подойдет, но если файлик достаточно крупный будет, то это может занять гораздо большее время.
Как вариант да. Но каждый раз перебирать весь файл... Сейчас просто меняю первые 2 байта с PK на MZ
Насчет двух заголовков проверил... Нашел три  Попробовал заменить первый и второй PK на MZ. Сработало. Теперь бы определиться как оперативно искать второй...

Автор: Akina 29.11.2004, 10:02
Цитата(Snowy @ 26.11.2004, 12:53)
А RAR сканит побайтно весь файл в поисказ заголовков. Хоть 200 метров спереди положи, все равно находит. И распаковывает!

1) Сканируешь файл, находишь все заголовки.
2) Составляешь таблицу смещений всех заголовков, пишешь е в конец файла, обозначая старт-сигнатурой и защищая контрольной суммой.
3) Правишь все заголовки до неопознаваемости.
При распаковке (в смысле перед) просто восстанавливаешь заголовки. Хвост можно не отрезать - подумаешь архивер ругнется что там в конце грязь...

Автор: Snowy 29.11.2004, 12:14
Спасибо, уже разобрался. У меня тоже такая идея была. Но пошла немножко дальше.
Зачем класть в хвост таблицу со смещениями, когда она там уже есть! Сам зип уже позаботился, как искать быстро начало файла. Для скорости можно туда закинуть смещения начала хвостовой таблицы.
От него по смещению 2A получаем 4 байта - адрес в файле. По этому адрему меняем 2 байта на любые другие. Затем смещаемся от этого адреса на 1A, получаем длину имени файла. Затем возвращаемся в самое начало, сдвигаем на длину имени файла, и там заголовок следующего файла. И так далее, пока не дойдем до коментария.
Кстати, архиватор не ругнется - в хвосте сидит коментарий (даже если мы его туда и не клали, то все равно есть пустой).
Теперь осталось это только реализовать...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)