NET程式的破解

來源:互聯網
上載者:User
關於.net程式破解思路

破解

NET程式的破解(一)
-------------靜態分析

NET程式已經紅紅火火的興起,就象LINUX一樣勢不可擋的湧來。作為一名Cracker,你會選擇躲避嗎?嘿嘿,對俺而言,挑戰更富有趣味。

破解好幾個.NET的程式了,一直想寫出來,只是時間問題,所以拖到現在,怕再不寫,就忘的一乾二淨了;)…….

一、兵器

   公欲善其事,必先勵其器。在靜態下反編譯NET程式我選擇Reflector,Xenocode Fox 2006 Evaluation。他們的分別如下:

Reflector:   http://www.aisto.com/roeder/dotnet/

Xenocode:http://www.xenocode.com/Products/Fox/Community.aspx

二、破解目標:Xenocode Fox 2006 Evaluation   14天使用限制

二、破解流程

     很多人都介紹過靜態分析破解.NET的程式,所以如果你已經是老手或者下面的部分剛好是你所不屑一看的部分,請退出J。

之因為破解這個程式,是在論壇裡henryouly曾“【推薦】兩個.NET IL的相關工具”,試用了一下Xenocode Fox 2006 Evaluation,效果確實很不錯,程式有點類似Reflector,只是多了一點我認為比較好的功能:直接顯示代碼在程式體中的位置。Reflector是完全免費的,但Xenocode Fox 2006 Evaluation卻有14天的限制,過了14天想使用就需要調整電腦的日期了,而且老版本的Reflector還無法反編譯Xenocode Fox 2006 Evaluation。以己之矛,克己之盾,唉,軍中大忌呀。

啟動Xenocode Fox 2006 Evaluation的主程式FOX.EXE,在沒到期的時候很容易就啟動了;把時間向後調整1個月,FOX.EXE啟動就提示14天的測試期到了,然後就退出了。

用新版本的.NET Reflector, Version 4.2.36.0開啟Xenocode Fox 2006 Evaluation主程式,發現程式碼已經被混淆過,看不出什麼名堂了,就是有一點的有名函數,對我們來說也沒什麼太大作用了;搜尋索引鍵串14-day,也找不到。到期如下

在Reflector裡用滑鼠右鍵點程式FOX的名字,在出現的菜單裡有一個選項“Go To Entry Point”,嘿嘿,看到了嗎?

在這個菜單上點一下,我們被動局面立刻就被扭轉了:我們直接來到了程式的入口代碼處!按我們的推測,程式啟動就判斷了時間,驗證是是不是到期了,沒到期就啟動,否則就出現到期的提示框,然後退出。那麼在入口代碼處,我們一段段代碼的過,一定可以找到時間比較過程等。入口處函數代碼如:

在xc447809891322395函數上雙擊,出現函數代碼一如下(C#)顯示:[STAThread]
private static void xc447809891322395()
{
      if (!x867eb3246b182488._c7c43f12e732db09())        ;行1
      {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new x3e4e23fadc83a77e());
      }
}
看到上面的入口代碼,你不覺得行1可疑嗎?進入程式就調用了一個函數,然後判斷的結果影響後面的所有代碼的執行,嘿嘿,我們點擊上面的_c7c43f12e732db09()進入,看到程式碼片段二如下:

public static bool _c7c43f12e732db09()
{
      if (x71a0073930f50f3f.xb30f5e1eb4806151("XFTRL" + x77fa6322561797a0.x9c1ceef9a932f141, new TimeSpan(x867eb3246b182488.x7ee7e0aa39016337, 0, 0, 0, 0)))
      {
            MessageBox.Show(MessageTable.TrialExpired, x77fa6322561797a0.x6886d5a1867d55cb);
            return false;
      }
      return false;
}

看到什麼了?如果你學的外語是英語,一定可以看出來在.IF語句裡的TimeSpan、TrialExpired 是什麼意思了,而且還帶著MessageBox,哎,是不是來的有點太容易了,J。上面語句中進入就用那些參數進行了時間比較,然後不到期的話,返回FALSE;到期返回TRUE。

看來修改返回的TRUE和FALSE測試一下,就知道我們上面的判斷的正確與否了,就是讓返回的都是FALSE,程式不就認為是在使用到期日內嗎?如何修改?有很多前輩高人講了很多辦法,比如直接用ILDASM反組譯碼出來,然後修改語句,再用ILASM編譯回去等等。我對他們的方法一直操作的不好,所以我用懶人的辦法。你想知道嗎?呵呵,let us go!

把上面程式碼片段二切換為IL格式,如下程式碼片段三:

.method public hidebysig static bool _c7c43f12e732db09() cil managed
{
      .maxstack 8
      L_0000: ldstr "XFTRL"
      L_0005: call string Xenocode.Fox.Gui.x77fa6322561797a0::get_x9c1ceef9a932f141()
      L_000a: call string string::Concat(string, string)
      L_000f: ldsfld int32 Xenocode.Fox.Gui.x867eb3246b182488::x7ee7e0aa39016337
      L_0014: ldc.i4.0
      L_0015: ldc.i4.0
      L_0016: ldc.i4.0
      L_0017: ldc.i4.0
      L_0018: newobj instance void [mscorlib]System.TimeSpan::.ctor(int32, int32, int32, int32, int32)
      L_001d: call bool Xenocode.Fox.Gui.x71a0073930f50f3f::xb30f5e1eb4806151(string, [mscorlib]System.TimeSpan)
      L_0022: brfalse.s L_0036
      L_0024: call string Xenocode.Fox.Gui.Common.MessageTable::get_TrialExpired()
      L_0029: call string Xenocode.Fox.Gui.x77fa6322561797a0::get_x6886d5a1867d55cb()
      L_002e: call [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string, string)
      L_0033: pop
      L_0034: ldc.i4.1
      L_0035: ret
      L_0036: ldc.i4.0
      L_0037: ret
}
在Reflector中,當你把滑鼠放在指令上停留的時候,指令的機器碼和對應的指令意思立刻會顯示出來,真的很感謝Reflector的作者,簡直讓我崇拜 J。比如上面的指令
L_0033: pop
      L_0034: ldc.i4.1
      L_0035: ret
      L_0036: ldc.i4.0
      L_0037: ret
所對應的機器碼就是26 17 2A 16 2A ,而我們想修改上面的L_0034: ldc.i4.1變成L_0034: ldc.i4.0 就可以了。我用HEXWORKSHOP開啟FOX.EXE,然後尋找上面的HEX代碼,找到後,修改17為16,就可以了。這裡會有個問題:如果在程式中尋找出來好幾個地方都一樣,你如何修改?這就是我看中Xenocode Fox 2006 Evaluation的地方,它可以直接告訴你函數的入口在BODY中的地址,而且告訴你這個函數一共佔有多少個位元組。如:

  

用HexWorkShop開啟FOX.EXE,然後直接定位到檔案的111D88處,然後向下看我們的26 17 2A 16 2A,或者找111D88處的位移,111D88+34=111DBC,怎麼樣?修改吧,還等什麼,記得修改完後儲存。

啟動FOX看看效果,嘿嘿,已經在到期的情況也使用了,只是到期提示還存在,讓人覺得難受。去掉提示框:①修改代碼L_0022: brfalse.s L_0036 這裡,改為直接跳轉到L_0036②或者把Messagebox函數屏蔽掉,都可以去掉到期提示。我開始用方法1修改,發現程式運行就出錯,原來是牽扯到OPCODE語句執行後有堆棧平衡的問題,看來不熟悉也不行。我最終選擇使用方法2修改,啟動Hexworkshop,把L_0024~ L_0033間的語句全替換為NOP,在IL語言中就是00,然後儲存退出。
再啟動,世界清淨了,嘿嘿,裡面的EVALUTE 就修改成PRO好了,嘿嘿,順手牽牛…….。

 

基於.net的破解樣本(數獨終結者2.2Build2633破解簡記)

軟體簡介:數獨(SUDUKU):一種數字邏輯遊戲,其概念源自[拉丁方塊],由18世紀瑞士數學家發明。是國際上流行的一種用來鍛煉邏輯思維及策略的工具。目前正在以前所未有的速度在中國大地流傳。最近幾天稍關注了一下相關軟體,發現目前適合國人的有以下三款:完美數獨、數獨博士、數獨終結者。三者各有千秋,本文簡要介紹數獨終結者2.2Build2633版的限制解除方法。

加密特點:該軟體基於.net環境編製,有七天的無限制使用。程式啟動時會彈出試用版的提示。超過七天則不能進入主介面。

破解手記:.net環境下的反編譯工具主要有Reflector和Xenocode Fox款,兩者都很強大,能比較完美的反編譯出各類語言的原始碼,比較而言,Reflector是免費軟體,執行速度較快,而且支援pascal語言的反編譯顯示。Xenocode Fox 的強項在於其可以顯示函數在二進位檔案中的位移量,這點很重要,兩者可以結合使用。用Reflector載入isudoku.exe,定位到函數入口處(這是Reflector很實用的功能之一),能看到以下代碼:

 bool flag;
        Preferences.RegistrationStatus = RegistrationStatus.TrialExpired;
        string str = "";
        string userName = str;
        string serialNumber = str;
        if (RegistryHelper.ReadRegInfo(ref userName, ref serialNumber))
        {
            if (RegistrationHelper.VerifyRegistrationCode(serialNumber, userName))
            {
                goto Label_00D3;
            }
            flag = false;
        }
        else
        {
            flag = false;
        }

可見程式啟動之後首先就校正註冊碼,Label_00D3為賦登入標記處,由於我們需要暴破它,因此我們要讓其直接跳轉到Label_00D3處,在Reflector中將代碼顯示IL格式,可以看出上面的代碼編譯成Managed 程式碼如下:

    L_000b: ldc.i4.2
    L_000c: call void Luckybird.iSudoku.Preferences::set_RegistrationStatus(valuetype Luckybird.iSudoku.RegistrationStatus)
    L_0011: ldstr ""
    L_0016: stloc.s str
    L_0018: ldloc.s str
    L_001a: stloc.s str3
    L_001c: ldloc.s str
    L_001e: stloc.s str2
    L_0020: ldloca.s str3
    L_0022: ldloca.s str2
    L_0024: call bool Luckybird.iSudoku.Utilities.RegistryHelper::ReadRegInfo(string&, string&)
    L_0029: stloc.0
    L_002a: ldloc.0
    L_002b: brfalse.s L_003f
    L_002d: ldloc.s str2
    L_002f: ldloc.s str3
    L_0031: call bool Luckybird.iSudoku.Utilities.RegistrationHelper::VerifyRegistrationCode(string, string)
    L_0036: brtrue L_00d3
    L_003b: ldc.i4.0
    L_003c: stloc.0
    L_003d: br.s L_0041
    L_003f: ldc.i4.0
    L_0040: stloc.0

由於我們沒有註冊碼,則 L_002b: brfalse.s L_003f處肯定會跳過去(相當於執行最外層的else語句),我們的目標就是要讓其直接跳至L_00d3處,則可以通過Xenocode Fox 找到該函數所在的位置,用UE定位到該處,將其修改為無條件長轉移指令(需注意修改位置,ReadRegInfo語句後的兩句為堆棧平衡語句不可覆蓋),修改後的代碼如下:

    L_000b: ldc.i4.2
    L_000c: call void Luckybird.iSudoku.Preferences::set_RegistrationStatus(valuetype Luckybird.iSudoku.RegistrationStatus)
    L_0011: ldstr ""
    L_0016: stloc.s str
    L_0018: ldloc.s str
    L_001a: stloc.s str3
    L_001c: ldloc.s str
    L_001e: stloc.s str2
    L_0020: ldloca.s str3
    L_0022: ldloca.s str2
    L_0024: call bool Luckybird.iSudoku.Utilities.RegistryHelper::ReadRegInfo(string&, string&)
    L_0029: stloc.0
    L_002a: ldloc.0
    L_002b: br L_00d3
    L_0030: stloc.0
    L_0031: call bool Luckybird.iSudoku.Utilities.RegistrationHelper::VerifyRegistrationCode(string, string)
    L_0036: brtrue L_00d3
    L_003b: ldc.i4.0
    L_003c: stloc.0
    L_003d: br.s L_0041
    L_003f: ldc.i4.0
    L_0040: stloc.0
儲存退出,發現程式直接提示到期,看來沒這麼簡單。

分析RegistrationStatus可知其為一屬性,它指向一枚舉類型:

internal enum RegistrationStatus
{
    Registered,
    Trial,
    TrialExpired,
    InvalidLicense
}

其讀寫函數如下:

public static RegistrationStatus RegistrationStatus
{
    get
    {
        return _registrationStatus;
    }
    set
    {
        _registrationStatus = value;
    }
}

該屬性的賦值過程被多次調用,因此比較好的辦法就是將其改為如下形式:

public static RegistrationStatus RegistrationStatus
{
    get
    {
        return RegistrationStatus.Registered;
    }
    set
    {
        _registrationStatus = RegistrationStatus.Registered;
    }
}
儲存退出後運行程式沒有發現異常。

補充:關於枚舉類型的預設值修改可通過分析枚舉類型、值的大小,結合枚舉名稱進行定位修改(本例改後沒有效果,僅記錄下來供參考),比如枚舉中包含int32 abcd=1,則可以先通過搜尋abcd定位一次,然後搜尋04 01結合其它枚舉值進行精確定位(32位整數形賦1是04 01,64位整數開型賦1是08 01)。

 

軟體及破解補丁:http://oriface.ys168.com/

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.