AspNet Zero Core


解決AspNet Zero Core 5.0.1無法運行的問題

 

  最近在研究AspNet Zero Core 5.0.1時發現VS點擊調試后就自動退出了,從ABP QQ群里得知作者加入了licensecode校驗。經過一個周左右斷斷續續的折騰,算是破解了吧。原本想把加密類完全反編譯出來,后來發現有些方法反編譯不過來,所以有些方法就直接注釋掉實現了(關鍵方法未能反編譯,比較遺憾)。

聲明:本文僅供學習研究使用,若項目使用請購買正版授權

  一、說明

  二、運行效果

  三、工具軟件

  四、反編譯過程

  五、源碼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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM