ollyDbg教程之一

看雪資料發表於2003-08-23

Alive Text to Speech V3.6.8.2註冊演算法分析

軟體大小:  11405 KB
軟體語言:  英文
軟體類別:  國外軟體 / 共享版 / 音訊轉換
應用平臺:  Win9x/NT/2000/XP
介面預覽:  無
加入時間:  2003-08-17 15:04:37
下載次數:  88
推薦等級:  

聯 系 人:  support@alivemedia.net  
開 發 商:  http://www.alivemedia.net/

軟體介紹:
   Alive Text to Speech 可以把 TXT 文字檔案直接轉換成 MP3、WAV、WMA、OGG 或 VOX 檔,有別於一般Text to Speech 軟體只能透過 TTS 朗讀的功能,支援 Command Line 指令、透過滑鼠右鍵選單也可以操作。
下載地址:http://www.skycn.net/soft/13508.html


目標:基本學會使用ollyDbg(ollyDbg下載地址:http://home.tonline.de/home/Ollydbg/)

近來時間太少了,本來想來幾個BT級的,可惜要花時間太多,還是先來點簡單一點的。
今天將使用32位程式級的偵錯程式--ollyDbg出馬,這個東東操作簡便,提示資訊量大,首先,為了讓新手有一初步瞭解,先介紹一個簡單的操作,

快捷鍵:
F3,裝入程式
F8,單步執行,不進入call
F7,單步執行,進入call
CTRL+F9,相當於trw2000的F12
ALT+F9,相關於trw2000的pmodule
F2,設定斷點(相當於trw2000的F9)

視窗:
左上:程式碼區
左下:記憶體資料
右上:暫存器
右下:stack區

先了解那麼多就可以了,先用fi301看一下,是用aspack加的殼,用aspackdie可以輕鬆脫殼。先執行一下程式,註冊時有提示,作了一些簡單瞭解後,程式用VC編寫,可以用MessageBoxA下斷,怎麼下斷呢?簡單的方法就是CTRL+n,在跳出的視窗中選擇Name為MessageBoxA的函式,右擊在彈出的選單中選擇fild references to import,在彈出的視窗中依次對其下斷。


來到這裡


0048E77F  PUSH 0
0048E781  PUSH 0
0048E783  PUSH 0
0048E785  PUSH EBX
0048E786  PUSH ESI
0048E787  MOV DWORD PTR SS:[EBP-8],ECX
0048E78A  MOV DWORD PTR SS:[EBP-4],EDX
0048E78D  MOV ESI,EAX
0048E78F  MOV EAX,DWORD PTR SS:[EBP-4]             ;  使用者名稱
0048E792  CALL unpacked.00404B80
0048E797  MOV EAX,DWORD PTR SS:[EBP-8]             ;  註冊碼
0048E79A  CALL unpacked.00404B80
0048E79F  XOR EAX,EAX
0048E7A1  PUSH EBP
0048E7A2  PUSH unpacked.0048E872
0048E7A7  PUSH DWORD PTR FS:[EAX]
0048E7AA  MOV DWORD PTR FS:[EAX],ESP
0048E7AD  XOR EBX,EBX
0048E7AF  MOV EDX,DWORD PTR SS:[EBP-4]             ;  使用者名稱
0048E7B2  MOV EAX,unpacked.0048E88C                ;  ASCII "appzplanet"
0048E7B7  CALL unpacked.00404CD4
0048E7BC  TEST EAX,EAX
0048E7BE  JLE SHORT unpacked.0048E7CB
0048E7C0  LEA EAX,DWORD PTR SS:[EBP-8]
0048E7C3  MOV EDX,DWORD PTR SS:[EBP-4]
0048E7C6  CALL unpacked.00404778
0048E7CB  LEA ECX,DWORD PTR SS:[EBP-C]
0048E7CE  MOV EDX,DWORD PTR SS:[EBP-4]
0048E7D1  MOV EAX,ESI
0048E7D3  CALL unpacked.0048E91C                   ;  產生真碼,F8進入
0048E7D8  MOV EDX,DWORD PTR SS:[EBP-C]             ;  真碼入edx
0048E7DB  MOV EAX,DWORD PTR SS:[EBP-8]             ;  假碼入eax
0048E7DE  CALL unpacked.00408AA4                   ;  關鍵比較
0048E7E3  TEST EAX,EAX
0048E7E5  JNZ SHORT unpacked.0048E828              ;  關鍵跳轉
0048E7E7  MOV EDX,DWORD PTR SS:[EBP-4]
0048E7EA  MOV EAX,ESI
0048E7EC  CALL unpacked.0048DBC4
0048E7F1  TEST AL,AL
0048E7F3  JE SHORT unpacked.0048E857
0048E7F5  MOV BL,1
0048E7F7  PUSH 40
0048E7F9  LEA EDX,DWORD PTR SS:[EBP-10]
0048E7FC  MOV EAX,DWORD PTR DS:[4C2000]
0048E801  MOV EAX,DWORD PTR DS:[EAX]
0048E803  CALL unpacked.00467F24
0048E808  MOV EAX,DWORD PTR SS:[EBP-10]
0048E80B  CALL unpacked.00404B90
0048E810  PUSH EAX                                 ; |Title
0048E811  PUSH unpacked.0048E898                   ; |Text = "Registration success, Thanks for

your registration."
0048E816  MOV EAX,DWORD PTR DS:[4C2000]            ; |
0048E81B  MOV EAX,DWORD PTR DS:[EAX]               ; |
0048E81D  MOV EAX,DWORD PTR DS:[EAX+30]            ; |
0048E820  PUSH EAX                                 ; |hOwner
0048E821  CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
0048E826  JMP SHORT unpacked.0048E857
0048E828  PUSH 10
0048E82A  LEA EDX,DWORD PTR SS:[EBP-14]
0048E82D  MOV EAX,DWORD PTR DS:[4C2000]
0048E832  MOV EAX,DWORD PTR DS:[EAX]
0048E834  CALL unpacked.00467F24
0048E839  MOV EAX,DWORD PTR SS:[EBP-14]
0048E83C  CALL unpacked.00404B90
0048E841  PUSH EAX                                 ; |Title
0048E842  PUSH unpacked.0048E8CC                   ; |Text = "Invalid Registration Code!
   Please enter an available Registration Code."
0048E847  MOV EAX,DWORD PTR DS:[4C2000]            ; |
0048E84C  MOV EAX,DWORD PTR DS:[EAX]               ; |
0048E84E  MOV EAX,DWORD PTR DS:[EAX+30]            ; |
0048E851  PUSH EAX                                 ; |hOwner
0048E852  CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
0048E857  XOR EAX,EAX
0048E859  POP EDX


------------------------------------
進入上面的call

0048E939  MOV EAX,DWORD PTR SS:[EBP-4]
0048E93C  CALL unpacked.00404B80
0048E941  XOR EAX,EAX
0048E943  PUSH EBP
0048E944  PUSH unpacked.0048EA77
0048E949  PUSH DWORD PTR FS:[EAX]
0048E94C  MOV DWORD PTR FS:[EAX],ESP
0048E94F  LEA EAX,DWORD PTR SS:[EBP-4]
0048E952  MOV EDX,unpacked.0048EA90                ;  ASCII "T7e6xtS9p2e"
0048E957  CALL unpacked.004049A0                   ;  接成lordorT7e6xtS9p2e
0048E95C  MOV EAX,DWORD PTR SS:[EBP-4]
0048E95F  CALL unpacked.00404998                   ;  長度
0048E964  MOV ESI,EAX                              ;  esi為長度
0048E966  SAR ESI,1                                ;  長度右移一位
0048E968  JNS SHORT unpacked.0048E96D
0048E96A  ADC ESI,0
0048E96D  LEA EAX,DWORD PTR SS:[EBP-10]
0048E970  PUSH EAX
0048E971  MOV ECX,ESI
0048E973  MOV EDX,1
0048E978  MOV EAX,DWORD PTR SS:[EBP-4]             ;  串:lordorT7e6xtS9p2e
0048E97B  CALL unpacked.00404BF0                   ;  從串第一位開始,取esi位,此為lordorT7
0048E980  MOV EAX,DWORD PTR SS:[EBP-10]            ;  取得的8位lordorT7
0048E983  PUSH EAX
0048E984  LEA EAX,DWORD PTR SS:[EBP-14]
0048E987  PUSH EAX
0048E988  MOV EAX,DWORD PTR SS:[EBP-4]             ;  串:lordorT7e6xtS9p2e
0048E98B  CALL unpacked.00404998                   ;  長度
0048E990  MOV ECX,EAX
0048E992  LEA EDX,DWORD PTR DS:[ESI+1]
0048E995  MOV EAX,DWORD PTR SS:[EBP-4]             ;  串:lordorT7e6xtS9p2e
0048E998  CALL unpacked.00404BF0                   ;  取餘下的串值 ,此為e6xtS9p2e
0048E99D  MOV EDX,DWORD PTR SS:[EBP-14]            ;  e6xtS9p2e入edx
0048E9A0  LEA EAX,DWORD PTR SS:[EBP-4]
0048E9A3  POP ECX                                  ;  串1:lordorT7
0048E9A4  CALL unpacked.004049E4                   ;  串1放在後面,串2放在前面:e6xtS9p2elordorT7
0048E9A9  LEA EAX,DWORD PTR SS:[EBP-8]
0048E9AC  PUSH EAX
0048E9AD  MOV ECX,0A
0048E9B2  MOV EDX,1
0048E9B7  MOV EAX,DWORD PTR SS:[EBP-4]             ;  串:e6xtS9p2elordorT7
0048E9BA  CALL unpacked.00404BF0                   ;  從第1位開始,取10位,此為e6xtS9p2el
0048E9BF  LEA EAX,DWORD PTR SS:[EBP-C]
0048E9C2  PUSH EAX
0048E9C3  MOV EAX,DWORD PTR SS:[EBP-4]             ;  串:e6xtS9p2elordorT7
0048E9C6  CALL unpacked.00404998                   ;  長度
0048E9CB  MOV ECX,EAX
0048E9CD  MOV EDX,6
0048E9D2  MOV EAX,DWORD PTR SS:[EBP-4]             ;  串:e6xtS9p2elordorT7
0048E9D5  CALL unpacked.00404BF0                   ;  從第6位開始,取餘下的位,此為9p2elordorT7
0048E9DA  CMP DWORD PTR SS:[EBP-C],0
0048E9DE  JNZ SHORT unpacked.0048E9F0
0048E9E0  LEA EAX,DWORD PTR SS:[EBP-C]
0048E9E3  MOV EDX,unpacked.0048EA90                ;  ASCII "T7e6xtS9p2e"
0048E9E8  MOV ECX,DWORD PTR SS:[EBP-8]
0048E9EB  CALL unpacked.004049E4
0048E9F0  PUSH EBX
0048E9F1  MOV ECX,DWORD PTR SS:[EBP-C]             ;  串1:9p2elordorT7
0048E9F4  MOV EDX,DWORD PTR SS:[EBP-8]             ;  串2:e6xtS9p2el
0048E9F7  MOV EAX,EDI
0048E9F9  CALL unpacked.0048DA74                   ;  關鍵,進入
0048E9FE  LEA EAX,DWORD PTR SS:[EBP-18]
0048EA01  PUSH EAX
0048EA02  MOV EAX,DWORD PTR DS:[EBX]               ;  串:1005FE56C85B48280D653CD
0048EA04  MOV ECX,5
0048EA09  MOV EDX,1
0048EA0E  CALL unpacked.00404BF0                   ;  從第1位開始,取5位
0048EA13  PUSH DWORD PTR SS:[EBP-18]
0048EA16  PUSH unpacked.0048EAA4
0048EA1B  LEA EAX,DWORD PTR SS:[EBP-1C]
0048EA1E  PUSH EAX
0048EA1F  MOV EAX,DWORD PTR DS:[EBX]
0048EA21  MOV ECX,5
0048EA26  MOV EDX,6
0048EA2B  CALL unpacked.00404BF0                   ;  第6位開始,取5位
0048EA30  PUSH DWORD PTR SS:[EBP-1C]
0048EA33  PUSH unpacked.0048EAA4
0048EA38  LEA EAX,DWORD PTR SS:[EBP-20]
0048EA3B  PUSH EAX
0048EA3C  MOV EAX,DWORD PTR DS:[EBX]
0048EA3E  MOV ECX,5
0048EA43  MOV EDX,0B
0048EA48  CALL unpacked.00404BF0                   ;  從第11位開始,取5位
0048EA4D  PUSH DWORD PTR SS:[EBP-20]
0048EA50  MOV EAX,EBX
0048EA52  MOV EDX,5
0048EA57  CALL unpacked.00404A58                   ;  
0048EA5C  XOR EAX,EAX                              ;  unpacked.0048EA5C
0048EA5E  POP EDX
0048EA5F  POP ECX
0048EA60  POP ECX
0048EA61  MOV DWORD PTR FS:[EAX],EDX
0048EA64  PUSH unpacked.0048EA7E
0048EA69  LEA EAX,DWORD PTR SS:[EBP-20]
0048EA6C  MOV EDX,8
0048EA71  CALL unpacked.00404704
0048EA76  RETN
0048EA77  JMP unpacked.00404064

-----------------------------
再次進入0048E9F9  CALL unpacked.0048DA74處的call

0048DA9E  PUSH unpacked.0048DB90
0048DAA3  PUSH DWORD PTR FS:[EAX]
0048DAA6  MOV DWORD PTR FS:[EAX],ESP
0048DAA9  MOV EAX,DWORD PTR SS:[EBP-8]
0048DAAC  CALL unpacked.00404998
0048DAB1  MOV DWORD PTR SS:[EBP-C],EAX
0048DAB4  CMP DWORD PTR SS:[EBP-C],0
0048DAB8  JNZ SHORT unpacked.0048DAC7
0048DABA  LEA EAX,DWORD PTR SS:[EBP-8]
0048DABD  MOV EDX,unpacked.0048DBA8                ;  ASCII "Think Space"
0048DAC2  CALL unpacked.00404778                   ;  長度
0048DAC7  XOR ESI,ESI
0048DAC9  MOV EBX,100
0048DACE  LEA EAX,DWORD PTR SS:[EBP-10]
0048DAD1  PUSH EAX                                 ; /Arg1
0048DAD2  MOV DWORD PTR SS:[EBP-1C],100            ; |
0048DAD9  MOV BYTE PTR SS:[EBP-18],0               ; |
0048DADD  LEA EDX,DWORD PTR SS:[EBP-1C]            ; |
0048DAE0  XOR ECX,ECX                              ; |
0048DAE2  MOV EAX,unpacked.0048DBBC                ; |ASCII "%1.2x"
0048DAE7  CALL unpacked.00409E4C                   ; \unpacked.00409E4C
0048DAEC  MOV EAX,DWORD PTR SS:[EBP-4]             ;  上面產生100(H)
0048DAEF  CALL unpacked.00404998
0048DAF4  MOV EDI,EAX
0048DAF6  TEST EDI,EDI
0048DAF8  JLE SHORT unpacked.0048DB5A
0048DAFA  MOV DWORD PTR SS:[EBP-14],1
0048DB01  /MOV EAX,DWORD PTR SS:[EBP-4]            ;  串1入eax
0048DB04  |MOV EDX,DWORD PTR SS:[EBP-14]           ;  計數器
0048DB07  |MOVZX EAX,BYTE PTR DS:[EAX+EDX-1]       ;  串1各位依次入eax
0048DB0C  |ADD EAX,EBX                             ;  eax=eax+ebx
0048DB0E  |MOV ECX,0FF
0048DB13  |CDQ
0048DB14  |IDIV ECX                                ;  即為取FF的模
0048DB16  |MOV EBX,EDX                             ;  餘數入ebx
0048DB18  |CMP ESI,DWORD PTR SS:[EBP-C]
0048DB1B  |JGE SHORT unpacked.0048DB20
0048DB1D  |INC ESI
0048DB1E  |JMP SHORT unpacked.0048DB25
0048DB20  |MOV ESI,1
0048DB25  |MOV EAX,DWORD PTR SS:[EBP-8]            ;  串2入 eax
0048DB28  |MOVZX EAX,BYTE PTR DS:[EAX+ESI-1]       ;  串2位次入eax
0048DB2D  |XOR EBX,EAX                             ;  ebx=ebx xor eax
0048DB2F  |LEA EAX,DWORD PTR SS:[EBP-20]
0048DB32  |PUSH EAX                                ; /Arg1
0048DB33  |MOV DWORD PTR SS:[EBP-1C],EBX           ; |
0048DB36  |MOV BYTE PTR SS:[EBP-18],0              ; |
0048DB3A  |LEA EDX,DWORD PTR SS:[EBP-1C]           ; |
0048DB3D  |XOR ECX,ECX                             ; |
0048DB3F  |MOV EAX,unpacked.0048DBBC               ; |ASCII "%1.2x"
0048DB44  |CALL unpacked.00409E4C                  ; \unpacked.00409E4C
0048DB49  |MOV EDX,DWORD PTR SS:[EBP-20]           ;  把ebx轉換為十六進位制
0048DB4C  |LEA EAX,DWORD PTR SS:[EBP-10]
0048DB4F  |CALL unpacked.004049A0                  ;  各位接起來
0048DB54  |INC DWORD PTR SS:[EBP-14]
0048DB57  |DEC EDI
0048DB58  \JNZ SHORT unpacked.0048DB01
0048DB5A  MOV EAX,DWORD PTR SS:[EBP+8]
0048DB5D  MOV EDX,DWORD PTR SS:[EBP-10]
0048DB60  CALL unpacked.00404734
0048DB65  XOR EAX,EAX
0048DB67  POP EDX
0048DB68  POP ECX
0048DB69  POP ECX
0048DB6A  MOV DWORD PTR FS:[EAX],EDX


總結:
--------------
反推:
使用者名稱加在串“T7e6xtS9p2e”前面,形成串S:lordorT7e6xtS9p2e,串S按其長度除2分為兩子串:串S1:lordorT7,串S2:e6xtS9p2e,然後串S2放在前面,串S1放在後面,形成e6xtS9p2elordorT7,對其串再取兩子串:第1位開始取10位, 即為串1:e6xtS9p2el,第6位開始,取餘下位,即為串2:9p2elordorT7先設ebx=100(H),取串1的第1位HEX值,取(100+第1位HEX)的FF模,得A值,設為ebx=A,取對應位的串2的HEX值B,ebx=ebx xor B,此ebx(H)轉換為字串,即為兩位註冊碼,如此繼續。最後從生成的串中取前面15位,形成
XXXXX-XXXXX-XXXXX,此即為註冊碼。

比較簡單的程式,有空再補上序號產生器(keymake的就不做了)。下一篇,將介紹ollyDbg高階斷點技術。


一個可用的註冊碼:

使用者名稱:lordor
註冊碼:1005F-E56C8-5B482


cracked by lordor
03.8.22


相關文章