這些天都在絞盡腦汁地想怎麼樣設計一個授權方式來保護我的組件,今天看了一下同事從廣州帶回來的Tech2007的講稿,裡面提到了 微軟的軟體授權及保護服務(SLPS),對其非常感興趣。
園子裡也有朋友曾經介紹過:http://www.cnblogs.com/njnudt/archive/2007/07/12/815625.html
但到網上搜尋的時候,只有一個頁面有相關資訊,裡面是上海站的講稿,還好,找到了一個SLP的連結 http://www.microsoft.com/slps/
開啟看了一下介紹,馬上下載:http://www.microsoft.com/downloads/details.aspx?FamilyID=7ae70aaa-8b7c-4e3a-af83-b71b6877705b&displaylang=en
安裝試用。一啟動就要我輸入使用者名稱密碼,但是不管我怎麼輸都是錯的,只好取消進入,後來看手冊才知道,那是要到官方伺服器上授權的,如果沒有授權的話,這個功能只能保護產品,而不能對產品進行授權控制,並且只能保護三個方法。
加入幾個程式集,Protect,然後用Reflector開啟我選擇加密的那幾個方法,居然沒有報異常。
而方法體內容都變成這樣了:public static void WriteLine(string msg)
{
object[] args = new object[] { msg };
SLMRuntime.SVMExecMethod(null, "b0199ec367594bd1b03b3fb29ff12f86", args);
}
用Reflector看SLP的各個類時,也發現所有的公開方法都是這種寫法,都需要經過SLMRuntime.SVMExecMethod這個門神。
第一個參數在靜態方法中是null,在執行個體方法中是this,可能是供反射用的吧;第二個參數似乎是方法名的散列,第三個方法是參數數組,即使沒有參數,也要構造一個沒有元素的數組。
這個方法的代碼:public static object SVMExecMethod(object obj, string SVMMethodId, object[] args)
{
Assembly callingAssembly = Assembly.GetCallingAssembly();
TrivialVirtualMachineParamsReader paramsReader = new TrivialVirtualMachineParamsReader(obj, args);
return InternalSVMExecMethod(callingAssembly, SVMMethodId, paramsReader);
}
再進去:public static object InternalSVMExecMethod(Assembly declaringAssembly, string SVMMethodId, ISLMVirtualMachineParams paramsReader)
{
using (ISLMRuntime runtime = new SLMRuntime(null, declaringAssembly, true))
{
return runtime.SVM.SVMExecMethod(declaringAssembly, SVMMethodId, paramsReader);
}
}
SVM已經是ISLMVirtualMachine介面了,查不到SVM.SVMExecMethod在哪裡實現。
回過頭來,程式集被加密(暫且這麼叫)後,不僅那幾個方法改變了,還多了幾個檔案,分別是:Microsoft.Licensing.Utils2.0.dll、Microsoft.Licensing.Runtime2.0.dll、Microsoft.Licensing.Permutation_1cc06_2.0.dll、Microsoft.Licensing.LicAdmin.exe。
其中第三個檔案的1cc06_2是我安裝SLP後得到的預設授權,最後一個檔案是授權管理員。第一第二個檔案和SLP安裝目錄中的一樣。看來,第三個檔案是臨時產生的,裡面的名字被混淆得厲害,類名都是兩個字母,方法名和屬性名稱都是一個大寫字母。
仔細查看第三個檔案,居然發現裡面有一個fu類實現了ISLMVirtualMachine介面,而只有一個Microsoft.Licensing.SLMRuntimeRedirect類使用了fu類。SLMRuntimeRedirect中剛好有個SVMExecMethod方法,前面的雙字母的類方法大多數都調用了這個方法,這可能是自保護吧。
看來fu類是關鍵了。裡面的東西被混淆得亂七八糟的,就不多說了。
分析中注意到,fu的主要方法調用了一個bB類,而bB類實現了SLMLicenses等介面,再看看這個類的內容,非常明顯,這是一個授權控制檔案,可能這就是SLP的弱點了。
從上面分析可以看到,SLP非常強大好用,但是它畢竟還是完整的.net實現,還是有弱點的,具體要怎麼利用,我就不多說了,也不想想了。如果你想到了,不要忘記告訴我哦!^_^
QQ:99363590
EMail:gxuhy@21cn.com
http://www.nnhy.org