用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架構...