豪傑螢幕錄影機 V2.0.1 註冊演算法分析

看雪資料發表於2015-11-15

破解作者
         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

相關文章