• 标 题:豪杰屏幕录像机 V2.0.1 注册算法分析
  • 作 者:txm123
  • 时 间:2003年12月15日 02:00
  • 链 接:http://bbs.pediy.com

破解作者
         yzez[DFCG][BCG][FCG]
破解对象
         豪杰屏幕录像机 V2.0.1
软件介绍
豪杰屏幕录像机 V2.0.1 

软件大小:  2123 KB
软件语言:  简体中文
软件类别:  国产软件 / 共享版 / 图像捕捉
应用平台:  Win9x/NT/2000/XP
界面预览:  无
加入时间:  2003-12-14 15:54:16
下载次数:  10930
推荐等级:  
 
    “课件制作”的全新突破,跟踪录制屏幕上所有区域的动作和键盘、鼠标的声音,可保存为EXE,AVI
,GIF和HSR格式,编码速度快,高保真,也常被应用进行计算机监控管理。 
录制/保存/播放功能 可以录制全屏幕,活动窗口,固定区域,指定区域的屏幕动作,包括鼠标的声音和
键盘的声音,然后保存为EXE,AVI,GIF,HSR四种格式,保存完后可以进行播放。
后期编辑功能 可以对HSR格式的文件进行后期的编辑,编辑内容包括对文件每一帧添加图板说明,删除帧
,添加声音,合并两个以上的HSR文件。
设置功能 可以在录制过程中设置是否要添加时间显示,添加标题,添加图板说明,鼠标是否显示以及显
示形式,对视音频编码的设置,快捷键设置等。
浮动窗口的切换 可以在原始窗口和浮动窗口之间进行切换,方便操作。

下载地址:
         http://www.skycn.com/soft/12856.html
破解目的
         不为破解而破解,只为技术而破解!
破解工具
        OLLYDBG1.09 
破解过程 
    无壳,反汇编找不到有用信息,我倒!打开豪杰屏幕录像机,我输入用户名:yzez,试验码:1234-56
78-9009-8765,当然是注册失败了,不用管它,直接退出程序。第二步用OD载入程序,下断:BPX Messag
eboxA,按N次F9和F2后,直到我们看到输入的用户名为止。看下面:
00413C01  CALL    DWORD PTR DS:[<&KERNEL32.lstrlen>****在这里开始出现用户名,所以我们停止F9,改按F8!
00413C07  MOV     EBXEAX*****************************EAX存放用户名的位数,这里是4位,移入EBX中
00413C09  CMP     EBX, 200*****************************比较EBX与200
00413C0F  JBE     SHORT Coursewa.00413C23**************低于就跳!
00413C11  MOV     ECX, 80
00413C16  LEA     EDIDWORD PTR SS:[ESP+10]
00413C1A  MOV     EBX, 200
00413C1F  REP     MOVS DWORD PTR ES:[EDI], DWORD P>
00413C21  JMP     SHORT Coursewa.00413C2F
00413C23  LEA     EAXDWORD PTR SS:[ESP+10]***********跳到这里!
00413C27  PUSH    ESI   String2 = "yzez"***************用户名入栈
00413C28  PUSH    EAX                              ; |String1 = NULL
00413C29  CALL    DWORD PTR DS:[<&KERNEL32.lstrcpy>; lstrcpyA
00413C2F  MOV     EAXEBX ****************************再把用户名的位数移入EAX   
00413C31  CDQ******************************************EDX清0
00413C32  AND     EDX, 3*******************************与运算!
00413C35  ADD     EAXEDX*****************************EAX=4+0=4
00413C37  MOV     EDIEAX*****************************值移入EDI
00413C39  SAR     EDI, 2*******************************右移两位,EDI的值是1
00413C3C  TEST    BL, 3********************************位数与3比较
00413C3F  JE      SHORT Coursewa.00413C42**************相等则跳!
00413C41  INC     EDI**********************************EDI加1
00413C42  XOR     ECXECX*****************************ECX清0
00413C44  TEST    EBXEBX*****************************测试EBX的值!
00413C46  JLE     SHORT Coursewa.00413C5F**************小于等于就跳
00413C48  MOV     DLBYTE PTR SS:[ESP+ECX+10]*********用户名的第一位y的ASCII码值79移入DL
00413C4C  PUSH    EDX  
00413C4D  PUSH    ECX                             
00413C4E  CALL    Coursewa.00413BC0 *******************算法CALL(1),按F7跟进!代码直接贴在下面!
======================================================================================
算法CALL(1)的代码:
00413BC0  PUSH    EBP
00413BC1  MOV     EBPESP
00413BC3  PUSH    EBX
00413BC4  MOV     ALBYTE PTR SS:[EBP+8]***赋AL的初始值是0
00413BC7  MOV     BLBYTE PTR SS:[EBP+C]***y的ASCII码值79移入BL
00413BCA  TEST    BL, 0C3*******************与0C3比较!
00413BCD  JPE     SHORT Coursewa.00413BD0***为偶转移!
00413BCF  STC
00413BD0  RCR     BL, 1*********************带进位右循环移位指令,右移1位,结果是:3C
00413BD2  DEC     AL************************AL减1
00413BD4  JNZ     SHORT Coursewa.00413BCA***循环!
00413BD6  MOV     BYTE PTR SS:[EBP+C], BL***最后 的结果:3C保存!
00413BD9  MOV     ALBYTE PTR SS:[EBP+C]****再把结果移入AL
00413BDC  POP     EBX                              ;  Coursewa.00413C53
00413BDD  POP     EBP                              ;  Coursewa.00413C53
00413BDE  RETN*******************************返回!
===========================================================================================
00413C53  ADD     ESP, 8
00413C56  MOV     BYTE PTR SS:[ESP+ECX+10], AL**把上述运算的结果3C保存
00413C5A  INC     ECX***************************ECX加1
00413C5B  CMP     ECXEBX**********************ECX与EBX比较!                       
00413C5D  JL      SHORT Coursewa.00413C48*******小于就跳回,循环,循环结束后得到一组值:3C、3D、99、4F
00413C5F  XOR     ESIESI**********************ESI清0
00413C61  TEST    EDIEDI**********************测试EDI的值,EDI的值是1
00413C63  JLE     SHORT Coursewa.00413C81*******小于等于就跳!
00413C65  MOV     EBXDWORD PTR SS:[ESP+ESI*4+10>**把上面运算得到的值倒过来,连接起来就是:4F993D3C移入EBX
00413C69  MOV     EAXESI*************************赋EAX的初始值为0
00413C6B  AND     EAX, 1F
00413C6E  ADD     EBPEBX*************************EBP的初始值是0,EBP=0+4F993D3C                      
00413C70  PUSH    EAX
00413C71  PUSH    EBP
00413C72  CALL    Coursewa.00413C90
00413C77  ADD     ESP, 8
00413C7A  INC     ESI
00413C7B  CMP     ESIEDI
00413C7D  MOV     EBPEAX
00413C7F  JL      SHORT Coursewa.00413C65
00413C81  POP     EDI                             
00413C82  MOV     EAXEBP
00413C84  POP     ESI                              
00413C85  POP     EBP                              
00413C86  POP     EBX                              
00413C87  ADD     ESP, 200
00413C8D  RETN************************************返回指令,返回到:00413A1C

00413A1C  ADD     ESP, 4**************************返回到这里!F8往下!
00413A1F  MOV     DWORD PTR SS:[ESP+8], EAX*******保存上面用户名计算的值:4F993D3C
00413A23  XOR     ESIESI************************ESI清0
00413A25  MOVSX   EAXBYTE PTR SS:[ESP+ESI+8]****第一次把最后一组值:3C扩展到EAX
00413A2A  CMP     EAX, 41*************************与41比较
00413A2D  JL      SHORT Coursewa.00413A37*********小于就跳!
00413A2F  CMP     EAX, 5A
00413A32  JG      SHORT Coursewa.00413A37
00413A34  ADD     EAX, 20
00413A37  PUSH    EAX******************************跳到这里!3C入栈!
00413A38  CALL    Coursewa.00413CB0****************算法CALL(2),按F7跟进!代码直接在下面给出!
====================================================================================
算法CALL(2)的代码:
00413CB0  MOV     EAXDWORD PTR SS:[ESP+4]********3C移入EAX
00413CB4  AND     EAX, 7F**************************与运算!与7F相与,结果是3C
00413CB7  CMP     EAX, 41**************************与41比较
00413CBA  JL      SHORT Coursewa.00413CC3**********小于就跳走!
00413CBC  CMP     EAX, 5A**************************与5A比较
00413CBF  JG      SHORT Coursewa.00413CC3**********大于就跳走!
00413CC1  OR      AL, 20***************************与20相或!
00413CC3  CMP     EAX, 6F**************************与6F比较                         
00413CC6  JNZ     SHORT Coursewa.00413CD4**********不相等就跳走!
00413CC8  MOV     EAX, 90**************************90移入EAX                         
00413CCD  XOR     EAX, 0E**************************EAX=EAX XOR 0E
00413CD0  OR      AL, 31***************************AL与31相或!
00413CD2  JMP     SHORT Coursewa.00413CB4
00413CD4  CMP     EAX, 30**************************与30比较
00413CD7  JNZ     SHORT Coursewa.00413CE5**********不相等则跳
00413CD9  MOV     EAX, 0CF************************* 0CF移入EAX                       
00413CDE  XOR     EAX, 0E***************************EAX=EAX XOR 0E
00413CE1  OR      AL, 31****************************AL与31相或!
00413CE3  JMP     SHORT Coursewa.00413CB4
00413CE5  CMP     EAX, 61***************************与61比较!
00413CE8  JL      SHORT Coursewa.00413CEF***********小于就跳!
00413CEA  CMP     EAX, 7A***************************与7A比较!
00413CED  JLE     SHORT Coursewa.00413D00***********小于等于就跳!
00413CEF  CMP     EAX, 31 **************************与31比较!                        
00413CF2  JL      SHORT Coursewa.00413CF9***********小于就跳!
00413CF4  CMP     EAX, 39***************************与39比较!
00413CF7  JLE     SHORT Coursewa.00413D00***********小于等于就跳!
00413CF9  XOR     EAX, 0E***************************EAX=EAX XOR 0E=3C XOR 0E=32
00413CFC  OR      AL, 31****************************AL与31相或!32 OR 31=33(3的ASCII码值)
00413CFE  JMP     SHORT Coursewa.00413CB4
00413D00  RETN *************************************返回!                       
==========================================================================================

00413A3D  ADD     ESP, 4
00413A40  MOV     BYTE PTR SS:[ESP+ESI+8], AL*******保存第一位运算得到的值:3
00413A44  INC     ESI*******************************ESI加1
00413A45  CMP     ESI, 4****************************与4比较!
00413A48  JL      SHORT Coursewa.00413A25***********小于就跳!这一循环得到第一组注册码:3371
00413A4A  MOV     EDIDWORD PTR SS:[ESP+30]********试验码:"1234-5678-9009-8765"移入EDI
00413A4E  LEA     ECXDWORD PTR SS:[ESP+8]
00413A52  MOV     ESIEDI
00413A54  XOR     EDXEDX
00413A56  SUB     ESIECX
00413A58  LEA     ECXDWORD PTR SS:[ESP+EDX+8]
00413A5C  MOVSX   EAXBYTE PTR DS:[ESI+ECX]********试验码第一组的第一位1(31)扩展到EAX
00413A60  CMP     EAX, 41***************************与41比较!
00413A63  JL      SHORT Coursewa.00413A6D***********小于就跳
00413A65  CMP     EAX, 5A***************************与5A比较!
00413A68  JG      SHORT Coursewa.00413A6D***********大于就跳!
00413A6A  ADD     EAX, 20***************************EAX的值加上20
00413A6D  MOVSX   ECXBYTE PTR DS:[ECX]************第一组注册码的第一位3(33)扩展到ECX
00413A70  CMP     EAXECX**************************比较第一位注册码
00413A72  JNZ     Coursewa.00413BAA*****************不相等就跳,跳就失败!所以要继续,把JNZ改成JE
00413A78  INC     EDX
00413A79  CMP     EDX, 4
00413A7C  JL      SHORT Coursewa.00413A58************跳回循环,直到第一组的4位注册码比较完!
00413A7E  MOV     EAXDWORD PTR SS:[ESP+8]**********第一组注册码倒序排列:31373333移入EAX
00413A82  LEA     EDXDWORD PTR DS:[EAX+EAX*2]******EDX=31373333+31373333*2=93A59999
00413A85  LEA     ECXDWORD PTR DS:[EDX*4+9]********ECX=93A59999*4+9=4E96666D
00413A8C  IMUL    ECXEAX***************************ECX=4E96666D*31373333=7CC91EB7
00413A8F  MOV     DWORD PTR SS:[ESP+C], ECX**********保存这个值
00413A93  XOR     ESIESI***************************ESI清0
00413A95  MOV     DLBYTE PTR SS:[ESP+ESI+C]********最后一组值B7移入DL
00413A99  PUSH    EDX
00413A9A  PUSH    ESI
00413A9B  CALL    Coursewa.00413BC0******************调用算法CALL(1),看上面!
00413AA0  AND     EAX, 0FF***************************313733DB AND 0FF=DB
00413AA5  PUSH    EAX
00413AA6  CALL    Coursewa.00413CB0******************调用算法CALL(1),看上面!得到第二组的第一位注册码:75(u的ASCII码值)
00413AAB  ADD     ESP, 0C
00413AAE  MOV     BYTE PTR SS:[ESP+ESI+C], AL********保存这个值
00413AB2  INC     ESI
00413AB3  CMP     ESI, 4
00413AB6  JL      SHORT Coursewa.00413A95*****跳回循环,直至算出第二组注册码,最后结果是:u1r1
00413AB8  XOR     ECXECX
00413ABA  MOVSX   EAXBYTE PTR DS:[EDI+ECX+5]**第二组试验码的第一位5(35)扩展到EAX
00413ABF  CMP     EAX, 41
00413AC2  JL      SHORT Coursewa.00413ACC
00413AC4  CMP     EAX, 5A
00413AC7  JG      SHORT Coursewa.00413ACC
00413AC9  ADD     EAX, 20
00413ACC  MOVSX   EDXBYTE PTR SS:[ESP+ECX+C]**第二组注册码的第一位:75(u)扩展到ECX
00413AD1  CMP     EAXEDX**********************比较试验码与注册码是否相等
00413AD3  JNZ     Coursewa.00413BAA*************不相等就跳!要继续这里也改成JE
00413AD9  INC     ECX
00413ADA  CMP     ECX, 4
00413ADD  JL      SHORT Coursewa.00413ABA*******跳回循环,直至比较完4位注册码!
00413ADF  MOV     EAXDWORD PTR SS:[ESP+C]**********第二组注册码倒序排列:31723175移入EAX
00413AE3  MOV     ECXDWORD PTR SS:[ESP+8]**********第一组注册码倒序排列:31373333移入ECX
00413AE7  MOV     EDXEAX***************************EAX的值移入EDX!
00413AE9  XOR     EDXECX***************************EDX=31723175 XOR 31373333=00450246
00413AEB  INC     EDX********************************EDX加1=00450247
00413AEC  IMUL    EDXECX***************************EDX=00450247*31373333=E1749925
00413AEF  LEA     ECXDWORD PTR DS:[EAX+EAX*4]******ECX=31723175+31723175*4=F73AF749
00413AF2  LEA     EAXDWORD PTR DS:[EAX+ECX*8]******EAX=31723175+F73AF749*8=EB49EBBD
00413AF5  LEA     EAXDWORD PTR DS:[EAX+EAX*2]******EAX=EB49EBBD+EB49EBBD*2=C1DDC337
00413AF8  ADD     EDXEAX***************************EDX=E1749925+C1DDC337=A3525C5C
00413AFA  XOR     ESIESI
00413AFC  MOV     DWORD PTR SS:[ESP+10], EDX*********保存EDX的值A3525C5C
00413B00  MOVSX   ECXBYTE PTR SS:[ESP+ESI+10]******把最后两位数值上:5C扩展到ECX中
00413B05  PUSH    ECX
00413B06  CALL    Coursewa.00413CB0******************调用算法CALL(1),看上面!
00413B0B  ADD     ESP, 4
00413B0E  MOV     BYTE PTR SS:[ESP+ESI+10], AL*******得到第三组注册码的第一位:s,保存s
00413B12  INC     ESI
00413B13  CMP     ESI, 4
00413B16  JL      SHORT Coursewa.00413B00************跳回循环,计算出第三组4位注册码:ssr3
00413B18  XOR     ECXECX
00413B1A  MOVSX   EAXBYTE PTR DS:[EDI+ECX+A]*******第三组试验码的第一位:9(39)扩展到EAX
00413B1F  CMP     EAX, 41
00413B22  JL      SHORT Coursewa.00413B2C
00413B24  CMP     EAX, 5A
00413B27  JG      SHORT Coursewa.00413B2C
00413B29  ADD     EAX, 20
00413B2C  MOVSX   EDXBYTE PTR SS:[ESP+ECX+10]******第三组注册码的第一位:s(73)扩展到EDX
00413B31  CMP     EAXEDX***************************比较第一个试验码与注册码!
00413B33  JNZ     SHORT Coursewa.00413BAA************不相等就跳,一跳就失败!
00413B35  INC     ECX
00413B36  CMP     ECX, 4
00413B39  JL      SHORT Coursewa.00413B1A************跳回循环,直至比较完4位注册码!
00413B3B  MOV     EAXDWORD PTR SS:[ESP+C]**********第二组注册码倒序排列:31723175移入EAX
00413B3F  MOV     ECXDWORD PTR SS:[ESP+8]**********第一组注册码倒序排列:31373333移入ECX
00413B43  IMUL    EAXECX***************************EAX=31723175*31373333=9EBD294F
00413B46  LEA     EDXDWORD PTR DS:[EAX*8]**********EDX=9EBD294F*8=F5E94A78
00413B4D  SUB     EDXEAX***************************EDX=F5E94A78-9EBD294F=572C2129
00413B4F  LEA     EAXDWORD PTR DS:[ECX+ECX*4]******EAX=31373333+31373333*4=F613FFFF
00413B52  ADD     EDX, 5*****************************EDX=572C2129+5=572C212E
00413B55  IMUL    EDXDWORD PTR SS:[ESP+10]*********SS:[ESP+10]保存的值是第三组注册码的倒序排列:33727373
*****************************************************EDX=33727373*572C212E=EC3691AA
00413B5A  ADD     EDXEAX***************************EDX=EC3691AA+F613FFFF=E24A91A9
00413B5C  XOR     ESIESI
00413B5E  MOV     DWORD PTR SS:[ESP+14], EDX*********保存E24A91A9
00413B62  MOVSX   ECXBYTE PTR SS:[ESP+ESI+14]******把上述值的最后两位:A9扩展到ECX
00413B67  PUSH    ECX
00413B68  CALL    Coursewa.00413CB0******************调用算法CALL(1),看上面!
00413B6D  ADD     ESP, 4
00413B70  MOV     BYTE PTR SS:[ESP+ESI+14], AL*******把计算得到的最后一组注册码的第一位:7保存!
00413B74  INC     ESI
00413B75  CMP     ESI, 4
00413B78  JL      SHORT Coursewa.00413B62************跳回循环,计算最后一组注册码,得到:71jb
00413B7A  XOR     ECXECX
00413B7C  MOVSX   EAXBYTE PTR DS:[EDI+ECX+F]*******第四组试验码的第一位:8(38)扩展到EAX
00413B81  CMP     EAX, 41
00413B84  JL      SHORT Coursewa.00413B8E
00413B86  CMP     EAX, 5A
00413B89  JG      SHORT Coursewa.00413B8E
00413B8B  ADD     EAX, 20
00413B8E  MOVSX   EDXBYTE PTR SS:[ESP+ECX+14]******第四组注册码的第一位:7(37)扩展到EDX
00413B93  CMP     EAXEDX***************************比较试验码与注册码!
00413B95  JNZ     SHORT Coursewa.00413BAA************不相等就跳,一跳就失败!
00413B97  INC     ECX
00413B98  CMP     ECX, 4
00413B9B  JL      SHORT Coursewa.00413B7C************跳回循环,直至比较完4位注册码!
00413B9D  POP     EDI                              ;  0012FA30
00413B9E  MOV     EAX, 1
00413BA3  POP     ESI                              ;  0012FA30
00413BA4  ADD     ESP, 20
00413BA7  RETN    8
  算法小结:
  软件的算法一环扣一环,先根据用户名计算出第一组注册码,根据第一组注册码计算出第二组注册码,
根据第一组、第二组注册码计算出第三组注册码,根据第一组、第二组、第三组注册码计算出最后一组
注册码。
  给一个可用的注册码:用户名:yzez
                      注册码:3371-u1r1-ssr3-71jb