讓c#的exe只要被修改就無法運行,支持混淆和數字證書

首先用sdk的sn工具或者makecert工具生成公鑰和密鑰,推薦makecert,做自己的證書,我做了一個受信任的根證書放在受信任的根證書頒發機構,用這個根證書頒發了一個下級證書放在個認證書裏。把這兩個證書都保存起來,平時給程序簽名就用這個子證書就行了。以後都用這一個,顯得正規點。

 

 

程序裏工程屬性-簽名把那clickonce和程序清單簽名都選上,時間戳用這個http://timestamp.wosign.com/timestamp

2個都從文件選擇,這裏用剛纔子證書的那個帶密鑰的pfx,需要填入密碼。

 

這樣編譯後不能防篡改,因爲微軟有個跳過機制,這樣只有生成dll放到gac纔會檢查強名稱是否匹配,而一個單獨的exe是沒用的,修改裏面一點東西后還是可以執行。微軟說可以在app.config里加入一條強制檢查,那樣是行了只要修改exe就沒法執行,但是隻有exe一直帶着那個app.config放在同一目錄纔行,如果單獨把exe拿出來就不行了。

 

怎麼把那句話弄到exe裏呢,我費了半天勁,終於想到了一個辦法,平時只注意功能實現了,沒想到.net裏的安全機制這麼複雜。

此方法無論是console的還是winform的,無論2.0 3.0 3.5 4.0通用。

如果是console程序,在Main的下面加入

 

 

 

 如果是winform程序,在Main的下面加入

 

 

原理是在桌面程序的zone是mycomputer,是完全信任的,所以就有一個強名稱跳過,這些代碼是建一個Intranet的appdomain,不是完全信任的,所以就會檢查強名稱,這個appdomain是空的,目的不是爲了執行裏面的內容而是爲了讓.net去檢查強名稱,什麼時候執行到這些代碼什麼時候就會出錯,所以要放到main下面第一句,如果通過檢查不會影響後面的正常代碼。在.net4中上面代碼可以更簡單,有個沙盒GetStandardSandbox,但是2和3中沒有,就不通用了,而這樣無論234都通用,所以4會報某些方法過時,不去管它。

 

 

然後編譯就行了,這樣就不用拖家帶口的帶着app.config了,只要修改一點就不能執行了,會出現“已修改不允許執行”的提示,然後程序會自動關閉。

 

 

這樣還不行,反編譯很容易就去掉了,需要混淆。

 

直接把這個exe混淆,雙擊沒法執行吧。別急。

 

用sn.exe再用剛纔那個子證書pfx把這個混淆過的exe再次簽名就可以執行了,好了,這樣exe不但混淆了,而且被加上了強名稱簽名,只要修改1個字節就不能運行了。sn -R是重新簽名。

 

繼續,加上數字簽名,signtool工具,還是用剛纔那個子證書,這樣右鍵就可以看到這樣了。

 

 

這樣這個程序只要修改一點,那麼不但不能執行,而且右鍵看數字證書,也通不過,是這樣的

 

 

而且exe還是混淆過的,嘿嘿嘿,大功告成。

 

 

當然自己用makecert做的證書在自己的機器上,顯示“數字簽名正常”,但是別人的機器上沒有你的證書,會顯示無法驗證此證書之類的,但是還是會校驗,就是說如果把這個exe改了,那麼就會顯示”數字簽名無效“而不是”無法驗證證書“,所以憑這一點也可以驗證是否被篡改過,但是其實用不着了,這個只是好看用的,因爲剛纔說了,只要修改連運行都不能運行了。

 

如果用的人多了,可以讓用戶把你的證書導入他的證書庫或者去買個真正的證書,那樣就不會出那個紅叉號了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章