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


Автор: Elfebet 25.7.2006, 09:45
делаю програмку для работы с zip архивами, и вот мне нужно как-то узнать екзешник это Zip SFX или нет. как это можно узнать? 

Автор: Sartorius 25.7.2006, 09:50
 Так посмотри че у него внутри. Не верю, что бы разработчики не оставляли после себя какую-нить строковую константу. Типа "Copyright Lempel et al." ))) 

Автор: Romikgy 25.7.2006, 10:03
C адресса 0х7800 имхо нормальный заголовок зипа , хотя могу и ошибатся, по крайней мере PK есть 100% smile 

Автор: Snowy 25.7.2006, 10:16
SFX модули могут быть от разных производителей.
Определяется очень просто. В конце ZIP файла (любого и sfx и неsfx хоть мегаfx) есть ссылка на таблицу файлов.
Таблица файлов находится в конце зипа и также имеет ZIP хедер.
После хедера идет ссылка на его начало, и завершается зип двумя нулями.
Просто читаем DWORD, начиная с 6-го байта с конца файла.
Если значение корректное (т.е. меньше длины файла), читаем 4 байта оттуда.
Если в этик 4-х байтах 'PK'#01#02 - это ZIP. 

Автор: Alexeis 25.7.2006, 10:17
Да вопрос сложный! Я тут пытался удалять ресурсы из SFX, оказывается, что удаление любого из них, даже значка! просводит к тому, что WinRar перестает опозновать свой SFX. Так  что тут не все так просто, наверное зашифрована некоторая специальная контрольная сумма - опознователь. 

Автор: Snowy 25.7.2006, 10:20
И даже ещё проще. Есть третий хедер - закрывающий.
Читаем его с 22-го байта с конца. Если по этому адресу лежит 'PK'#05#06 - это ZIP

Добавлено @ 10:21 
Цитата(alexeis1 @  25.7.2006,  10:17 Найти цитируемый пост)
Так  что тут не все так просто, наверное зашифрована некоторая специальная контрольная сумма - опознователь.
Нет, просто даны полные адреса внутри файла.
Если изменить его длину, а темболее выкинуть ресурс, то происходит смещение и данные уже лежат по другим адресам и не находятся.

Добавлено @ 10:23 
Вот. Беру первый попавшийся ZIP.
В конце прописан адрес на таблицу файлов $00060C0C
Если я захочу вставить в него значёк, то все данные сдвинутся и по адресу $00060C0C будет уже не PK хедер. Соответственно я не найду таблицу файлов -> архив повреждён

Добавлено @ 10:28 
Поправочка к предыдущему посту - закрывающий хедер не имеет фиксированной длины.
Так что просто читаем в стринг 32 последних байта и ищем в них pos('PK'#5#6, s)
Если нашли - это ZIP
Код

function IsZipFile(FileName: string): boolean;
var
  fs: TFileStream;
  s:   string[32];
begin
  try
    fs := TFileStream.Create(FileName, fmOperRead and fmShareDenyNone);
    fs.Read(s[1], 32);
    fs.Free;
  except end;
  result := pos('PK'#5#6, s) > 0;
end;


Добавлено @ 10:33 
Ээээ... Сорри.
Код писал в браузере - не работает.
Вот отладил, проверил:
Код
function IsZipFile(FileName: string): boolean;
var
  fs: TFileStream;
  s:   string;
begin
  try
    fs := TFileStream.Create(FileName, fmOpenRead and fmShareDenyNone);
    fs.Position := fs.Size - 32;
    SetLength(s, 32); fs.Read(s[1], 32);
    fs.Free;
  except end;
  result := pos('PK'#5#6, s) > 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if IsZipFile('C:\111.exe') then ShowMessage('Это Zip')
  else ShowMessage('Нифига не ZIP');
end;
 

Автор: Elfebet 25.7.2006, 10:47
Snowy, большое тебе человеческое спасибо! Поднял бы тебе репутацию, но пока мой статус этого не позволяет. smile  

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