用OllyDBg動態破解入門 (3千字)

看雪資料發表於2001-11-13

第二篇作品 , 今次不用暴破 , 要找到真正註冊碼
工具: 不用 SoftICE , 不用 W32dasm , 只用OllyDBg , 對 ! 只用它 :-)
目標:http://person.longcity.net/home3/fpxfpx/idcrackme2.zip
這個 crackme 要輸入名字 , 組織和註冊碼叄個資料 , 不正確則按 "Check"不能啟用 "Get'done'listed" 按鈕
.
.
執行 OllyDBg , File > Open , 選 idcrkme20.exe
在預設狀態下 , 放大 OllyDBg , 分為四部份,
上 , 下 , 左 , 右 四個狀態窗
現在右擊左上角的視窗 , 出現選項 , 選 "Search for > Name (label)"
一個名為 "Names in IDCRKME2" 的視窗出現 , 在裡面找尋 "USER32.GetDlgItemTextA"
選中後 (會有顏色 highlight) , 按 "Enter"鍵 , 出現一個名叫"References in IDCRKME2"的視窗,
右擊視窗 , 選 "Set breakpoint on every command" , 你會見到"紅色"的地址
(這個等如你在Sice中的 bpx GetDlgitemTextA,有誰知道怎下 bpx hmemcpy 嗎 ?)
回到主視窗 , 選 Debug > run (熱鍵是F9) , CrackMe 2.0 程式出現 ,
我填上 Name:Freeplayer  Group:Free  Code:87654321 , 按 "Check" ,
左上角程式顥示停在 0040140B GetDlgItemTextA , 按F2 取消breakpoint , 按 F9 , 第二攔在 00401496 , 按F2 取消breakpoint , 按 F9 , 叄攔在 00401A3B (這是最後一次呼叫 GetDlgItemTextA, 因為輸入處有叄個地方填資料) , 按F2 取消breakpoint , 按 F7 ,
看一下 , 是 GetDlgItemTextA ASCII "87654321" ,多方便 , 連 "D" 都不用就知是什麼 :)

F7 至 00401A46 Call idcrkme2.00402970 <-- F7 入這 call
.
.
00402972  |. 8B7424 0C      MOV ESI,DWORD PTR SS:[ESP+C]            ;  IDCRKME2.00409790 <-- 將我的序列號放進 ESI , 不用猜 , 看一下左上角和左下角中間的地方是 : Stack SS:[0064F904]=00409790 (IDCRKME2,00409790), ASCII "87654321"
ESI=00000AF0
F7 一次 , 看右上角 register 狀態 :ESI 00409790 ASCII "87654321" , 酷吧 , 很多東西都一目瞭然 :-)
.
.
.
一輪運算後 , F7 至 00401A4E , 看一下 EAX , EAX 05397FB1 <-- 是什麼 ? 將 87654321 轉成 HEX value :-)
.
.
F7 至 00401A5B Call IDCRKME2. 00401290 <-- 入這 Call , 裡面是將我輸入的放進記憶體
.
.
F7 至 004012BA Call IDCRKME2. 00401520 <-- 入這 Call ,
.
.
00401531  CMP ECX,7FFFFFFF  <-- ECX 是 02625C9F , 比較兩值
00401537  PUSH EDI
00401538  JBE SHORT IDCRKME2. 00401540    <-- 小於或相等跳
-00401540 MOV DWORD PTR DS:[409770],ECX
00401546  CMP DWORD PTR DS:[409788],ECX    <-- 再用 ECX 值作比較 , 真可疑
0040154C  JNZ SHORT IDCRKME2.004015B1      <-- 不相等 , 所以會跳 (你會見到 , 再下兩行是"REGISTERED!"字串)
.
.
若上面不跳的話 , 會怎樣呢 ? 是否就會 "REGISTERED!" ?
想一下 , 程式將02625C9F 作比較 , 是否註冊碼 ?
輸入2625C9F作為 code , 倒 ! 不對
呵呵 , 但我一想 , 它要將我的 十進位轉做 十六進位 , 那我可將它的十六進位轉回十進位啊 ,
好 ! 2625C9F hex 是 40000671 dec , 再試 , 按"Check" ,  譁哈哈 (是內地的出名飲料 , 我愛喝 :-))
Congratulations !

整理:
Name:Freeplayer 
Group:Free 
Code:40000671

** 我為什麼會選用 OllyDBg ? 因為它有很多好處 (我覺得 :-P )
1, 用 Sice 的話 , 中斷多幾次之後 , 我的 internet connection 會斷 , 好多時我要連線幹活 , Sice 就總愛斷我連線 ...
2, GUI 介面 , 不再死氣沉沉
3, 很多資料都不用再 "d" 或者 "?" 就會顯示 , 尤其是 ASCII string
4, 最方面是可以程式與程式間來回 , 不受限制 , 我可以一邊看 tuts , 一邊動態追蹤 , 不明白再回到 tuts 看 , 看完再到程式處 trace , 酷 :-)

再補充關於 OllyDBg 的四個區域含意 :
左上角為主程式執行過程內碼
右上角為 Register 資料
左下角為記憶體資料
右下角為入棧出棧資料

其實我寫這篇的目的是因為好像找不到一篇"仿" Sice 般用OllyDBg動態追蹤的破文
平常在 Sice 的過程 , 怎樣用在 OllyDBg 呢 ?
OllyDBg 又怎樣可以像 Sice 般動態追蹤呢 ?
我嘗試用最詳細的方法顯示整個過程和要注意的地方 , 令不熟悉 OllyDBg 運作的朋友也能有個入門,
希望可以因此文而令多些高手出手 , 那就最好了 !

Toye 大哥 , 值得放在精華區吧 :-P

在此謝謝: WinDos2k , Fpc , Hume , 雲觀(Half) 和 論壇上的朋友 , 他們一直在 Cracking 上給了我很多寶貴意見 ! :-)

轉貼請不要修改任何內容 , 保持完整性 , 謝謝 !!

作者: Freeplayer
寫於: 2001年11月13日 4:45 PM

相關文章