C 獲取當前程序HASH的方法

2022-05-15 12:04:49 字數 2095 閱讀 6954

用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))

這裡我們用md5演算法為例。

.net框架為提供了system.security.cryptography命名空間,我們使用其中的md5類來進行hash計算。該類的下面幾個成員需要我們注意:

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

md5 algorithm 

=md5.create();

byte

hashdata 

=algorithm.computehash(fs);

我們常用的md5 hash結果都是以32個字元來表示的16進製制串,因此需要對上面得到的byte進行轉換。這個過程可以使用convert.tostring(int32, int32)來進行十進位制數向16進製制轉換的過程。也可以用更簡單的byte.tostring("x2")來完成。 

private

static

string

bytearraytohexstring(

byte

bytes)

return

sb.tostring();

}currentprocesshashtest

1using

system;

2using

system.diagnostics;

3using

system.io;

4using

system.security.cryptography;

5using

system.text;67

namespace

nocturne.samples.currentprocesshashtest827

28console.writeline(

"hash:"+

hash.tostring());

2930

console.readkey();31}

3233

private

static

string

bytearraytohexstring(

byte

bytes)

3443

44return

sb.tostring();45}

46}47}

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

debug執行的結果:

直接執行.exe的結果:

bin\debug目錄下的檔案:

用hash工具計算的結果:

獲取當前程序或執行緒的PID方法

使用者態獲取程序id include include include 獲取當前程序的pid pid t pid getpid 獲取當前程序的ppid pid t ppid getppid 獲取執行緒pid include taskid pthread t pthread self 核心態獲取程序id...

C Process獲取當前程序資訊

1.獲取當前程序資訊整理 process.getcurrentprocess 返回當前程式的程序物件。process cur process.getcurrentprocess 當前程序的id console.writeline cur.id 獲取關聯的程序的終端服務會話識別符號。console.w...

Linux核心獲取當前程序指標

我們在教材或閱讀中,經常需要直觀的用圖示來展示資料在記憶體中的分布,那麼資料是如何在記憶體中組織的呢?不同的機器有不同的表示法,我們以最常見的intel x86系列計算機為例來說明這個問題。如上圖示記憶體示意圖 記憶體低址在上。記憶體高址在下,記憶體單位為16bit。對於基於intel i386架構...