如何获取current.exe的哈希
本文关键字:current exe 哈希 获取 何获取 | 更新日期: 2023-09-27 18:20:19
[SOLVED]:我复制了文件,并在该副本上运行了散列程序。
我需要我的应用程序来查找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());
}
File.Create方法(String、Int32、FileOptions、FileSecurity):
使用指定的缓冲区创建或覆盖指定的文件大小、文件选项和文件安全性。
我很确定这不是你想要做的。大概你想要FileInfo.Open方法(FileMode,FileAccess):
FileInfo fi = new FileInfo(path);
FileStream stream = File.Open(path, FileMode.Open);
参加派对有点晚,但最近我自己也在尝试。在.NET4.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();
}
更改:FileStream stream = File.Create(path, (int)fi.Length, FileOptions.Asynchronous);
到FileStream stream = File.Open(path, FileMode.Open);
由于我尝试了这些答案,发现它们都不会更改对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;
}
}
每个测试似乎都输出正确。我建议任何看到这个的人使用这个类或利用它。