星期二, 8月 24, 2010

關於.Net/Java 的原始碼安全性與混淆器

同事要交付客戶的程式,不希望讓對方知道他的程式怎麼寫,所以希望客戶拿到執行檔後,不能輕易地使用Reflector這種神兵利器去反編譯。



基本上若沒有經過Obfuscator處理過,Java的class 檔或.Net的dll/exe都能輕易地被反編譯為原始碼。Java上最有名的JAD在原作者不願維護的情況下,只能從好心人提供的地方下載,雖然說搭配DJ Java Decompiler還不錯用,不過隨著Java的演進,遲早不能用。

Java的Obfuscator也很多,我以前試過ProGuardRetroGuardyGuard,以前都是免費軟體,現在... 它們各有各的長處,狠一點混用多做幾次也行,但不見得會比較好。因為我現在不太寫Java,所以也沒有繼續使用。

至於.Net的Obfuscator更是多如牛毛,特別一提yGuard也出.Net的版本,一般人用Visual Studio附的Dotfuscator Community Edition就很夠了,MSDN有用法介紹

很多的Obfuscator對於字串加密等功能都在商用版本才有,若真的要別人看不出來,得要
  1. 用Native Code:你沒看錯,用C/C++寫吧。
  2. 不要寫成dll:做成dll就很容易被置換,某些軟體的破解就是把Dll的某個關鍵檢查function換掉,在Java的軟體上常用這手法。
  3. 在字串的部份用Native Code的function 加解密,而且這function必須放在主程式,放在Dll就破功啦~
Wikipedia上介紹代碼混淆Obfuscated code值得一看,但我相信很少人會這麼辛苦保護自己的程式碼,以後要維護多累呀?

最後再強調一次,我都是"完整交付程式原始碼"給同事或客戶。程式技術日新月異,今天寫的東西明天可能就是垃圾;說難聽點,我寫得有別人好嗎?不給程式碼搞得別人難過會爽嗎?大家都來Open Source吧!

沒有留言: