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

Posted

技术标签:

【中文标题】如何获取当前 .exe 的哈希值?【英文标题】:How do I get the hash of current .exe? 【发布时间】:2012-02-11 02:46:57 【问题描述】:

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

我需要我的应用程序来查找 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());

【问题讨论】:

打开自己执行的EXE似乎是行不通的事情,但我以前从未考虑过,所以我不能肯定。您是否考虑过制作 EXE 的临时副本并在其上运行哈希? 谢谢!这行得通。我使用 File.Copy 到 %temp% 并在上面运行它。 确实不需要复制文件。这应该只是用正确的访问模式打开它的问题。 (如果可以复制,就可以读取。) @AndrewMock 你应该接受一个答案或写下你自己的答案并接受它,以将问题标记为已回答。 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

如果相关文件已经被其他进程锁定,则无法打开。这就是它的工作方式!你确定是哪个进程打开了文件吗? 应用程序本身。我正在尝试让应用程序自行打开。我认为它不会起作用。 @AndrewMock:您需要指定读取操作(即 File.OpenRead)。如果它被锁定,你应该没有问题阅读,你只是不能改变它。不管怎样……这很奇怪。无论问题是什么,都可能有更好的方法来解决您的问题。【参考方案3】:

参加聚会有点晚了,但最近我自己也在尝试这样做。在 .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();

【讨论】:

【参考方案4】:

由于我尝试了这些答案,发现它们都没有改变对 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;
    

每个测试似乎都能正确输出。我建议任何看到这个的人使用这个类或做一些事情。

【讨论】:

以上是关于如何获取当前 .exe 的哈希值?的主要内容,如果未能解决你的问题,请参考以下文章

带有键值的哈希映射 - 如何使用 bigdecimal 键获取值? [关闭]

如何一次获取多个哈希值?

在 Git 中,如何将当前提交哈希写入同一提交中的文件

如何获取 SSL 固定的公钥哈希?

如何在 postgresql 中获取整个表的哈希?

执行java可执行文件(.exe)时如何获取CMD的目录[重复]