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