PostSharp 4.0注冊機實現過程


PostSharp是基於.NET平台設計的比較強調易學易用的AOP框架。

什么是AOP? http://wayfarer.cnblogs.com/articles/241024.html

新版的已失效,注冊碼驗證能過,但不能使用

准備工作

  1.  安裝.Net Reflector或者類似的工具
  2.  給.Net Reflector 裝上Reflector.BamlViewer插件,它可以查看xaml。下載地址:http://reflectoraddins.codeplex.com/releases
  3. 到PostSharp官網下載最新版(4.0.29),並安裝 下載地址:http://www.postsharp.net/download

開始干活

  找到安裝目錄,我用的是win8,vs2012,安裝目錄是C:\Users\【用戶名】\AppData\Local\Microsoft\VisualStudio\10.0\Extensions\*

vs2012 C:\Users\【用戶名】\AppData\Local\Microsoft\VisualStudio\12.0\Extensions\*

最后的*是隨機的,一個個點開看吧,或者搜文件PostSharp.dll,一看結果就知道了

先看看注冊界面是怎么樣的,再通過.Net Reflector反編譯PostSharp.HQ.v3.0.exe找到對應界面。注冊界面如下,它是一個WPF窗口

經過一番查找后發現是enterlicensekeypage

轉到這這個界面對應是代碼上PostSharp.HQ.Licensing.EnterLicenseKeyPage,得到以下代碼

  public override void OnNext()
    {
        this.__PS___z_aspect29.OnMethodEntry(null);
        try
        {
            string str;
            License license = License.Deserialize(this.licenseKeyTextBox.Text);
.....
View Code

跟過去,基本確定注冊嗎驗證代碼都在PostSharp.Sdk.Extensibility.Licensing.License這個類中(這個類在PostSharp.Settings.dll這個dll中)

從類中的幾個方法看出,此類包含生成注冊碼和驗證注冊嗎功能。采用DSA加密方式

public class License
{
    public static License Create(LicensedProduct product);
    public static License Deserialize(string licenseString);
    public string Serialize();
    public void Sign(byte signatureKeyId, string privateKey);
    public virtual bool Validate(byte[] publicKeyToken, out string errorDescription);
    public bool VerifySignature();
    public bool VerifySignature(DSA publicKey);

   ...
}
View Code

可以通過以下代碼生成一個注冊碼

 License lic = License.Create(LicensedProduct.PostSharp30);
 lic.LicenseGuid = Guid.NewGuid();
 lic.LicenseType = (byte)LicenseType.Commercial;
 lic.Product = LicensedProduct.PostSharp30;
 lic.Sign(1, privateKey);
 string sn = lic.Serialize(); //最終注冊碼

你以為到這里就完了嗎?錯了,請問你弄到privateKey(私鑰)了嗎

當然你有本事弄到私鑰,到這步就完成了。可是我弄不到,只能想別的辦法了。

 

再往下研究,發現PostSharp.Sdk.Extensibility.Licensing.CryptoUtilities類中提供了公鑰

public static class CryptoUtilities
{
    // Fields
    private static readonly DSA productionPublicKey0 = DSA.Create();
    private static readonly DSA productionPublicKey1 = DSA.Create();

    // Methods
    static CryptoUtilities()
    {
        productionPublicKey0.FromXmlString("<DSAKeyValue><P>9cMyBYBokidciAghqE1POnEbcxpBui3PfazddrQjndkDtPskGvBcjS8LIStB/jR0SICKmLMwl7WoocpdXgYTOopgKJ33E4NOIhc1vbQR6vCCidGWlN88hUKCQJ8cGzme/LDmUT5zfK3TfM6LkMU1fYTNARrefIZkSlg4GGIjZ38=</P><Q>m9h5p2kl1vlwuw12AOQbem3yDXU=</Q><G>pBkhekdI1vk084zMbubnu7qtDyTid6x01crQJiERfmk2HgFt13dXHwei/1kgrRJPWrtZVRKMmO8w+p4jfle82n2/BaFNBLouUoQ/fBYPPdDZBocd/tXqBduF5zq1S12tDv8TIIarMTRtj18F5e68cxBPbweVs4n8meqLEQL5AwA=</G><Y>e2otaOKaVFxnEoHI4g1f7BCcrOaAwd1/GTMkEXGaNw3CYucIuOJdvlZEWa/pa4DTUeK4McHOXRJsZMQdHaoh+dK17NdmMxTa2UMokyoIdayu9kw9TbWUy2zXovJ8CHJVP4RU8wlJk1RKjeMuSK3lYPgo2RTbV9UbU2qK1gmVwg4=</Y><J>AAAAAZOzu4FkAIr0MjlqqHtPNWrFTfjw4/qDWuFvHEf7ioaj8vqRao8mbqsLueqvYIYQ8g8w2WNWFAOG6e8waiQhX2O/DRSZNbc/JfdjQqlPli5be6FqNsGnjKXdEt2boONKU/fpGx/m69V+a/4jxg==</J><Seed>1B0yRR/A/kmE1zMUIFiEMmJ328M=</Seed><PgenCounter>Xg==</PgenCounter></DSAKeyValue>");
        productionPublicKey1.FromXmlString("<DSAKeyValue><P>vAmBC+eZJaZa7HdlTDAgsfcT0QSjqN8d8fEeZ9E1kxfIAYGerlHFHW/A5muBYy8FyO7W8r4mqxpxcvFQEeEqVe89BUXecHjh6FkTEsT25r/nbV4jnZBxNz16qb7A6t8MCr0jzuzrIGFVP5VG/ad0s/1078WqpwQqJQXHmH/lXX0=</P><Q>+RdtGnwCJw4u2H/goSLtaAGr1U0=</Q><G>sxQQgHIuRgYOMtB+r7EGRO/OTRGXhUrFyZ1R9nVerGGC2juEVWSoydr2JquILOwIO7+1kIOwbkhCjNlZIAdvWRlN5COF7gHfPi1dSX7LzDcNbZDADvrOUmk1KG3hZ3Vf67XIbug2/nq8aij7gbEs4eA26EWWpObO0a+e2QmsQII=</G><Y>dP073SH4QG5KiV5BbZEDLiV3/D2eD18D9jsMVD1p+eMZsffU88/Pxfen1Pe5cyulw8gQkEvlAa3GEmGsaGaa7Qp245NPD8fbEOLFu3tdwMhw/ylRHpjTS7BDRjvGeyGwSS0WTWQCwCyI8LN6Rvg7p4RfhHIaAWWkTJNVAG7AN7g=</Y><J>wUCV+9KzxPW+J3/DIm3sIfVf29Z8u5zPXnEZbMTrkWwdgOTSPuXimtiQku8knyWD3iC+GqyhtoFqdgXqQS6WcadAABb2U5mMTL0V1o6Jy6c0cyPb9blmf5wdZxMKVlXe9lcAO8rP16XhQGVs</J><Seed>h7zytTPqA9Ue3F7c/j+9iXW4Ebw=</Seed><PgenCounter>Aag=</PgenCounter></DSAKeyValue>");
    }

 
}
View Code

驗證注冊嗎就用上述的公鑰去驗證。

那么能不能自己生成公鑰私鑰去PostSharp.Sdk.Extensibility.Licensing.CryptoUtilities類的的公鑰替換掉呢,答案是肯定的。

先看看怎么生成公鑰私鑰

DSACryptoServiceProvider dsac = new DSACryptoServiceProvider();
string strPublic = dsac.ToXmlString(false); //公鑰
string strPrivate = dsac.ToXmlString(true); //私鑰

結果如:

公鑰

<DSAKeyValue><P>gSFAXq2fbk0P+6y1G6aYXlUPdESfs42kaF/v4pfkt9sNx1bx8Ni4IVzXdgtDLKhIpL9cv6Ho0pEM5qCVZ0oY8QZJpt8PC4ZEiCEgWFGLLLooriZmJPwsEQtcjB/sz4lvvO9oFrLnrYS16e3FCriImDTBVtv3TVptjTjzwWuLDsM=</P><Q>0jat9uBZUDVQJOz8wSD4n0YffmU=</Q><G>epyQJV9QGsh845z+QD8v1GpipREXn+UXmkiW9vPs3BVGGM0ghZFDduArfMn8wZYX4ByIOU1t0tLsZ00Aac1Wu3ZB+X1ccY6E5AVeRLDialis4YyYPjO0wdmZezm9feOSg866450wknur/k9Jz3VnnOC/lrd1tAsIYRajmYCDMZs=</G><Y>MfdvjimBnuxe3s0+xRMcF2BRokqDANzwrMxMJCfmr9Y/Xn+a+uii4/S56169uUryU6hKcuWVoYdSFo7upLDSl8mVn37gg/N78m942PBh2qFRBCLLaGtkV81dRxSxsqln54AlBx5XrfHbAmAGkfAuIA11EeQcJSCt75qkliJNbGw=</Y><Seed>8DxESgmqPh6mI5OkwmQBDiiIrHc=</Seed><PgenCounter>A9M=</PgenCounter></DSAKeyValue>

私鑰

<DSAKeyValue><P>gSFAXq2fbk0P+6y1G6aYXlUPdESfs42kaF/v4pfkt9sNx1bx8Ni4IVzXdgtDLKhIpL9cv6Ho0pEM5qCVZ0oY8QZJpt8PC4ZEiCEgWFGLLLooriZmJPwsEQtcjB/sz4lvvO9oFrLnrYS16e3FCriImDTBVtv3TVptjTjzwWuLDsM=</P><Q>0jat9uBZUDVQJOz8wSD4n0YffmU=</Q><G>epyQJV9QGsh845z+QD8v1GpipREXn+UXmkiW9vPs3BVGGM0ghZFDduArfMn8wZYX4ByIOU1t0tLsZ00Aac1Wu3ZB+X1ccY6E5AVeRLDialis4YyYPjO0wdmZezm9feOSg866450wknur/k9Jz3VnnOC/lrd1tAsIYRajmYCDMZs=</G><Y>MfdvjimBnuxe3s0+xRMcF2BRokqDANzwrMxMJCfmr9Y/Xn+a+uii4/S56169uUryU6hKcuWVoYdSFo7upLDSl8mVn37gg/N78m942PBh2qFRBCLLaGtkV81dRxSxsqln54AlBx5XrfHbAmAGkfAuIA11EeQcJSCt75qkliJNbGw=</Y><Seed>8DxESgmqPh6mI5OkwmQBDiiIrHc=</Seed><PgenCounter>A9M=</PgenCounter><X>ZN67VkaNCRolYpQDVKCOeNYK88M=</X></DSAKeyValue>

ok公鑰私鑰准備好了,怎么改PostSharp.Sdk.Extensibility.Licensing.CryptoUtilities里的公鑰呢

把PostSharp.Settings.dll復制出,打開vs命令行,用ildasm來反編譯成il代碼

ildasm PostSharp.Settings.dll /output= PostSharp.Settings.il

在生成的il代碼中找到設置公鑰的代碼(搜 .class public abstract auto ansi sealed PostSharp.Sdk.Extensibility.Licensing.CryptoUtilities),把公鑰(兩個都)改成剛才生成的公鑰保存il

再用ilasm 生成dll文件

ilasm PostSharp.Settings.il /dll

到此,已經把新的公鑰寫到PostSharp.Settings.dll中了

把新的PostSharp.Settings.dll復制到PostSharp安裝目錄中,覆蓋原有的。打開PostSharp注冊,輸入上面生成的注冊碼。下一步,驚喜出現了

大功告成!

下載就不提供了,原因你懂的

 

后:

發現PostSharp注冊成功后,下次啟動不再對已注冊的key進行合法性判斷。根據此bug,另外制作了一個不用修改dll的注冊機,原理是注冊的時候,注入dll到注冊程序,用反射的原理修改注冊程序的公鑰,即能達到目的。

如果被殺毒軟件攔截注入,必須點允許才可以注冊成功


免責聲明!

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



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