一直忙於論文,所以寫到(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]