通過學習反編譯和修改IL,閱讀高人的代碼,提高自身的水平。

來源:互聯網
上載者:User
前言

本文取了一個很“高雅”的名字,實際上可以用一個英文單詞概括:crack。

當然,我不鼓吹隨意的crack別人勞動成果以便自身謀取利益。我更推崇的是通過閱讀掌握他人優雅的代碼,提高自身的程式水平。 

恩!大家閱讀本文前,請端正下自己的心態。(。。。。) 

 

本文

最近一連研究了幾個優秀的webui和winform ui控制項,例如divelement, componentart。感覺很是水平,特別自己正在做一個schedule的架構,需要表現力強的ui去好好驗證自己的思路,於是拿起工具玩了一把。

 

傳統的crack,無非是寫個註冊器,產生註冊碼什麼的,可是!這個不是老子的目標!我要做的是連和註冊相關的代碼全部都delete掉,成為一個真真正正乾淨的dll。

 

那麼工作前,先列舉一些工具:

1. reflector.net 反編譯為c#,非常有用,主要使用者匯出vs項目,然後查看類的調用關係。

2. UntraEdit,用16進位去閱讀代碼,可以看到很多dotfuscator混淆的亂碼。

3.  ildasm.exe 微軟.net 內建的一個對dll解壓成為il的工具。找不到可以用資源管理員搜尋一下。

4.  ilasm.exe 對il再次編譯為dll

5. 附加一個 Remotesoft .net Explorer。可以方便的查看il。不過貌似和ildasm差不多。作為備胎吧。

 

工作流程水賬

1. 擷取需要玩的dll,一般安裝了對方的控制項,在program files目錄下面可以獲得。

2. 使用ildasm.exe 轉成il檔案,這裡有個細節,必須轉成Utf-8的格式,不能轉成Acsii,否則部分混淆的代碼會丟失一些資訊。

 

3. 使用ilasm.exe 對il進行打包,只要這步能夠通過,那麼表示咱們的工作可以繼續了。否則,作者的安全措施就太豐富了,咱們搞不下去。 

4. 一般來說,我們對於dotfuscator可以無視。這種小兒科騙騙外行就可以了,只要涉及到了public class/ public method,所有的混淆都不會處理,這個是必然的。而我們需要破解的地方,往往就是這些地方,所以不管你怎麼混,和我沒有關係。

5. 一切工作準別就緒了後,我們現在已經用有了il源碼,現在開始直接在上面修改!

 

6.  開啟reflector.net(如果可以),匯出dll為一個c#項目。各位大俠先別笑,我不是傻逼到修改c#代碼然後編譯。這種水平的事情我不會還正兒八經的拿出來說事的。匯出c#目的是方便研究各種類之間的調用關係,特別和註冊相關的類。

一般來說,reflector.net匯出的項目都會編譯不通過,但是無所謂,只要能夠分析了調用關係就可以了。

 

7. 一般老外使用的註冊機制基於了System.ComponentModel, 例如ComponentArt裡面的:

 

這裡就使用了License, LicenseProvider, RegistryFileLicenseProvider。

而傳統的crack就是針對了他們的演算法,寫各種註冊機。可是各位高手也閑著蛋疼,搞這麼多註冊機,不如我簡單的把這幾個類直接從IL裡面刪了來得快!

 

8. 現在開始動真格的了。我估計99%的.netor不會認真學習IL,所以不怎麼敢動。我現在就告訴大家一個超級簡單的CRACK方法,就算你不懂IL,一樣改。這個方法就是 辰式對照法

 

建立一個c#項目,把需要修改的源碼片段COPY一份到新項目,然後修改到能編譯通過之後,直接改新項目裡的源碼,再編譯為IL,對著copy到原項目的il。

 

 

比如,我通過reflector看見了源碼裡面有一段代碼:

代碼public virtual bool IsLicensed()
{
    if (this.License != null)
    {
        return true;
    }
    try
    {
        this.License = LicenseManager.Validate(base.GetType(), this);
        return true;
    }
    catch
    {
        return false;
    }
}

 

 

明擺著,我們需要返回true,於是我copy這段代碼到新的項目,例如:

代碼using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;

namespace ComponentArt.Licensing.Providers
{
    public class Hello
    {
        System.ComponentModel.License License;

        public virtual bool IsLicensed()
        {
            if (this.License != null)
            {
                return true;
            }
            try
            {
                this.License = LicenseManager.Validate(base.GetType(), this);
                return true;
            }
            catch
            {
                return false;
            }
        }
    }
}

 

除了方法內部我不變動外,其他的依賴項我盡量虛構出來,您需要什麼類,我就建個空類,您需要調用什麼方法,我就虛構一個方法。只要您能編譯通過,我做您孫子都可以!

 

如果不放心,可以試著反編譯這段代碼編程IL,和原IL對比一下。

 

然後我們修改這段代碼為:

代碼using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;

namespace ComponentArt.Licensing.Providers
{
    public class Hello
    {
        System.ComponentModel.License License;

        public virtual bool IsLicensed()
        {
            return true;
        }
    }
}

 

再反編譯為IL,直接替換原來的IL。哈哈,之前做孫子,今兒是你爺!

 

估計大家能領會這段思路了,我們讓變動的地方盡量的隔離出來分析,然後整塊替換。這樣就能夠任意修改IL代碼了。而且根本不需要管你的註冊機制是怎麼實現的,我一併端了。

 

經驗分享

九陰真經我已經寫了,這裡就寫點經驗吧。也許有哥們說,既然reflector都看的著了,你還瞎忙什麼。

 

這樣說就大有問題了。因為reflector倒出來的代碼一般都不能夠反編譯回去,但是只要dll能夠編程IL,暫就有辦法去改。而且練到一定等級的高手,以後直接就開啟IL改了,根本不管你什麼方法。當然要到高手的水平,還是有點積累的,例如:

 

1. 刪除強式名稱

開啟IL,在開頭一段,找到一下代碼,直接刪除。

 代碼

  .publickey = (00 24 00 00 04 80 00 00 94 00 00 00 06 02 00 00   // .$..............
                00 24 00 00 52 53 41 31 00 04 00 00 01 00 01 00   // .$..RSA1........
                8F B8 4C 20 4D AD 24 D4 AC FF 94 0C 9C 74 AB F4   // ..L M.$......t..
                E1 F7 7D 41 81 9F BB 3B 43 5C 4A 16 B6 9C C1 04   // ..}A...;C\J.....
                AE 54 6C C0 7A FA A8 65 F0 D4 7B 89 AE 63 70 48   // .Tl.z..e..{..cpH
                23 C7 67 35 BC 1C 00 A9 BC C1 B6 F0 CC F6 D9 90   // #.g5............
                55 8E 30 3C 00 E1 6A AF E2 C4 2F A2 2E D4 0B BC   // U.0<..j.../.....
                A3 9A 71 40 FA 9F 95 D9 E6 F9 96 6F 01 9C 0B E3   // ..q@.......o....
                4A 79 D9 00 57 85 A3 AA 70 5B 0F A1 48 B4 B1 07   // Jy..W...p[..H...
                C9 3C 1C 11 10 7E 7F BB BF C5 50 09 E3 9E A6 B4 ) // .<...~....P.....
  .hash algorithm 0x00008004

 

 

2. 刪除VS2005對項目的許可權檢查。

一般就是依賴了LicenseProviderAttribute,開啟IL,找到類似的代碼,直接刪除。 

代碼  .custom instance void [System]System.ComponentModel.LicenseProviderAttribute::.ctor(class [mscorlib]System.Type) = ( 01 00 3C 43 6F 6D 70 6F 6E 65 6E 74 41 72 74 2E   // ..<ComponentArt.
                                                                                                                       4C 69 63 65 6E 73 69 6E 67 2E 50 72 6F 76 69 64   // Licensing.Provid
                                                                                                                       65 72 73 2E 52 65 67 69 73 74 72 79 46 69 6C 65   // ers.RegistryFile
                                                                                                                       4C 69 63 65 6E 73 65 50 72 6F 76 69 64 65 72 00   // LicenseProvider.
                                                                                                                       00 ) 

 

 

3. 修改對License的依賴

一般dll裡面會存在多個license版本,當然會有一個正式的license,然後代碼中間會運行類似以下片段擷取license: 

this.License = LicenseManager.Validate(base.GetType(), this);

 

我們現在直接建立一個正式的license就可以了。甚至可以自己虛構一個出來,然後嵌入IL。例如:

 this.License = new FullLicense();

 

做到這部,就需要我上面說的對照法,或者熟悉IL的,直接寫IL。

 

4.  刪除所有和licenseProvider相關的類和代碼。

反正是繼承了licenseProvider之類的,還是調用了,能改就改(借鑒了reflector.net),之後把licenseprovider刪了。

 

小結

 本文的目的,是讓大家能夠更加深入的學習.net,甚至掌握IL。我就是通過改中,慢慢掌握了IL的。感覺比起c#,IL簡單多了。希望大家能夠成為獨霸一方的高人,將來多指導小弟我了!

 

祝各位虎年快樂! 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.