1. 程式人生 > >如何保護自己開發的軟體

如何保護自己開發的軟體

    大家都知道,現在開發出一個軟體產品相對來說容易得多,但是想要受到應有的效益,那就太難了。不是沒有人用你開發的軟體,主要是沒有人用正版,因為盜版太便宜了也太容易獲得了。這裡最核心的問題是,你保護不住自己開發的軟體,上市兩天就有盜版了。你的軟體也不可能像金山詞霸那樣不怕盜版,因為你賣不了多少套。要想收回成本,就必須加密好,必須不能很快被解密。
       但是如何才能加密好呢?說實在的話,特別難!加密軟體不像用密碼加密文字,想猜出密碼十分困難,加密軟體的特點是加密難而解密容易。因為你的軟體畢竟需要完整地執行,即使用了什麼密碼學的什麼東西,可你的密碼一定會在軟體裡出現,不存在猜密碼的問題。另外,想要加密的好,恐怕需要懂如何解密,或者說知道一般解密者是如何破解軟體的,這就需要普通軟體開發以外的知識和實踐了,一般人沒有這個時間和精力。即使你懂得了一些解密的知識,甚至還小試牛刀一把,但加解密這個行業,水平的差異特別明顯。可能一個人自認為想出了特別好的主意來加密,可是在高手眼裡,很可能幾分鐘就搞定,高手可以馬上看出漏洞。為什麼國外有個組織叫0days,意思就是在一天內就把你的加密軟體搞定。看看0days上的軟體吧,不乏下了很多功夫在加密上的,但命運是一樣的,一天內被破解。這個問題特別嚴重,很多公司都犯這個錯誤。就像尋找堆疊溢位漏洞一樣,需要特別研究溢位機制才行,加密已經發展成了一個特別的領域,需要深入的研究才行。
      於是出現了不少加密公司,可以說,採用加密公司的加密鎖是多數軟體公司保護軟體的方案。但是,結果如何呢?一樣在幾天內被破解。就本人的經驗來說,沒有多少人可以把加密做的很好,因為懂加密的人必須懂解密,而且水平還需要特別高才行。但解密高手本來就不多,現在還又讓他搞加密,那這樣的人就更少了。個人看法,不代表大眾意見,本人認為包括加密公司的開發人員,也沒有幾個是真懂加密的。這不是我猜的,我和他們打過交道。我用過幾乎所有的我見過的加密鎖,國內國外,知名不知名的,結果發現,加密公司的技術人員,我幾乎沒有辦法和他們討論真真的加密問題,沒辦法,我已經久病自成醫了,而且還成了主任、專家,哈哈,個人認為。
         很多加密公司說他們的產品如何好,說的你不由得不信。我想那大多是理論上的事情。看看用他們的加密鎖加密的軟體是如何被破解的,就知道實際上的情況是如何的了。好像還沒有聽說一直沒被破解的軟體,如果有的話,加密公司一定早作宣傳了。還有一個特別容易產生誤區的地方,就是用加密鎖加密的話,似乎就加密的好了。個人經驗,這是大錯特錯的認識,也是絕大多說開發經理、產品經理的認識。這和加密公司的宣傳有一定的關係,因為他們要賣加密鎖。事實上針對機器特徵的license加密法一點也不比加密鎖差。只是針對使用者機器的license會給使用者造成一定的不方便。你想一想,解密者修改你的讀取加密鎖的程式碼和修改你的讀取機器特徵的程式碼有什麼不同嗎?請注意,絕大多數解密者是軟解密,修改程式碼而已。所以,加密的好不好,取決於你如何呼叫加密模組,如何把加密模組和你的程式有效地融合在一起。恐怕沒有幾個解密者會分析加密庫的內部情況,他只要瞭解介面就行了。

        由於芯片價格的下降,目前的加密鎖採用了用於智慧卡的晶片。從理論上來說,這種加密鎖可以搞得不可解密。但這是從理論上說,實際上沒有什麼人可以把加密鎖用到這種地步。還是上面的問題,你必須把介面混淆到解密者無法理解的程度才行。你總需要判斷介面呼叫返回的資料吧!想一想,像acdsee這樣難做的註冊機都有人不辭辛苦地分析出來,一般人做的加密鎖判別,解密者手中,用ida分析後,幾乎是一目瞭然了。不清楚的地方再用od動態跟蹤一下就基本上搞定了。特別是,加密鎖公司的模組,多半沒有什麼反跟蹤功能,即使用他們的exe pack壓縮一下,也是很容易脫殼的,幾乎無法防止ida分析和od跟蹤。

       說了半天,結論在幾千年前就有了。就是大家都知道的普遍真理,矛盾是普遍存在的,需要努力鬥爭才能克服矛盾。也就是說,克服被解密的矛盾需要你花大功夫。沒有什麼好的辦法讓你輕鬆地解決這個問題
,請大家牢記這個真理。

        我只能給大家兩條建議:

        1.  自己好好研究一下解密,自學成才成為加密高手
        2. 請教加密高手,讓他們幫你加密

        至於具體加密的時候有什麼技巧呢,下面幾條比較重要
 
   1. 像vb vf pb 這樣的script語言比較難解密,可能的話採用一下
   2. 對於編譯型語言,一定要把判據弄得多一些,分散一些,程式碼亂一些。這和軟體工程的思想正好相反。亂到你自己都看不懂了,別人反編譯以後就更難看懂了。
   3. 如果用c c++的話,用區域性的函式指標來呼叫加密函式。多用全域性變數,最好用結構裡的某一位作判據,而不是單一的int。

   4. 加一些垃圾程式碼混淆視聽
   5. 讓你的加密演算法在不同的機器上有不同的表現,這樣在某一機器上解密的東西,就很難在其他機器上使用。比如根據機器的特徵生成一些資料,然後再使用這些資料。
   6. 給自己的程式加一個殼。建議使用aspr2.0,使用裡面的sdk和殼通訊,採用所有的選項加密。
   7. 十分渴望不被解密而又不怕相容性不好的話,採用xprotect.

   技巧 很多,也不容易很條理地說全。我想即使說全了,大家沒有實際體會也不容易弄明白。而且,說得容易做起來難。最後再重複一下,沒有什麼好的辦法讓你輕鬆地解決這個問題。