快捷打开文件夹 V3.0破解过程

     日期:2005年3月3日   破解人:萝卜[pcg]
———————————————————————————————————————————


【软件名称】:快捷打开文件夹   软件版本:3.0
【软件大小】:511 KB
【下载地址】:
【软件简介】:一款不错的文件夹快速浏览工具,
【软件限制】:未注册只能使用30次
【破解声明】:初学Crack,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教!
【破解工具】:OLLYDBG 1.1 fly 汉化版 

———————————————————————————————————————————
 
【破解过程】:
先用PEID 0.92汉化增强版查壳,无壳,Borland C++
用od打开目标程序:Tbfof.exe ,然后查找字符,可以找到“注册失败”字样,双击来到cpu窗口,向上翻看可以找到这里:以下就是具体算法:
00406DEA   CALL TBFOF.0042862C
00406DEF   CMP DWORD PTR SS:[EBP-8],0            ;  比较用户名是否为0
00406DF3   JE SHORT TBFOF.00406DFA               ;  如果为0,跳走了,当然不能是0了
00406DF5   MOV EAX,DWORD PTR SS:[EBP-8]          ;  走到这里,把用户名赋值给eax
00406DF8   JMP SHORT TBFOF.00406DFF              ;  跳下面的call
00406DFA   MOV EAX,TBFOF.0045E507
00406DFF   CALL TBFOF.00447C50                   ;  这个call用来计算用户名的位数,存到eax
00406E04   MOV ESI,EAX                           ;  用户名位数赋值给esi
00406E06   DEC DWORD PTR SS:[EBP-28]
00406E09   LEA EAX,DWORD PTR SS:[EBP-8]
00406E0C   MOV EDX,2
00406E11   CALL TBFOF.0045ADF8
00406E16   TEST ESI,ESI                          ;  比较用户名位数是否为零,我们当然不为0向下跳
00406E18   JNZ SHORT TBFOF.00406E4F              ;  跳
00406E1A   MOV EAX,DWORD PTR DS:[4634EC]
00406E1F   PUSH 0
00406E21   MOV ECX,TBFOF.0045E519
00406E26   MOV EDX,TBFOF.0045E508
00406E2B   MOV EAX,DWORD PTR DS:[EAX]
00406E2D   CALL TBFOF.0045ACB0
00406E32   MOV EDX,DWORD PTR SS:[EBP-48]
00406E35   MOV EAX,DWORD PTR DS:[EDX+1F4]
00406E3B   MOV EDX,DWORD PTR DS:[EAX]
00406E3D   CALL DWORD PTR DS:[EDX+7C]
00406E40   MOV ECX,DWORD PTR SS:[EBP-44]
00406E43   MOV DWORD PTR FS:[0],ECX
00406E4A   JMP TBFOF.0040701F
00406E4F   XOR EDX,EDX
00406E51   LEA EAX,DWORD PTR SS:[EBP-9C]         ;  把用户名赋值eax
00406E57   CMP ESI,EDX                           ;  esi为用户名的长度
00406E59   JLE SHORT TBFOF.00406E67              ;  小于0则跳
00406E5B   /MOVSX ECX,BYTE PTR DS:[EAX]          ;  把用户名第i个字符的asc赋值给ecx
00406E5E   |ADD DWORD PTR SS:[EBP-4C],ECX        ;  上面的结果+到ebp-4c
00406E61   |INC EDX                              ;  计数器+1
00406E62   |INC EAX                              ;  eax+1
00406E63   |CMP ESI,EDX                          ;  比较edx是否大于用户名3
00406E65   \JG SHORT TBFOF.00406E5B              ;  跳回去继续取用户名的i+1位
00406E67   ADD DWORD PTR SS:[EBP-4C],7           ;  结果+7
00406E6B   /IMUL EBX,DWORD PTR SS:[EBP-4C]       ;  ebx*上面的结果(ebx初始值=1)
00406E6F   |CMP EBX,989680                       ;  比较ebx 和 989680
00406E75   \JL SHORT TBFOF.00406E6B              ;  小于就跳回去再乘用户名
00406E77   CMP EBX,5F5E100                       ;  比较上面的结果,是否小于等于5f5e100
00406E7D   JLE SHORT TBFOF.00406E93              ;  满足条件就向下跳
00406E7F   /MOV ECX,2                            ;  否则到这里 ecx=2.
00406E84   |MOV EAX,EBX                          ;  把上面计算的结果赋值给eax
00406E86   |CDQ                                  ;  字符扩展
00406E87   |IDIV ECX                             ;  eax除以ecx
00406E89   |MOV EBX,EAX                          ;  取商
00406E8B   |CMP EBX,5F5E100                      ;  比较ebx 是否大于5f5e100
00406E91   \JG SHORT TBFOF.00406E7F              ;  大于则跳回去重新计算
00406E93   XOR EAX,EAX                           ;  否则到这里,初始化eax(当然下面要用到了)
00406E95   LEA EDX,DWORD PTR SS:[EBP-10]
00406E98   MOV DWORD PTR SS:[EBP-10],EAX
00406E9B   MOV EAX,EBX                           ;  把计算结果赋值给eax,下面的call要用
00406E9D   INC DWORD PTR SS:[EBP-28]
00406EA0   CALL TBFOF.00447914
00406EA5   LEA EDX,DWORD PTR SS:[EBP-10]
00406EA8   XOR ECX,ECX
00406EAA   PUSH EDX
00406EAB   LEA EDX,DWORD PTR SS:[EBP-C]
00406EAE   MOV WORD PTR SS:[EBP-34],20
00406EB4   MOV DWORD PTR SS:[EBP-C],ECX
00406EB7   INC DWORD PTR SS:[EBP-28]
00406EBA   MOV EAX,DWORD PTR SS:[EBP-48]
00406EBD   MOV EAX,DWORD PTR DS:[EAX+200]
00406EC3   CALL TBFOF.0042862C                   ;  这个call 把注册码转换成10进制
00406EC8   LEA EAX,DWORD PTR SS:[EBP-C]
00406ECB   POP EDX
00406ECC   CALL TBFOF.0045AEC8                   ;  关键 call (真码和假码比较地方)
00406ED1   PUSH EAX
00406ED2   DEC DWORD PTR SS:[EBP-28]
00406ED5   LEA EAX,DWORD PTR SS:[EBP-C]
00406ED8   MOV EDX,2
00406EDD   CALL TBFOF.0045ADF8
00406EE2   DEC DWORD PTR SS:[EBP-28]             ; |
00406EE5   LEA EAX,DWORD PTR SS:[EBP-10]         ; |
00406EE8   MOV EDX,2                             ; |
00406EED   CALL TBFOF.0045ADF8                   ; \TBFOF.0045ADF8
00406EF2   POP ECX
00406EF3   TEST CL,CL
00406EF5   JE TBFOF.00406FDB                     ;  (关键比较,跳到错误地方)比较结果改成nop,但是打开软件还是显示未注册。



*********************************************************************
上面call调用此地:
0045AEC8   PUSH EBP
0045AEC9   MOV EBP,ESP
0045AECB   PUSH EBX
0045AECC   MOV EAX,DWORD PTR DS:[EAX]            ;  出现假码
0045AECE   MOV EDX,DWORD PTR DS:[EDX]            ;  出现真码(可以做内存注册机)
0045AED0   CALL TBFOF.0044F2A8
0045AED5   SETE AL
0045AED8   AND EAX,1
0045AEDB   POP EBX
0045AEDC   POP EBP
0045AEDD   RETN                                  :返回调用call

———————————————————————————————————————————

【Crack_总结】:

算法简单,希望大家不要笑啊。
用剑英兄的key make 1.73做了个注册机,为了大家学习key make 贴出源码:
.const

.data
szHomePage db "http://www.365hz.net",0
szEmail    db "mailto:ljyljx@163.com",0
szErrMess  db "输入的序列号不正确!",0


szBuff db 50 dup(0) ;保存转换后十进制字符。
szFormat db "%d",0  ;输出十进制字符格式
.code

mov ebx,eax
push eax
invoke lstrlen,ebx
mov esi,eax
mov ebx,1h
xor EDX,EDX
XOR EDI,EDI
pop eax
n1:
CMP ESI,EDX
JLE n2      
MOVSX ECX,BYTE PTR [EAX]
ADD EDI,ECX
INC EDX
INC EAX
CMP ESI,EDX                 
JG n1
n2:
ADD edi,7h
n3:
IMUL EBX,edi
CMP EBX,989680h
JL n3
CMP EBX,5F5E100h
JLE n5
n4:
MOV ECX,2h
MOV EAX,EBX
CDQ
IDIV ECX
MOV EBX,EAX
CMP EBX,5F5E100h
JG n4
n5:
invoke wsprintf,addr szBuff,addr szFormat,ebx
LEA EAX,szBuff