C#获取当前进程HASH的方法

本文介绍如何使用C#获取当前进程的宿主文件,并计算其MD5哈希值。涉及Process类、FileStream和MD5算法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本原理

用C#实现在这个过程,我们需要进行下面几个步骤:

  1. 得到当前进程所对应的本地宿主文件;
  2. 打开这个文件流;
  3. 确定hash算法,计算文件流的hash;
  4. 将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();
}

 

完整的代码

 

ContractedBlock.gif ExpandedBlockStart.gif 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工具计算的结果:

转载于:https://www.cnblogs.com/SpadeQ/archive/2008/11/18/1336008.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值