怎樣才能讓c#寫的程序不被反編譯?
昨天偶然發現一個反編譯工具,就拿自己寫的小程序測試了一下,結果嚇尿了,源代碼一個字不漏的全部看到!我一直以為只要編譯成EXE就不會輕易被反編譯。百度了半天,覺得就算加殼,混淆好像都可以有辦法反編譯,並且難度不太大。拿么,請問,怎麼樣才能保護自己的勞動成果?(.net 編寫的好像都可以被反編譯)
要保護勞動成果,最偷懶的辦法之一是加一個開源許可證。(大霧)
// 其實這完全沒有錯,要保護知識產權又不是要全都藏起來搞什麼保留所有權利。這個世界上存在阻止特定 .NET 反編譯的方法。在這方面 GitHub 上的 0xd4d 寫的 antinet 就是一種有趣的實現,使用微軟 CLR 的一些特性阻止調試器運行,應該能增大反向工程的難度(其實我還是覺得能拿到 IL 然後反編譯)。他本人還有個叫做 de4dot 的反混淆器,用著挺舒服的……
(不過我懷疑他自己的那個 dnlib 可以用來刪除那堆反 debug 的玩意?)
(據說還可以用中文類名稱跟別人搗亂,反正我沒試過……)
話說你用啥反編譯工具?我用 ILSpy, 不過那貨總是蹦 base..ctor(); ……
哦對了,現存反編譯工具對 VB 的 Lambda 支持似乎比較糟糕……用這個對付新手能做到讓他編譯不過,一定要每個 class 都來一個(大霧)
===
匿名用戶的 coolshell 手工混亂解在一定程度上有效。變數名就算了吧啊。
===
另有坑爹解是使用 VB 之類的放一堆控制項。據我所知反編譯器常常會生成一個中間變數(假設叫 size2),瘋狂的給 size2 賦值然後再給控制項之類屬性的賦值到 size2,導致控制項編輯器(在 IC#Dev 中的那個)發瘋……不過這種辦法高度不靠譜。用混淆器。
對於.NET程序常用的保護措施有混淆、加密、加殼,但對應的有脫殼、解密、反混淆,雖然混淆是個不可逆的過程,但可以反混成盡量可讀的代碼。由於il與.net語言的round-tripping,所以反編譯在理論上是完全可行的,只是難度問題。我們現在能做的就是提高反編譯的難度!所以想「讓c#寫的程序不被反編譯」,期待VS2015的native。樓上所講的開源或寫出無法維護的代碼,這也是一種方式,哈~
tmd 可以 加殼 但是 在高手面前 不管是 tmd還是 vmp 都不是問題。。。。
.net 的程序 安全方面 確實太弱了
稱之為弱雞程序 真是毫不為過
有的保護方式是混淆名字 特殊字元 空白字元,但是都能通過重命名 改為類似class1 class2之類的名字 丟失了名字的意義但是 邏輯還在。還有個保護方式類似於加殼,你直接用reflector ,JustDecompile看到的是 throw new ApplicationException 得去內存Dump出來。
我什麼都不懂 只了解名詞。
寫個自己的簽名混到程序的各個角落
不存在不能被反向編譯的程序,只要是編譯出來的,就可被反編譯,這是可逆的。
如果你只是不想讓其他人反編譯你的程序,比較可行的辦法是:使勁加密,寫入極為複雜的加密程序式,最好是像俄羅斯套娃哇那樣,一環套一環。直到反編譯的成本比直接寫代碼的成本還要高,百分之九十九的情況下你的程序就不會被反編譯了。
樓主了解哥德巴赫猜想嗎?類似於五次方程將程序設計,據聽說美國國家安全局程式設計採用此方法,全世界可以破解的人不超過五個,想了解詳細的密我
推薦閱讀: