C # Извлечь / разархивировать файл .EXE

Используя библиотеку DOTNETZIP, я могу в настоящее время распаковывать / извлекать файлы .ZIP, используя следующий код:

private void Unzip(object sender, EventArgs e)
{
    string zipPath = pub.DepoDirDaily + @"\";
    string unzipPath = pub.DepoDirDaily + @"\";

    DirectoryInfo efaFiles = new DirectoryInfo(zipPath);
    foreach (var file in efaFiles.GetFiles("*.exe*"))
    {
        if (file.ToString().Contains(pub.YYYMMDD_t0) && file.ToString().Contains(".exe"))
        {
            try
            {
                String FileName = file.ToString().Replace(zipPath, "");
                String FileNameClean = FileName.Replace(".exe", "");
                String OutputDir = unzipPath + FileNameClean;
                String InputDir = zipPath + file;

                ExtractFileToDirectory(InputDir, OutputDir, "password1");
             }
             catch (Exception ex)
             {
                 Console.WriteLine(ex);
             }
        }
    }
}

public void ExtractFileToDirectory(string existingZipFile, string outputDirectory, string Password)
{
    try
    {
         ZipFile zip = ZipFile.Read(existingZipFile);
         Directory.CreateDirectory(outputDirectory);

         foreach (ZipEntry e in zip)
         {
             e.Password = Password;
             e.Extract(outputDirectory); 
         }
     }
     catch (Exception ex)
     {
         Console.WriteLine(ex);
     }
}

Однако при попытке распаковать файлы .EXE я получаю следующую ошибку:

Ionic.Zip.ZipException: невозможно прочитать это как ZipFile ---> Ionic.Zip.BadReadException: неверная подпись (0x00505A4D) в позиции 0x00000000

Я исследовал дальше, и похоже, что DOTNETZIP не может обрабатывать файлы .EXE, так что это действительно имеет смысл. Я попытался переименовать расширение в .ZIP и попытаться разархивировать, но, к сожалению, возникла та же ошибка.

Похоже, что можно извлечь с помощью библиотеки 7ZIP, однако я изо всех сил пытаюсь найти какие-либо подходящие примеры в Интернете, а те, которые я делаю, не включают возможность включения пароля, поэтому бесполезны.

Есть ли у кого-нибудь что-нибудь, что может мне помочь? Было бы очень полезно использовать другую библиотеку, обходной путь или некоторую помощь в понимании библиотеки 7ZIP!

БЛАГОДАРНОСТЬ!


person dhowells217    schedule 12.11.2018    source источник
comment
Вы можете использовать 7ZIP из командной строки внутри вашего кода на C #. Просто используйте код C # для выполнения файла .exe и передайте правильные параметры в 7zip. Вам нужен только доступ к пути 7zip.exe, из которого вы запускаете приложение.   -  person Brad    schedule 12.11.2018
comment
Dotnetzip, конечно, может передавать файлы * .exe. Может быть, это вирусный сканер, мешающий извлечению?   -  person Klaus Gütter    schedule 12.11.2018
comment
@Brad Для выполнения через командную строку я использую что-то похожее на: System.Diagnostics.Process.Start (CMD.exe, comm); Где «комм» находится мой «текст команды»?   -  person dhowells217    schedule 12.11.2018
comment
@ KlausGütter Спасибо за подтверждение. Что касается вмешательства сканера вирусов, как мне к этому подойти?   -  person dhowells217    schedule 12.11.2018
comment
О каких exe-файлах идет речь? Вы пытаетесь распаковать самораспаковывающиеся архивы или просто хотите получить некоторые разделы ресурсов из exe-файлов?   -  person    schedule 12.11.2018
comment
Класс .Net System.IO.Compression.ZipFile может обрабатывать самораспаковывающиеся архивы.   -  person Jimi    schedule 12.11.2018
comment
@Jimi Насколько мне известно, это работает для файлов .EXE, но не позволяет указать пароль, если я прав?   -  person dhowells217    schedule 13.11.2018
comment
К сожалению, это не так. Посмотрите SharpZipLib, я думаю, он справится с обоими, но я м не уверен.   -  person Jimi    schedule 13.11.2018
comment
Привет, @elgonzo, честно говоря, я не уверен на 100%, что ты имеешь в виду. Мы получаем эти файлы .EXE, помещенные в SFTP, и они содержат некоторые файлы. Я могу использовать программу 7zip, чтобы вручную распаковать их, чтобы они превратились в обычную папку, а не на файл .txt, который мне действительно нужен. Это вообще помогает?   -  person dhowells217    schedule 13.11.2018
comment
Спасибо, @Jimi, сейчас проверю. Очень признателен.   -  person dhowells217    schedule 13.11.2018
comment
Также обратите внимание на этот SevenZipSharp - GitHub. Также доступен как пакет NuGet. Это порт исходной библиотеки 7-Zip. Он утверждает, что поддерживает как шифрование паролей, так и архивы Sfx (ну, как 7-Zip).   -  person Jimi    schedule 13.11.2018
comment
@Jimi Спасибо за предложение. Я посмотрю на SevenZipSharp, постараюсь найти хороший пример, который я могу использовать.   -  person dhowells217    schedule 13.11.2018
comment
IIRC, в нем уже есть тестовое решение / проект.   -  person Jimi    schedule 13.11.2018


Ответы (1)


Файл .exe не является zip-файлом, это переносимый исполняемый файл. Ознакомьтесь с предложениями Анализ простого файла Win32 PE (Exe / DLL) в .NET для библиотек, которые могут анализировать файл до некоторой предварительно обработанной формы, или вы можете просто прочитать его как двоичный файл и вытащить нужные поля самостоятельно.

person MadKarel    schedule 12.11.2018
comment
Спасибо за ссылку. Единственная причина, по которой я хочу его распаковать, - это получить доступ к файлу вручную. Я распаковываю его (как ни странно, на 7zip), чтобы получить доступ к самому файлу. Я прочту ваши ссылки, спасибо. - person dhowells217; 12.11.2018
comment
Я достаточно уверен, что OP ссылается не на любой exe-файл, а на самораспаковывающийся zip-файл, который представляет собой не что иное, как zip-файл плюс исполняемый мини-модуль, который извлекает это. - person Alejandro; 12.11.2018
comment
Спасибо @Alejandro - person dhowells217; 12.11.2018
comment
@ Алехандро, это не точно. Обратите внимание, как OP упоминает, что 7zip может это сделать. Но учтите, что 7zip можно использовать для извлечения ресурсов из файлов exe. Так что мне непонятно, говорит ОП о самораспаковывающихся архивах или нет ... - person ; 12.11.2018
comment
Я почти уверен, что @Alejandro прав. Дело в том, что самозаполняющийся zip-файл не является zip-файлом. Такая программа, как 7zip, считывает файл, распознает его как PE-файл, затем удаляет PE-идентичность файла и распаковывает zippy часть. Ваша zip-библиотека, вероятно, этого не делает - person Flydog57; 12.11.2018