如何获取当前.exe的哈希值?

时间:2012-01-16 02:46:16

标签: c# .net windows visual-studio md5

[已解决] :我复制了该文件并在该副本上运行了哈希。

我需要我的应用才能找到EXE的当前MD5。我可以获得任何文件的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 个答案:

答案 0 :(得分:4)

File.Create Method (String, Int32, FileOptions, FileSecurity)

  

使用指定的缓冲区创建或覆盖指定的文件   大小,文件选项和文件安全性。

我很确定这不是你打算做的。大概你想要FileInfo.Open Method (FileMode, FileAccess)

FileInfo fi = new FileInfo(path); 
FileStream stream = File.Open(path, FileMode.Open); 

答案 1 :(得分:1)

FileStream stream = File.Create(path, (int)fi.Length, FileOptions.Asynchronous);更改为FileStream stream = File.Open(path, FileMode.Open);

答案 2 :(得分:1)

派对迟到了,但最近我自己也试图这样做。在.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();
}

答案 3 :(得分:0)

由于我已经尝试过这些答案并发现它们都没有改变每次编辑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;
    }
}

每个测试似乎输出正确。我推荐给看到这个的人使用这个课程或者做些什么。