.Net環境下的程式破解(3)

看雪資料發表於2003-06-17

一直忙於論文,所以寫到(2)就沒有寫下去了,最近剛好有點時間,就繼續我們的《.net環境下的程式破解》系列教程。
現在.net應該是個比較流行的平臺了,網上已經開始大量出現.net的控制元件和伺服器軟體,我想我們做破解的也應該緊跟時代潮流,呵呵:)
本次主要將如何來靜態分析,並且爆破一個很簡單的CrackMe。
使用的工具是.net Framework SDK自帶的工具,ILasm、ILDasm,,這兩個工具用於.net下的彙編、反彙編,具體基本概念和工具用法參見教程(1,2),CrackMe 在附件中。

該CrackMe註冊碼正確試彈出對話方塊“Congratulations,Right Code!”,否則為"Wrong Code"。
下面講解如何破解該CrackMe:
(1)首先啟動ILDasm,匯入CrackMe.exe .

(2)使用選單 "File"->"Dump" (中文版的為 "檔案"―>"轉儲"),將程式的IL程式碼匯出為crackme.il
用文字編輯軟體開啟crackme.il ,搜尋"Congratulations,Right Code",定位到這裡,
下面我用註釋來解釋這段IL的含義:

.method private hidebysig
           instance void  button1_Click(object sender,
                                        class [mscorlib]System.EventArgse) cil managed
   {

     .maxstack  2
     .locals  init (string V_0)
     IL_0000:  ldarg.0
     IL_0001:  ldfld      class [System.Windows.forms]System.Windows.forms.TextBox CrackMe.form1::textBox1
     IL_0006:  callvirt   instance string [System.Windows.forms]System.Windows.forms.Control::get_Text()   //取textBox1的Text
     IL_000b:  stloc.0
     IL_000c:  ldloc.0
     IL_000d:  ldstr      "CCG-20030617"
     IL_0012:  callvirt   instance bool [mscorlib]System.String::Equals(string)
     IL_0017:  brfalse.s  IL_002a  //這裡是關鍵跳轉,我想大家都看出來了

     IL_0019:  ldstr      "Congratulations,Right Code!"
     IL_001e:  ldstr      "CrackMe"
     IL_0023:  call       valuetype [System.Windows.forms]System.Windows.forms.DialogResult[System.Windows.forms]System.Windows.forms.MessageBox::Show(string,string)  //MessageBox
     IL_0028:  pop
     IL_0029:  ret                      //返回 return

     IL_002a:  ldstr      "Wrong Code!"
     IL_002f:  ldstr      "CrackMe"
     IL_0034:  call       valuetype [System.Windows.forms]System.Windows.forms.DialogResult[System.Windows.forms]System.Windows.forms.MessageBox::Show(string,string)  //MessageBox
     IL_0039:  pop
     IL_003a:  ret
   } // end of method form1::button1_Click  <---這是ILDasm自動生成的,告訴你這是button1按下去對應的

這裡我想大家就算不懂IL,也能猜出來這段程式碼的含義,特別是IL_0017:  brfalse.s  IL_002a,一看就是跳轉語句,典型的if .. else 判斷。 當然,大家也猜出來註冊碼是"CCG-20030617" 了

不過我想還是要解釋一下IL裡面的跳轉語句,這是Crack必備知識。

BRTRUE 和BRFALSE ((branch on false/branch on true)是常用的跳轉語句,BRTRUE 和BRFALSE彈出堆疊最頂端的條目,然後根據該項為真(1)還是為假(0)而分別跳到指定的程式碼行。
大家注意到IL_0017: brfalse.s IL_002a的上一條指令是Call String::Equals函式(事實上就是strcmp),返回一個bool值,這個bool值存放在堆疊,然後brfalse把剛剛放進去的bool值從堆疊彈出來,判斷如果是假,則跳轉到IL_002a (也就是MessageBox提示出錯的地方)。

常用的跳轉指令還有:
BEQBranch on equal
BGTBranch on greater than or equal
BLEBranch on less than or equal
BLTBranch on less than
BNEBranch on not equal

這幾條指令和win32平臺的跳轉指令都是對應的,我就不一一講解了。

(3)爆破
這個CrackME是非常簡單的,一眼就可以看出註冊碼,然而現實是殘酷的,所以我們還要學會TNT來使自己可以面對生活的挑戰:)。
當你還沒有熟練IL的基本語法時,我想找到關鍵點並且爆破是最簡單有效的辦法。
剛才這個CrackME我們已經找到關鍵點了,我們把brfalse.s改成brtrue就能輕鬆爆破了。
然而,問題是你修改的是反彙編出來的il檔案,並不是exe,怎麼辦?
這個問題.net framework sdk裡面早就準備好了解決方法,既然有ildasm就有ilasm。

我們對crackme.il做了如下修改:
IL_0017: brtrue.s IL_002a
儲存。

ilasm是命令列方式的,我們使用命令:
E:\CrackWork>ilasm Crackme.il /resource=Crackme.res

馬上得到下面結果:
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
Assembling 'E:\CrackWork\Crackme.il' , n
o listing file, to EXE --> 'E:\CrackWork\Crackme.EXE'
Source file is UTF-8

Assembled method form1::.ctor
Assembled method form1::Dispose
Assembled method form1::InitializeComponent
Assembled method form1::Main
Assembled method form1::button1_Click
Creating PE file

Emitting members:
Global
Class 1 Fields: 5; Methods: 5;
Resolving member refs: 37 -> 37 defs, 0 refs
Writing PE file
Operation completed successfully

馬上就生成了CrackMe.exe檔案,注意上面的引數中還要帶上資原始檔/resource=Crackme.res ,這個資原始檔在ildasm進行反編譯的時候自動生成,嘿嘿,大家一定又會想到,我們還可以利用這種方法來修改資源和漢化。
執行新的CrackMe.exe,輸入任意字串(只要不是正確的^_^),都能成功註冊。
(CrackMe1.exe 插圖)

好了,一個簡單的CrackMe就這樣搞定了,是不是覺得餘味未盡啊,那不妨找一個軟體來練練手:)

下次寫寫如何動態除錯.net下的程式,掌握了動態除錯後,“除錯”程式就更爽了~~ :)


WinHack 2003-6-16
QQ :85436
屬於[CCG],[OCN],[YCG],[FCG]


相關文章