前言:
最近REA逆向工程很熱門,連帶著出現一些破解程式的介紹和實驗,我就把之前寫的NVR裡面的軟體啟用拿來說嘴。
設計是跟AI討論後,AI給出的。
軟體授權:
軟體授權最簡單有效的,就是Online檢查,每次開啟後,就固定和雲端的主機進行授權確認,這一定是最有效的手法,但很多時候無法這麼做,例如,使用場景是離線時,甚至可能是離線啟用時,此時還是得用傳統的授權碼線上登入,或者授權檔案離線啟用。
這裡給出的,就是授權檔案的檢查。
首先,一個確切的事實,在軟體上離線做授權檢查,軟體經過修改,是一定能破解的,只是難易度問題,但一般來說,其實也不用做太困難或太誇張,因為授權一般都是2部份,程式和紙面,也就是說,一定會有一份正式的授權文件,它也許是數位,也許是紙本,但一定有這個,同時會有個授權聲明,一般而言,破解程式就是直接違反授權聲明,這基本上沒有異議,而通常B2B場景,授權也只是個形式,用於稽核、會計、驗收時使用,證明採購的跟實際的軟體硬體規格一致。
設計邏輯:
而授權檔案,基本邏輯很簡單,其實就是把json字串用AES加密後,就是授權檔案了,因此,程式檢查授權,就是找特定路徑下特定檔案,然後把它用AES解碼,能解開通常就是合法授權檔案,接著從裡面讀出相關資訊,確認授權數量和產品ID之類的。
當然,這種作法授權檔案被複製之後,就可以放到每一台電腦上,每台都有授權,所以通常會加上一個MachineID,MachineID典型最基本是網路卡的MAC Address,要加上電腦指紋的話,電腦指紋通常用電腦BIOS資訊,包括主機板廠牌 + 主機板型號 + 主機板序號,如果是SBC開發板,像樹莓派,都有制式的出廠序號。
通常會在json裡面塞入MAC Address和MachineID(電腦指紋),然後檢查和對照電腦上的所有MAC Address和MachineID(電腦指紋)是否一致。
AES加密和解密,基本上金鑰必須放在程式裡面,被取出了,就能自己根據格式產生json的授權檔案,怎麼辦呢?
基本上,要能檢查授權檔案,就得讓客戶端程式把授權檔案打開,所以我和AI討論後,基本上沒有辦法隱藏,但我們可以參考JWT,在加密的授權檔案最後面,加上Ed25519簽章,Ed25519簽章是非對稱的公私鑰簽章,公鑰可以放在程式內,讓程式能查核授權檔是否被竄改,私鑰則放在主機端,簽發時使用簽出授權檔。
這種方式,雖然無法避免授權檔案被打開,但可以有效驗證授權檔案是否合法,因此,以Ed25519簽章 + MachineID / MAC Address + AES,是能夠有效檢驗授權合法性。
AES會讓密鑰散佈,有沒有可能隱藏這組密鑰?
可以結合ECDH交換金鑰技術,在授權主機上面針對不同產品,產生一組產品的ECDH公私鑰,授權主機上面有自己一組ECDH公私鑰,每個產品都放入產品的ECDH私鑰 + 授權主機的公鑰,這樣作法,軟體本身還是可以拆開授權檔,但授權主機的私鑰拿不到,不同產品的ECDH私鑰也不同,能讓AES密鑰私密性限縮到單一產品。
沒有留言:
張貼留言