FTP工具LeapFTP演算法淺析!

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

軟體大小:  882 KB
軟體語言:  簡體中文
軟體類別:  漢化補丁 / 共享版 / FTP 工具
應用平臺:  Win9x/NT/2000/XP
介面預覽:  無
加入時間:  2003-06-30 18:31:37
下載次數:  121021
推薦等級:  ☆☆☆☆☆
軟體下載:   http://count.skycn.com/softdown.php?id=711&url=http://on165-http.skycn.net:8080/down/HA_LeapFTP274.exe

軟體介紹:
   功能強大,媲美BulletProof FTP的FTP軟體。跟Netscape相仿的書籤形式,連線更加方便。下載與上傳檔案支援續傳。可下載或上傳整個目錄,亦可直接刪除整個目錄。可讓你編列順序一次下載或上傳同一站臺中不同目錄下的檔案。瀏覽網頁時若在檔案連結上按滑鼠右鍵選[複製捷徑]便會自動下載該檔案。具有不會因閒置過久而被站臺踢出的功能。可直接編輯遠端Server上的檔案。可設定檔案傳送完畢自動中斷Modem連線。


破解工具:TRW1.22
作者宣告:初學破解,僅作學習交流之用,失誤之處敬請大俠賜教!

這個軟體無殼,Delphi編寫,但是反反彙編,而且我第1次用OD載入時執行一會兒就當機,不知是不是防OD,只好請出國產的TRW搞定.
用bpx hmemcpy下斷!

【簡要過程】:
使用者名稱:ShenGe[BCG]
試驗碼:ABC1-EF2G-I3JK-4MNO

.................(略)
0048824C  PUSH    EBP
0048824D  MOV     EBP, ESP
00487EA6  MOV     EAX, [LOCAL.2]
00487EA9  LEA     EDX, [LOCAL.1]
00487EAC  CALL    LEAPFTP.00408D74
00487EB1  CMP     BYTE PTR DS:[EBX+2F4], 0
00487EB8  JE      SHORT LEAPFTP.00487EC8
00487EBA  MOV     EDX, [LOCAL.1]
00487EBD  MOV     EAX, EBX
00487EBF  CALL    LEAPFTP.0048824C
                 <---這個是關鍵的Call,跟進!①
00487EC4  TEST    AL, AL
00487EC6  JNZ     SHORT LEAPFTP.00487EEE
                 <---關鍵跳轉!註冊碼正確則跳!
00487EC8  MOV     EAX, DWORD PTR DS:[EBX+2F0]
00487ECE  PUSH    EAX
00487ECF  LEA     EDX, [LOCAL.3]
00487ED2  MOV     EAX, DWORD PTR DS:[EBX+2D0]
00487ED8  CALL    LEAPFTP.00433E1C
00487EDD  MOV     EDX, [LOCAL.3]
00487EE0  MOV     ECX, [LOCAL.1]
00487EE3  MOV     EAX, EBX
00487EE5  CALL    LEAPFTP.004880A4
00487EEA  TEST    AL, AL
00487EEC  JE      SHORT LEAPFTP.00487F50
00487EEE  LEA     EDX, [LOCAL.4]
00487EF1  MOV     EAX, DWORD PTR DS:[EBX+2E4]
00487EF7  CALL    LEAPFTP.00433E1C
00487EFC  MOV     EAX, [LOCAL.4]
00487EFF  PUSH    EAX
00487F00  LEA     EDX, [LOCAL.5]
00487F03  MOV     EAX, DWORD PTR DS:[EBX+2D0]
00487F09  CALL    LEAPFTP.00433E1C
00487F0E  MOV     ECX, [LOCAL.5]
00487F11  MOV     EDX, DWORD PTR DS:[EBX+2EC]
00487F17  MOV     EAX, EBX
00487F19  CALL    LEAPFTP.004883CC
00487F1E  MOV     EAX, LEAPFTP.00487F9C            
00487F23  CALL    LEAPFTP.0045AD88
                 <--- Thank You For Registering!
00487F28  MOV     DWORD PTR DS:[EBX+234], 1
00487F32  LEA     EDX, [LOCAL.6]
00487F35  MOV     EAX, DWORD PTR DS:[EBX+2D0]
00487F3B  CALL    LEAPFTP.00433E1C
00487F40  MOV     EDX, [LOCAL.6]
00487F43  LEA     EAX, DWORD PTR DS:[EBX+2E8]
00487F49  CALL    LEAPFTP.00403D48
00487F4E  JMP     SHORT LEAPFTP.00487F65
00487F50  PUSH    0                                
00487F52  MOV     CX, WORD PTR DS:[487FB8]        
00487F59  MOV     DL, 1                            
00487F5B  MOV     EAX, LEAPFTP.00487FC4            
00487F60  CALL    LEAPFTP.0045AC90                
                 <---註冊碼錯誤!
00487F65  XOR     EAX, EAX                        
.........................

★★★★★★★★★
①跟進那個關鍵的Call,來到以下程式碼:
0048824F  ADD     ESP, -0C
00488252  PUSH    EBX
00488253  PUSH    ESI
00488254  PUSH    EDI
00488255  MOV     [LOCAL.1], EDX
00488258  MOV     EAX, [LOCAL.1]
0048825B  CALL    LEAPFTP.00404128
00488260  XOR     EAX, EAX
00488262  PUSH    EBP
00488263  PUSH    LEAPFTP.004883B9
00488268  PUSH    DWORD PTR FS:[EAX]
0048826B  MOV     DWORD PTR FS:[EAX], ESP
0048826E  MOV     BYTE PTR SS:[EBP-5], 0
00488272  MOV     EAX, [LOCAL.1]
                 <---EAX="ABC1-EF2G-I3JK-4MNO"
00488275  CALL    LEAPFTP.00403F74
                 <---取假碼位數
0048827A  CMP     EAX, 13
                 <---註冊碼位數必須為19位
0048827D  JNZ     LEAPFTP.004883A3
00488283  MOV     EAX, [LOCAL.1]
00488286  CMP     BYTE PTR DS:[EAX+4], 2D
                 <---比較第5位是否為"-"
0048828A  JNZ     LEAPFTP.004883A3
00488290  MOV     EAX, [LOCAL.1]
00488293  CMP     BYTE PTR DS:[EAX+9], 2D
                 <---比較第10位是否為"-"
00488297  JNZ     LEAPFTP.004883A3
0048829D  MOV     EAX, [LOCAL.1]
004882A0  CMP     BYTE PTR DS:[EAX+E], 2D
                 <---比較第15位是否為"-"
004882A4  JNZ     LEAPFTP.004883A3
004882AA  XOR     ESI, ESI
004882AC  XOR     EDI, EDI
004882AE  XOR     EAX, EAX
                 <---EAX=0
004882B0  MOV     [LOCAL.3], EAX
004882B3  MOV     EBX, 1
                 <---EBX=1
004882B8  /MOV     EAX, EBX
004882BA  |AND     EAX, 80000003
         |        <---由於EBX初始值為1,所以這兒為判斷是否為假碼的
                  4 8 12 位,從而轉向相關程式碼段進行不同的處理
004882BF  |JNS     SHORT LEAPFTP.004882C6
004882C1  |DEC     EAX
004882C2  |OR      EAX, FFFFFFFC
004882C5  |INC     EAX
004882C6  |TEST    EAX, EAX
004882C8  |JNZ     SHORT LEAPFTP.004882E0
004882CA  |MOV     EAX, [LOCAL.1]
004882CD  |MOV     AL, BYTE PTR DS:[EAX+EBX-1]
                  <---按位取假碼
004882D1  |CALL    LEAPFTP.00488224
                   <---此Call對取得的字元進行判斷,看是否
                  滿足Hex值在2F與3A之間,即必須為數字
004882D6  |TEST    AL, AL
004882D8  |JE      LEAPFTP.004883A3
                  <---不能跳!
004882DE  |JMP     SHORT LEAPFTP.00488302
004882E0  |MOV     EAX, EBX
004882E2  |MOV     ECX, 5
                  <---ECX=5
004882E7  |CDQ
004882E8  |IDIV    ECX
004882EA  |TEST    EDX, EDX
004882EC  |JE      SHORT LEAPFTP.00488302
         |        <---控制5個一組地處理註冊碼
004882EE  |MOV     EAX, [LOCAL.1]
004882F1  |MOV     AL, BYTE PTR DS:[EAX+EBX-1]
         |        <---按位取假碼
004882F5  |CALL    LEAPFTP.00488238
                  <---此Call對取得的字元進行判斷,看是否
                  滿足Hex值在40與5B之間,即必須為大寫
                  字母所組成!
004882FA  |TEST    AL, AL
004882FC  |JE      LEAPFTP.004883A3
         |        <---若字元不滿足這裡會跳走!
00488302  |MOV     EAX, [LOCAL.1]
00488305  |MOV     AL, BYTE PTR DS:[EAX+EBX-1]
         |        <---按位取註冊碼
00488309  |CMP     AL, 2D
         |        <---是否為"-",是"-"則不參與運算
0048830B  |JE      SHORT LEAPFTP.0048833A
0048830D  |CMP     EBX, 5
         |        <---比較是否取完1組
00488310  |JGE     SHORT LEAPFTP.0048831E
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
00488312  |MOV     EDX, [LOCAL.1]
00488315  |AND     EAX, 0FF
         |         <---取低位
0048831A  |ADD     ESI, EAX
         |         <---將其Hex值累加到ESI中,為
                   第1組的結果即註冊碼第1至4位,我的結果為0xF7
0048831C  |JMP     SHORT LEAPFTP.0048833A
0048831E  |CMP     EBX, 0A
                  <---是否處理完第2組,即假碼第10位
00488321  |JGE     SHORT LEAPFTP.0048832F
--------------------------------
00488323  |MOV     EDX, [LOCAL.1]
00488326  |AND     EAX, 0FF
0048832B  |ADD     EDI, EAX
0048832D  |JMP     SHORT LEAPFTP.0048833A
---------------------------------
第2組的Hex值累加到EDI中,即註冊碼的6至9位,我
的結果為0x104
---------------------------------
0048832F  |MOV     EDX, [LOCAL.1]
00488332  |AND     EAX, 0FF
00488337  |ADD     [LOCAL.3], EAX
---------------------------------
第3組的Hex值累加到[LOCAL.3]中,即註冊碼的11至14位,我
的結果為0x111
0048833A  |INC     EBX
0048833B  |CMP     EBX, 0F
         |        <---比較是否處理完前15個字元
0048833E  \JNZ     LEAPFTP.004882B8

00488344  LEA     ECX, DWORD PTR DS:[EDI+ESI]
                 <---ECX=EDI+ESI=0xF7+0x104=0x1FB
00488347  ADD     ECX, [LOCAL.3]
                 <---ECX=0x1FB+0x111=0x30C,即3部分結果的
                 的累加值再相加
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

★★★★★★★★★
0048834A  MOV     EAX, ESI
                 <---EAX=0xF7,第1部分累加值
0048834C  MOV     EBX, 1A
                 <---EBX=0x1A
00488351  CDQ
00488352  IDIV    EBX
00488354  ADD     EDX, 41
                 <---EDX=EDX+0x41=0x4E--->對應字元為"N"
00488357  MOV     EAX, [LOCAL.1]
0048835A  CMP     DL, BYTE PTR DS:[EAX+F]
                 <---比較註冊碼第16位
0048835D  JNZ     SHORT LEAPFTP.004883A3
----------------------------------------
0048835F  MOV     EAX, EDI
                 <---EAX=0x104,第2部分累加值
00488361  MOV     EBX, 1A
00488366  CDQ
00488367  IDIV    EBX
00488369  ADD     EDX, 41
                 <---EDX=41,對應字元為"A"
0048836C  MOV     EAX, [LOCAL.1]
0048836F  CMP     DL, BYTE PTR DS:[EAX+10]
                 <---比較註冊碼第17位
00488372  JNZ     SHORT LEAPFTP.004883A3
------------------------------------------
00488374  MOV     EAX, [LOCAL.3]
                 <---EAX=0x111,第3部分累加值
00488377  MOV     EBX, 1A
0048837C  CDQ
0048837D  IDIV    EBX
0048837F  ADD     EDX, 41
                 <---EDX=4E,對應字元為"N"
00488382  MOV     EAX, [LOCAL.1]
00488385  CMP     DL, BYTE PTR DS:[EAX+11]
                 <---比較註冊碼第18位
00488388  JNZ     SHORT LEAPFTP.004883A3
-------------------------------------------
0048838A  MOV     EAX, ECX
                 <---EAX=0x30C,3部分累加值的總和
0048838C  MOV     ECX, 1A
00488391  CDQ
00488392  IDIV    ECX
00488394  ADD     EDX, 41
                 <---EDX=41,對應字元為"A"
00488397  MOV     EAX, [LOCAL.1]
0048839A  CMP     DL, BYTE PTR DS:[EAX+12]
                 <---比較註冊碼第19位
0048839D  JNZ     SHORT LEAPFTP.004883A3
★★★★★★★★★
0048839F  MOV     BYTE PTR SS:[EBP-5], 1
                 <---置標誌位1,程式中應該有校驗位
004883A3  XOR     EAX, EAX
                 <---EAX=0!Bad Boy! :(
004883A5  POP     EDX                              
004883A6  POP     ECX                              
004883A7  POP     ECX                            
004883A8  MOV     DWORD PTR FS:[EAX], EDX
004883AB  PUSH    LEAPFTP.004883C0
004883B0  LEA     EAX, [LOCAL.1]
004883B3  CALL    LEAPFTP.00403CF4
004883B8  RETN

由此得到我的正確註冊碼為:ABC1-EF2G-I3JK-NANA

【總結】:註冊碼與使用者名稱無關!註冊碼必須為19位,其中第5,10,15位為"-",註冊碼的第4,8,12位必須為數字,其餘位為大寫字母.假設註冊碼的第1至4位的Hex值累加值為a,第6至9位的Hex值累加值為b,第11至14位的Hex值累加值為c,則註冊碼的
後4位分別為:
第16位---->Asc(a mod 0x1A+41)
第17位---->Asc(b mod 0x1A+41)
第18位---->Asc(c mod 0x1A+41)
第19位---->Asc[(a+b+c) mod 0x1A+41)]

軟體註冊成功後將註冊資訊儲存在登錄檔的
"HKEY_CURRENT_USER\Software\LeapWare\Registry\LeapFTP"下
一組可用註冊碼:
使用者名稱:ShenGe[BCG]
註冊碼:ABC1-EF2G-I3JK-NANA

                                               Cracked By ShenGe[BCG]


相關文章