序:Tankaiha在他的“用PEBrowse對.Net程式進行動態調試”中曾經提到過3種方法可以破解.NET程式,我下面介紹的方法,剛好是他說的第一種,但又不完全是。就是用.NET SDK中內建的偵錯工具\Microsoft.NET\SDK\v2.0\GuiDebug 對.NET的可執行檔直接進行調試。
因為.NET版本的不同,安裝目錄有所差別,都可以在1.1和2.0版本的目錄裡找到GuiDebug這個目錄,裡面的DbgCLR.EXE就是我今天要說的動態調試器。DbgCLR.EXE程式是我在破解.NET程式過程中,被逼無耐而到處狂翻,無意中找到的工具,而且經過自己的使用,知道了一些皮毛的用法,如果您是老手,還不要取消我J
另:在上篇文章中,忘記告訴大家opcode類尋找的地址,可找到opcode指令對應的16進位位元組,這樣可以方便的修改程式:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpref/html/frlrfSystemReflectionEmitOpCodesClassLdargTopic.asp
一、 破解目標:crackeme.exe(為某些原因隱藏程式的名稱),我會把附件上傳到網路空間,給出地址。程式有註冊號的限制,而且採用了代碼混淆和反跟蹤的手段。
二、 破解工具:DbgCLR.EXE, Reflector在4.2.36.0
三、 DbgCLR.EXE的一些簡單設定和使用
啟動DbgCLR.EXE,是中文版本的,對我們而言很容易就能看懂,我只把幾個關鍵地方提一下。如所示。
1、設定調試配置如下: 點菜單中的“工具”——“選項”進行設定。一
圖一
點選項後出現下面的選擇,選中下面的“如果源不可用,則顯示彙編”。然後“確定”(下面圖二是2.0版的顯示)
圖二
或者在1.1版中如三所顯示
圖三
註:把即時裡的項目都選中。
2、載入程式:從菜單中選擇“調試”---“要調試的程式”,從“程式”按鈕中選擇我們的需要調試的crackme.exe,然後“確定”就可以了。如四所示:
圖四
選擇並確定後,程式不會立刻運行,也不會象在OD中那樣立刻分析代碼,而是等待我們的下一部命令的輸入,而且“調試”菜單中已經多了很多功能。五所示
圖五
3、設定“異常”選項:可以根據程式的情況來設定,因為正在討論的這個crackeme.exe採用了很多手段反跟蹤等,所以我把異常裡所有的選項都選擇上了,並且啟用。點圖五菜單中的“異常”,
圖六
調試器環境的設定都差不多了,可以進行下一部的跟蹤了。
四、 調試分析
1、分析:用PEID查看,為Microsoft Visual C# / Basic .NET,所以用Reflector開啟crackme.exe進行分析,發現Reflector不支援,crackme已經對代碼進行了混淆(我把此crackme.exe發送給了Reflector的作者,所以Reflector在4.2.36.0版本以後開始支援此crackme混淆代碼的處理,這也就是我最初破解採用動態跟蹤這個程式的原因)
改用《NET程式的破解(一)》中的Xenocode Fox 2006 Evaluation開啟crackme.exe,發現crackme中很多代碼都顯示不出來,或者反編譯出來的資訊對我們基本沒任何作用L,即使看到了裡面很多reg資訊有關的東西,還是沒有任何的成型的代碼讓我們來分析,你的心涼了嗎?最初在沒發現DbgCLR這個工具的時候,我徹底陷入了悲哀中,用OD和SOFTICE調試.NET的程式,無疑就是一種煉獄生活。到現在我也很感歎對這個crackme進行混淆的人的水平,或者是我剛接觸.NET,對.NET瞭解的太少了,記得Reflector的作者曾經問過我一句” What
tool was this file obfuscated with?”,我告訴他我也很想知道。
2、動態調試
在圖五中點“啟動”或者“逐語句”“逐過程”都可以啟動crackme,crackme啟動中看來沒有對註冊資訊的驗證,點crackme中的[開始] 按鈕,才提示讓你註冊,出現註冊框,如:
圖七
在出現的對話方塊裡,我們輸入假的註冊號”miaomiao”,點“確定”後,crackme會提示你重新啟動驗證,然後重新啟動。
第2次啟動crackeme,然後點“開始”後,DbgCLR異常中斷,出現提示框,問我們是否中斷,選擇“中斷”後,程式立刻被斷下來(多次調試後發現程式已經把我們註冊過的資訊寫入了系統裡,點“開始”後就對我們的輸入的註冊號進行了動態檢測比較,並且採用了多處異常的方式來進行)。
此時可以開啟幾個視窗,從“調試”—“視窗”中選擇自己所需要的視窗,我習慣用下面的幾個:
圖八
Crackme被中斷後,看到圖八中的“呼叫堆疊”裡的資料,嘿嘿,你看到什麼了?秘密就在這裡,放大九:
圖九
在“呼叫堆疊”中任意雙擊其中的一個函數,對應的函數代碼立刻在“反組譯碼”視窗裡顯示出來,顯示的效果,跟Reflector裡顯示的結構很相似,也讓我們很順利的瞭解了程式的執行結構。哈,這正是我們所需要的;綠色箭頭所指的,正是子程式要返回的位置,在我們需要的代碼上點滑鼠右鍵,選擇“插入斷點”,這樣程式執行完現在的子程式返回後,就可以中斷在這裡了。
圖十
經過多次的跟蹤分析,發現做如下的修改,就可以讓程式正常運行而不再提示註冊;如果要研究這個軟體的註冊演算法,你就要自己去跟蹤分析了J:
NQQTools.CheckReg.Check
00000093 0F B6 F0 movzx esi,al ;修改mov al,01
00000096 8B C6 mov eax,esi ;修改為 mov esi,eax
00000098 25 FF 00 00 00 and eax,0FFh
0000009d 89 45 E0 mov dword ptr [ebp-20h],eax
000000a0 90 nop
000000a1 EB 0E jmp 000000B1
000000a3 C7 45 E0 00 00 00 00 mov dword ptr [ebp-20h],0 ;修改為 mov [ebp-20],1
000000aa E8 4B 6B 20 78 call 78206BFA
000000af EB 00 jmp 000000B1
NQQTools.Form1.button2_Click
00000031 0F B6 F8 movzx edi,al
00000034 85 FF test edi,edi
00000036 75 1E jne 00000056 ;改為 jmp 56
000000a0 8B CF mov ecx,edi
000000a2 E8 89 04 A3 78 call 78A30530
000000a7 0F B6 F8 movzx edi,al
000000aa 85 FF test edi,edi
000000ac 74 0A je 000000B8 ;修改為跳
(註:在代碼視窗裡可以直接選取,然後從菜單“編輯”—“複製”裡把代碼複製出來)
五、 總結
程式的註冊過程到現在我也沒時間去研究了,對我來說註冊不註冊都不重要了,我寫到這裡的目的,也同樣是告訴你們如何來動態跟蹤.NET程式,除了Tankaiha所說的PEBrowseDbg動態跟蹤方法外,這應該也算是一個不錯的方法了,只要讓.NET程式變成我們所熟悉的ASM代碼結構,一切都顯的那麼自然。
DbgCLR.EXE在偵錯工具的時候,並不一定非要到異常才能斷下來的,這是我需要說明的一點,這是我對抗這個crackeme的策略而已。如果在調試其他程式的時候,斷點的方法就要靠你們自己去發掘去了,記得有好的經驗就告訴我J,我也在摸索中前進。
我對這個混淆.NET代碼的人真的很佩服,我曾經用winhex對代碼的記憶體進行動態修改,結果發現記憶體中的代碼類似於動態解碼狀態,就是函數執行完畢後,代碼就沒有了,需要執行加密函數時,代碼又恢複出來了L,連做記憶體補丁的機會都不給我。哎,讓我想起了論壇裡Bi11's Simple Packer for some .net executables的壓縮殼。
先寫到這裡吧,再寫多了反而有灌水的嫌疑J,下章節………………………………………………………………
謹以此文獻給所有的cracker