Как я могу получить хеш текущего .exe? - PullRequest
4 голосов
/ 16 января 2012

[решено] : я скопировал файл и запустил хеш для этой копии.

Мне нужно мое приложение, чтобы найти текущий MD5 в EXE. Я могу получить MD5 любого файла. Однако, независимо от того, что я делаю, я не могу получить FileStream для чтения открытого EXE. Я пытался использовать FileOptions.Asynchronous, но это не помогло.

РЕДАКТИРОВАТЬ: Я думаю, я не очень ясно. Я хочу, чтобы мое приложение могло читать само.

РЕДАКТИРОВАТЬ к коду:

private void GetMd5()
{
    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

    FileInfo fi = new FileInfo(Process.GetCurrentProcess().MainModule.FileName);
    FileStream stream = File.Create(Process.GetCurrentProcess().MainModule.FileName, (int)fi.Length, FileOptions.Asynchronous);

    md5.ComputeHash(stream);

    stream.Close();

    string rtrn = "";
    for (int i = 0; i < md5.Hash.Length; i++)
    {
        rtrn += (md5.Hash[i].ToString("x2"));
    }
    MessageBox.Show(rtrn.ToUpper());
}

Ответы [ 4 ]

4 голосов
/ 16 января 2012

Метод File.Create (String, Int32, FileOptions, FileSecurity) :

Создает или перезаписывает указанный файл с указанным буфером размер, параметры файла и безопасность файла.

Я совершенно уверен, что это не то, что вы намеревались сделать. Предположительно, вам нужен метод FileInfo.Open (FileMode, FileAccess) :

FileInfo fi = new FileInfo(path); 
FileStream stream = File.Open(path, FileMode.Open); 
1 голос
/ 02 февраля 2015

Немного опоздал на вечеринку, но недавно пытался сделать это сам. В .NET 4.5 следующее работает довольно хорошо без необходимости делать временную копию. Как уже говорилось, если вы можете прочитать файл, чтобы сделать его копию, вы можете прочитать файл, чтобы сгенерировать для него хеш.

private string GetMD5()
{
    System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
    System.IO.FileStream stream = new System.IO.FileStream(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);

    md5.ComputeHash(stream);

    stream.Close();

    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    for (int i = 0; i < md5.Hash.Length; i++)
        sb.Append(md5.Hash[i].ToString("x2"));

    return sb.ToString().ToUpperInvariant();
}
1 голос
/ 16 января 2012

Изменение: FileStream stream = File.Create(path, (int)fi.Length, FileOptions.Asynchronous); на FileStream stream = File.Open(path, FileMode.Open);

0 голосов
/ 05 марта 2016

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

Я не редактировал здесь никакого кода,все это было с указанной ниже страницы.

Ссылка: http://www.vcskicks.com/self-hashing.php

internal static class ExecutingHash
{
    public static string GetExecutingFileHash()
    {
        return MD5(GetSelfBytes());
    }

    private static string MD5(byte[] input)
    {
        return MD5(ASCIIEncoding.ASCII.GetString(input));
    }

    private static string MD5(string input)
    {
        MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

        byte[] originalBytes = ASCIIEncoding.Default.GetBytes(input);
        byte[] encodedBytes = md5.ComputeHash(originalBytes);

        return BitConverter.ToString(encodedBytes).Replace("-", "");
    }

    private static byte[] GetSelfBytes()
    {
        string path = Application.ExecutablePath;

        FileStream running = File.OpenRead(path);

        byte[] exeBytes = new byte[running.Length];
        running.Read(exeBytes, 0, exeBytes.Length);

        running.Close();

        return exeBytes;
    }
}

Кажется, что каждый тест выдает правильные результаты.Я бы порекомендовал всем, кто видел это, использовать этот класс или сделать что-то из этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...