• 标 题:ollyDbg教程之一 
  • 作 者:lordor
  • 时 间: 2003/08/23 09:17am
  • 链 接:http://bbs.pediy.com

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