為了有效保護商業軟件,使用序號方式已無法有效防制盜版擴散,
現在普通的軟體保護機制就是使用網路啟動,當用戶購買軟件時,先發予一個加密的License檔案,
軟體啟用時指定該檔,即可連線至官方啟用主機進行驗證,官方能控制啟用次數及資訊。
官方所給予用戶的License檔,除了記錄user資訊及所購買的版本限制外
主要是其內含有一個Unique License Key,它也會先登記在官方伺服資料庫內,
待上傳時進行資料存在比對。
實作該License檔的方式,.NET實作方式可以將物件序列化成二進位檔
再將檔案予以加密(使用XOR Array或對稱式加密),
然而.NET的序列化在解開時必須符合Assembly Namespace完整名稱,
一些知名的Assembly加殻混淆保護工具常會破壞此Namespace的資訊,造成還原上的問題。
更況何非.NET的程式語言,亦無法有效支援此License的讀取,故不推薦此方式。
針對License檔實作方式,筆者使用一個固定Size的Byte[]陣列,再使用Struct Mapping對應方式
讓Byte[]與結構變數(Struct)能互相轉換,並方便寫入檔案。
檔案會做XOR Checksum機制,再予以不等長對稱加密方式保護。
當軟件進行網路啟用成功時,會產生出一個License.lic檔案,其實它的結構跟原來的License檔一樣
只差別在內容上的差異,寫入了安裝平台的硬體資訊及限制資訊(如版本控制、使用期限)
每當軟件程式啟動時,就先判斷該驗證過的*.lic檔是否存在,
再進行合法格式讀取(比對解密還原後的size及checksum),假如成功就轉成Struct變數
再針對內容資訊作邏輯流程控制。
這個讀取License的程序通常寫在一個method,為了避免.NET Assmebly被反組譯註解內容(雖然會混淆)
最好在method裏把讀取到的License Struct變數指定為global變數,於重要的功能使用前再比對該global變數值,
類似網站的login畫面雖被駭客繞過去,但後面的操作是需要其登入程序裏獲取的Session值。
No comments:
Post a Comment