翻譯的第三篇,軟體演算法和 OllyDB的用法(新的除錯軟體) (10千字)

看雪資料發表於2001-07-19

原著:Hoof Arted

譯者:TAE![CCG]

唉,這篇翻譯的實在是太爛了,大家就看看如何使用新的除錯工具 OllyDB 吧。

新手教程 by Hoof Arted (Hoof's Workshop)


教程 - ;破解並且做 DLLShow by Software By Design 的序號產生器(奇怪,這篇好像沒有序號產生器)


目標 : DLLShow V4.6 - http://www.gregorybraun.com/

工具 : OllyDBG.exe - http://www.suddendischarge.com


這是我的第一片教程,我希望有時間寫更多的,我是一個破解新手,搞破解已經花了我
太多的時間了,但我仍然有很長的路要走,我盡力使這篇文章通俗易懂,我認為只有在
你熟悉目標軟體的情況下,你才可以破解它,我將開始描述調我們這課需要的試產品。

我不是一個好的 SoftIce 迷,光是熟悉指令和安裝就花了我許多時間,我也很喜歡使用
W32dasm 但我儘管使用它在許多場合有很多限制。我升級到Windows2000後,竟然執行不
了32dasm 了,我想找一個和它相同的除錯/反編譯軟體,如果要比 w32dasm 更強大的,
那我就已經找到了,它就是 Ollydbg,做這是:Oleh Yuschuk,這是給像我一樣已經等了
很久的人的一個工具,會使用 w32dasm 的你,你也將會掌握它的。

一個偉大的工作即將開始。

幹掉它,跟我來吧,做我所作的,並且我盡我所能的解釋給你聽。

我選擇這個目標的原因是它沒有一個好用的解除安裝程式,許多程式設計師小販都不把他們的軟體
做的很友好:(

讓我們開始吧!

到我上面寫的那個網站下載一個目標程式。解壓縮並且安裝它,執行 DLLShow 並且選擇
註冊選項。你將看見軟體需要輸入名字,公司和註冊碼,我們現在已經可以大致確定這是
一個根據姓名和公司名來生成註冊碼的軟體,這也是破解過程中的一個進展。我們要找出
密碼,並且看它使如何產生的。

好的,現在我們要輸入註冊碼但我們根本沒有正確的註冊碼,開啟 Ollydbg 並且用它開啟
軟體(DLLShow.exe)。預設的,你將看見4段不同用處的除錯視窗,左上角的用於顯示反編
譯程式碼,右上角的用於顯示暫存器資料這是非常有用的,不像softice,你想檢視暫存器中
有疑問的地址,那麼這個偵錯程式顯示地址的內容,如果程式使ascii碼值(姓名或註冊碼:),
都將顯示它並且你不需要轉換。(這段翻譯的有些難懂,我也很難理解原文)

左下角,顯示當前所載入的軟體資料在記憶體中的位置,這對找出資料很有幫助,你將待會兒
將看見我是如何利用它的,右下角顯示被各種函式所使用的記憶體,我也是初學者,也不知道
這個視窗的所有用處,但是現在,我們並不需要知道。

那好,用偵錯程式載入程式,我們需要執行它。選擇"Deebug" 並且點選"Run"或按 F9。軟體
將像平時一樣執行。去註冊視窗並且輸入名字,公司和註冊碼我輸入的是:

NAME : Hoof Arted
COMPANY : Hoof's Workshop
SERIAL : 77777777

你現在可以是用任何數字作註冊碼,我喜歡7,而且保持在8個字元,這將是我幹得快些,(他
們說7是幸運數字!)

我們知道如果我們點選 “OK”按鈕,軟體將會彈出一個“愚蠢破解者”的視窗,我們需要知道在
哪裡設定斷點,我喜歡首先試著用 GetDlgItemTextA ,在 Ollydbg 中設定斷點有一些不同,
因為查詢函式不像你希望的那樣工作,右擊左上角的視窗,並且選擇 “Search for NAME (LABEL)”
這將出現一個帶有許多軟體所使用的函式的小視窗,向下拉動滑動條到了USER32.GetDlgItemTextA
並且使它處於高亮狀態,右擊它選擇"Find references to import",;另一個視窗開啟了,顯示
著軟體呼叫函式的地址,透過按F2在每一個上面都設定一個斷點,然後他的左邊就會變成紅色,
如果有任何地方呼叫這裡都會被偵錯程式所暫停。

好的,現在單擊目標軟體的“OK”按鈕。偵錯程式將停在地址 4159FB 這裡,我們不關心函式
GetDlgItem function 是如何執行的,所以我們點選地址 4159FB 並且按 F2 來清除斷點,然後,
選擇下一行再按 F2 來恢復斷點。按 F9 來執行軟體以透過這個地方,它再次被停下來了,我們
可以看見 ESI 暫存器(右上角) 現在有一個Ascii碼"Hoof Arted",真不錯!它現在得到我們的
名字了,如果我們再次按 F9,目標軟體將再次停在相同的斷點,但是這次,ESI 已經是我們的
公司名了,是一個 ASCII。按 F9 第三次 Esi 將顯示我們輸入的註冊碼。好,現在我們知道程式
已經得到我們所有的資訊了。它將要用這些資訊作什麼呢?

因為它已經得到了我們輸入的所有資訊了,我們需要從這兒將它帶到軟體中,我們不能再按F9執行,
因為要找到我們想要得到的東西,所以我們按 F7 來一步步的執行,直到你到了以下程式碼處 :

0040D717  |. 8D4C24 40      LEA    ECX,DWORD PTR SS:[ESP+40]      <<<<<<<<
0040D71B  |. 51            PUSH    ECX
0040D71C  |. E8 25990000    CALL    DLLShow.00417046    <<<<<<< Call (a)
0040D721  |. 56            PUSH    ESI
0040D722  |. 8BD8          MOV    EBX,EAX
0040D724  |. E8 37820000    CALL    DLLShow.00415960    <<<<<<< Call (b)
0040D729  |. 83C4 38        ADD    ESP,38
0040D72C  |. 3D 92A71901    CMP    EAX,119A792
0040D731  |.,75 18          JNZ    SHORT DLLShow.0040D74B

現在,如果你進入了第一個Call (Call A) 你將看見它對我們的註冊碼做了些社那麼,我們對
暫時不關心這個,設定斷點在 0040D721 並按 F9,當我們停在下一行的時候,我們可以看看寄
存器 EAX ,我的顯示為 04A2CB71,這個數的十進位制是什麼?用計算器算一下看看,這是我們
輸入的假註冊碼!call A 是將我們的假註冊碼轉換為16進位制, Hmmmm...有趣,可能下一個call
就是計算正確註冊碼的地方了,按 F7 進入 call 然後停一停,有些東西我需要解釋給你聽。

正如你所看到的,函式被顯示在下面:

00415960  /$ 51            PUSH    ECX                              ; 
DLLShow.00426006
00415961  |. 53            PUSH    EBX
00415962  |. 8B5C24 0C      MOV    EBX,DWORD PTR SS:[ESP+C]
00415966  |. 56            PUSH    ESI
00415967  |. 33F6          XOR    ESI,ESI
00415969  |. 53            PUSH    EBX                              ; /Length Of Name
0041596A  |. 897424 0C      MOV    DWORD PTR SS:[ESP+C],ESI        ; |
0041596E  |. FF15 B4E04100  CALL    DWORD PTR DS:[<&KERNEL32.lstrlen>; \lstrlenA
00415974  |. 85DB          TEST    EBX,EBX
00415976  |.,74 4F          JE      SHORT DLLShow.004159C7
00415978  |. 85C0          TEST    EAX,EAX
0041597A  |.,74 4B          JE      SHORT DLLShow.004159C7
0041597C  |. 33D2          XOR    EDX,EDX
0041597E  |. 85C0          TEST    EAX,EAX
00415980  |.,7E 45          JLE    SHORT DLLShow.004159C7
00415982  |. 55            PUSH    EBP
00415983  |. 57            PUSH    EDI
00415984  |. BE 183E4200    MOV    ESI,DLLShow.00423E18      ;ASCII"|b!pz*ls;rn|lf$vi^Axpe)rx5aic&9/2m5lsi4@0dmZw94cmqpfhw"     
00415989  |. BF 01000000    MOV    EDI,1
0041598E  |. 2BF3          SUB    ESI,EBX
00415990  |. 8BCB          MOV    ECX,EBX                          ;
00415992  |. 2BFB          SUB    EDI,EBX
00415994  |> 0FBE1C0E      MOVSX  EBX,BYTE PTR DS:[ESI+ECX]        ;  將上面的Ascii依次移動到EBX
00415998  |. 0FBEAC10 E03D4>MOVSX  EBP,BYTE PTR DS:[EAX+EDX+423DE0] ;  chr(423DE0 + Len + Pos) 放入 EBP
004159A0  |. 0FAFDD        IMUL    EBX,EBP                          ;  相乘
004159A3  |. 8D2C0F        LEA    EBP,DWORD PTR DS:[EDI+ECX]
004159A6  |. 0FAFDD        IMUL    EBX,EBP                          ;  相乘結果再乘位數
004159A9  |. 0FBE29        MOVSX  EBP,BYTE PTR DS:[ECX]            ;  移動名字的字元到EBP
004159AC  |. 0FAFDD        IMUL    EBX,EBP                          ;  相乘結果再乘以名字字元
004159AF  |. 8B6C24 10      MOV    EBP,DWORD PTR SS:[ESP+10]        ; 
004159B3  |. 03EB          ADD    EBP,EBX                          ;  累加
004159B5  |. 42            INC    EDX                              ;  下一個字元
004159B6  |. 41            INC    ECX
004159B7  |. 3BD0          CMP    EDX,EAX                          ;  名字結束了嗎?
004159B9  |. 896C24 10      MOV    DWORD PTR SS:[ESP+10],EBP        ;  存入[ESP+10]
004159BD  |.^7C D5          JL      SHORT DLLShow.00415994          ;  跳轉,形成迴圈
004159BF  |. 8BC5          MOV    EAX,EBP                          ; 
004159C1  |. 5F            POP    EDI
004159C2  |. 5D            POP    EBP
004159C3  |. 5E            POP    ESI
004159C4  |. 5B            POP    EBX
004159C5  |. 59            POP    ECX
004159C6  |. C3            RETN

Ollydbg做的比較好的就是他可以給語句新增註釋,你還可以隨時更改這些註釋,我還
從沒有看見其他的偵錯程式可以做到這一點(譯者:TRW不就可以?)你只需要對著語句
點選右鍵然後選擇“Comment”即可,那很簡單。這樣你就不需要把重要的地方記在紙
上了。

好,我們看見那個函式檢查了名字的個數(0041596E),然後它就移動下面的 ascii:
"|b!pz*ls;rn|lf$vi^Axpe)rx5aic&9/2m5lsi4@0dmZw94cmqpfhw" (00415984)放進了內
存。那麼,這所有的動作說明了什麼呢?好的,如果我們熟悉它的話,就會發現它移動
我們上面所說的每個字元一個一個的放入EBX。EBP中的值就是從地址 423de0 + (我們
名字的個數) + (字元的位置)。但是,423de0 裡面又是什麼呢?讓我們把它找出來,
右擊左下部的並且選擇要去的地址,輸入 423de0 然後單擊“OK”,你將看到以下片斷:

00423DE0  23 73 65 72 42 26 6E 7A 7C 6D 66 4D 31 2F 35 28  #serB&nz|mfM1/5(
00423DF0  21 73 64 24 4D 71 2E 7B 73 5D 2B 73 46 6A 74 4B  !sd$Mq.{s]+sFjtK
00423E00  70 7A 53 64 74 7A 6F 58 71 6D 62 5E 41 6C 40 64  pzSdtzoXqmb^Al@d
00423E10  76 3A 73 3F 78 2F 00 00 7C 62 21 70 7A 2A 6C 73  v:s?x/..|b!pz*ls
00423E20  3B 72 6E 7C 6C 66 24 76 69 5E 41 78 70 65 29 72  ;rn|lf$vi^Axpe)r
00423E30  78 35 61 69 63 26 39 2F 32 6D 35 6C 73 69 34 40  x5aic&9/2m5lsi4@
00423E40  30 64 6D 5A 77 39 34 63 6D 71 70 66 68 77        0dmZw94cmqpfhw

這是有用程式碼的第二段,下一行乘以兩個值,我這裡是“66”和“7C”,它然後它乘
以總數,用名字的位數1 (H)、2(o).... 它然後用名字的第一個字元和乘積,在我這兒
是48 (H),然後所有的數都這樣,我得總數是1E159AD,繼續按F7直到呢到達以下片斷:

00415400  /$ 8B4424 04      MOV    EAX,DWORD PTR SS:[ESP+4]
00415404  |. 56            PUSH    ESI
00415405  |. 8B35 84C34200  MOV    ESI,DWORD PTR DS:[42C384]        ; 
DB95DB95 = Hardcoded
0041540B  |. 50            PUSH    EAX
0041540C  |. 81CE 78030000  OR      ESI,378                          ;  Or
with 378 = DB95DBFD
00415412  |. E8 49050000    CALL    DLLShow.00415960
00415417  |. 8B4C24 10      MOV    ECX,DWORD PTR SS:[ESP+10]
0041541B  |. 03F0          ADD    ESI,EAX                          ;  Add
Name total and Co total to DB95DBFD
0041541D  |. 51            PUSH    ECX
0041541E  |. E8 3D050000    CALL    DLLShow.00415960
00415423  |. 83C4 08        ADD    ESP,8
00415426  |. 03C6          ADD    EAX,ESI                          ; 
Total = E2F7A8AE
00415428  |. 5E            POP    ESI

這是在幹什麼呢?它帶著你的總數,並且加上它的 hardcoded,(DB95DB95 OR 378) = DB95DBFD
整個計算此數過程以公司名重複的,兩個總和的地址指向 E2F7A8AE 這個數,做的所有事情就是轉化
成十進位制數。這個數就是註冊碼了!

按 F9 直到得到錯誤訊息並且輸入一個新的註冊碼,就是他!!! 你已經破解它了。

現在我們知道註冊碼被生產了,你可以做一個屬於你自己的序號產生器了,我已經破解這個公司出的許
多軟體了,因為他們是很懶惰的。他們使用同一種演算法,僅僅是換個ID"DB95DB95".


我希望你能從這個教程中學到一些關於 Ollydbg 的使用方法,這是一個新的除錯軟體。


Hoof Arted (Hoof's Workshop) "Go forth and KICK ass!"

h_arted@hotmail.com

相關文章