解決AspNet Zero Core 5.0.1無法運行的問題
最近在研究AspNet Zero Core 5.0.1時發現VS點擊調試後就自動退出了,從ABP QQ群裏得知作者加入了licensecode校驗。經過一個周左右斷斷續續的折騰,算是破解了吧。原本想把加密類完全反編譯出來,後來發現有些方法反編譯不過來,所以有些方法就直接註釋掉實現了(關鍵方法未能反編譯,比較遺憾)。
一、說明
二、運行效果
三、工具軟件
四、反編譯過程
-
- 找到他們
- 使用dotPeek反編譯並導出工程
- 反編譯Abp.AspNetZeroCore.Web.dll
- 反編譯Abp.AspNetZeroCore.dll
五、源碼Github地址
一、說明
如果對反編譯不感興趣的話,可以直接從github下載下來源碼之後,把ABP文件下的兩個工程Abp.AspNetZeroCore、Abp.AspNetZeroCore.Web編譯一下拿到dll直接將AspNet Zero Core 5.0.1工程裏的對應引用替換掉就可以了。
拿到AspNet Zero Core 5.0.1源碼後會發現有兩個應用的dll在ABP github上是沒有源碼的,一個是在工程MyCompanyName.AbpZeroTemplate.Core裏引用的Abp.AspNetZeroCore,另一個是在工程MyCompanyName.AbpZeroTemplate.Web.Core裏引用的Abp.AspNetZeroCore.Web。分析之後做校驗的代碼在Abp.AspNetZeroCore這個dll中,具體方法為AbpAspNetZeroCoreModule類的PostInitialize方法中調用了另一個類AspNetZeroLicenseChecker的Check方法,破解的話直接將PostInitialize註釋掉或去掉Check方法中的代碼實現即可。如下圖:
二、運行效果
破解後的軟件運行截圖,
服務端:
前端界面:
三、工具軟件
反編譯過程中,我使用了兩個軟件:
1.Resharper套件之一,JetBrains dotPeek 2017.3.2。
2.ILSpy version 3.0.1.3459。
四、反編譯過程
4.1.找到他們
取得源碼用VS還原nuget包之後,會在系統盤目錄(C:\Users\Administrator\.nuget\packages)中找到這兩個dll(Abp.AspNetZeroCore.dll,Abp.AspNetZeroCore.Web.dll)。
4.2 使用dotPeek反編譯並導出工程
將兩個dll使用dotPeek反編譯,然後在dotPeek的程序集管理其中,選中工程在右鍵菜單中選擇Export to Project
反編譯完成之後比較尷尬的是生成工程的.net版本為.net framework 2.0,我們自己創建個.Net Standard工程然後把反編譯出來的文件拷貝到創建的解決方案裏就可以了。兩個dll的處理方法類似。
工程建立完之後引入到源代碼裏,引入之後我的工程目錄結構如下所示,為了調試方便我把對ABP類庫的引用都替換成了源代碼工程引用:
4.3 反編譯Abp.AspNetZeroCore.Web.dll
這個dll比較簡單,先從簡單的入手吧,這個dll中主要就反編譯一個類就可以了,如下圖
這個類中4,5兩處沒看明白有什麽用途,直接刪掉了;2,3兩處其實就是對應類實例的屬性所以ctx.set_User(authenticateResult.get_Principal())直接改為ctx.User=val.Principal,
authenticateResult.get_Succeeded() && authenticateResult.get_Principal() != null直接改為val.Succeeded && val.Principal != null。return 語句UseExtensions.Use這塊兒實際
上是方法參數app的擴展方法。所以整段代碼整理之後如下:
這個dll主要反編譯這一個類就可以了,其他反編譯的類不需要做額外處理。
4.4 反編譯Abp.AspNetZeroCore.dll
這個就比較費勁了,一是代碼量大,二是有些代碼沒看懂怎麽反編譯,這個dll主要反編譯下面兩個類
先看AspNetZeroBaseLicenseChecker這個類,這個類是AspNetZeroLicenseChecker類的基類,拿類的構造函數當 典型說一下一些個人的經驗吧,未調整的反編譯代碼如下:
對照上圖標記:
1.這個特性暫未發現有什麽用處,直接去掉;
2.這個方法有對應的代碼如下:
[MethodImpl(MethodImplOptions.NoInlining)]
internal static object iZ5hxHC38E0NlGy6Ai([In] object obj0)
{
return (object) ((AspNetZeroConfiguration) obj0).LicenseCode;
}
實際上就是獲取了調用參數的一個特性,所以可以直接修改為 this.LicenseCode = configuration.LicenseCode;
3.這個循環稍微麻煩一點,按照執行步驟一步一步走就行了,名字混淆的方法直接用方法實現替換,這種代碼少的好一些,理不亂,有些很長就有點兒頭疼了,這整段代碼搞來搞去其實就是兩句,整理後的代碼如下:
protected AspNetZeroBaseLicenseChecker(AspNetZeroConfiguration configuration, IAbpZeroConfig abpZeroConfig, string configFilePath = "")
{
this.LicenseCode = configuration.LicenseCode;
this._abpZeroConfig = abpZeroConfig;
}
其他的方法都可以按類似方式處理。
AspNetZeroLicenseChecker這個類反編譯方法類似,但是這個類中的Check方法就搞不定了,dotPeek反編譯後的代碼如下:
紅色方框中圈住的部分實在搞不懂是怎麽回事兒。各位園友如果有思路的話,可以提供一下。
五、源碼Github地址
反編譯後的代碼放到github上了,有興趣的朋友可以下載下來研究一下,有問題歡迎留言討論。
https://github.com/YSmileX/AspNetZeroCore
解決AspNet Zero Core 5.0.1無法運行的問題