程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#獲取當前進程HASH的方法

C#獲取當前進程HASH的方法

編輯:關於C#

基本原理

用C#實現在這個過程,我們需要進行下面幾個步驟:

得到當前進程所對應的本地宿主文件;

打開這個文件流;

確定hash算法,計算文件流的hash;

將hash結果轉換為我們熟悉的字符串表現形式。

下面就分別就這幾個方面來進行解釋。

獲取宿主文件路徑

在System.Diagnostics命名空間下,有個Process類,MSDN的描述是"提供對本地和遠程進程的訪問並使您能夠啟動和停止本地系統進程"。該類有一個靜態方法GetCurrentProcess(),利用它我們可以獲取當前進程。

Process類的MainModule屬性包含了該進程所關聯的主模塊,換句話說也就是宿主文件,而MainModule的FileName屬性,就是該宿主文件的完整路徑。

Process currProcess = Process.GetCurrentProcess();
string filePath = currProcess.MainModule.FileName;

更多的關於獲取當前路徑和程序集的方法,可以參見C#獲取當前路徑的方法集合。

打開文件流

這個本來沒什麼好說的,直接用FileStream打開就行,但切記要將FileMode和FileAccess都設置成只讀,否則可能會導致運行時錯誤。

using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
// hash 算法
fs.Close();
}

確定hash算法

這裡我們用MD5算法為例。

.NET框架為提供了System.Security.Cryptography命名空間,我們使用其中的MD5類來進行hash計算。該類的下面幾個成員需要我們注意:

Create()靜態方法:生成一個MD5類的實例。

ComputeHash()方法:計算輸入數據的哈希值。

在這裡要注意,ComputeHash()所能接受的參數可以是Stream也可以是byte[],為了方便起見我們用前者。它的返回值卻只能是byte[],長度固定為16。

MD5 algorithm = MD5.Create();
byte[] hashData = algorithm.ComputeHash(fs);

Hash結果的表示

我們常用的MD5 hash結果都是以32個字符來表示的16進制串,因此需要對上面得到的byte[]進行轉換。這個過程可以使用Convert.ToString(Int32, Int32)來進行十進制數向16進制轉換的過程。也可以用更簡單的byte.ToString("x2")來完成。

private static string ByteArrayToHexString(byte[] bytes)
{
int length = bytes.Length;
StringBuilder sb = new StringBuilder();
foreach (byte data in bytes)
{
sb.Append(data.ToString("x2"));
}
return sb.ToString();
}

完整的代碼

CurrentProcessHashTest

1 using System;
2 using System.Diagnostics;
3 using System.IO;
4 using System.Security.Cryptography;
5 using System.Text;
6
7 namespace Nocturne.Samples.CurrentProcessHashTest
8 {
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 Process currProcess = Process.GetCurrentProcess();
14 string filePath = currProcess.MainModule.FileName;
15 string hash = string.Empty;
16
17 using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
18 {
19 MD5 algorithm = MD5.Create();
20
21 byte[] hashData = algorithm.ComputeHash(fs);
22
23 hash = ByteArrayToHexString(hashData);
24
25 fs.Close();
26 }
27
28 Console.WriteLine("Hash:" + hash.ToString());
29
30 Console.ReadKey();
31 }
32
33 private static string ByteArrayToHexString(byte[] bytes)
34 {
35 int length = bytes.Length;
36
37 StringBuilder sb = new StringBuilder();
38
39 foreach (byte data in bytes)
40 {
41 sb.Append(data.ToString("x2"));
42 }
43
44 return sb.ToString();
45 }
46 }
47 }

運行結果

由於Visual Studio的debug模式下,實際進程是一個.vshost.exe的文件,因此要驗證程序的正確性,一定要先編譯出可執行文件,然後手動去執行它,然後再與hash工具進行對比。

Debug運行的結果:

直接運行.exe的結果:

bin\debug目錄下的文件:

用hash工具計算的結果:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved