• 标 题:网际快车(FlashGet) V1.40 国际版
  • 作 者:风马
  • 时 间:2003/01/12 10:30am 
  • 链 接:http://bbs.pediy.com

目标软件:  网际快车(FlashGet) V1.40 国际版

软件大小:  1729 KB

软件性质:  共享软件

应用平台:  Win9x/NT/2000/XP  


软件介绍:

  下载的最大问题是什么——速度,其次是什么——下载后的管理。网际快车FlashGet

(JetCar)就是为解决这两个问题所写的,通过把一个文件分成几个部分同时下载可以成倍

的提高速度,下载速度可以提高100%到500%。网际快车可以创建不限数目的类别,每个类

别指定单独的文件目录,不同的类别保存到不同的目录中去,强大的管理功能包括支持拖

拽,更名,添加描述,查找,文件名重复时可自动重命名等等。而且下载前后均可轻易管

理文件。


使用工具:  W32dasm v8.93 黄金修正版本、TRW2000 v1.22 娃娃修正版。


破解过程:  

软件注册时,先将注册信息保存在注册表中的:HKEY_CURRENT_USER\Software\JetCar\

JetCar\General 子键中,然后在下一次启动时进行验证。

所以使用 W32Dasm 反汇编,串式参考:"RegPass",发现有

:0041C3E1 6864144F00              push 004F1464

:0041C5B6 6864144F00              push 004F1464

两处调用,经过观察: 41C3E1 处的作用是注册时将注册信息压入注册,所以来到

41C5B6:

0167:0041C5B6  PUSH     DWORD 004F1464
0167:0041C5BB  LEA      ECX,[ESP+1C]
0167:0041C5BF  PUSH     DWORD 004EF1AC
0167:0041C5C4  PUSH     ECX
0167:0041C5C5  MOV      ECX,EBX
0167:0041C5C7  CALL     004B483A
0167:0041C5CC  ADD      EBX,035C
0167:0041C5D2  MOV      EDI,01
0167:0041C5D7  PUSH     EAX
0167:0041C5D8  MOV      ECX,EBX
0167:0041C5DA  MOV      [ESP+3C],EDI
0167:0041C5DE  CALL     0049E6AF
0167:0041C5E3  LEA      ECX,[ESP+14]
0167:0041C5E7  MOV      [ESP+38],EBP
0167:0041C5EB  CALL     0049E576         /* 获得你输入的邮件地址  */
0167:0041C5F0  MOV      EDX,[ESI]
0167:0041C5F2  MOV      EAX,[EDX-08]     /* 其位数送入 EAX */
0167:0041C5F5  TEST     EAX,EAX
0167:0041C5F7  JZ       NEAR 0041C739    /* 为空则 Game Over ! */
0167:0041C5FD  MOV      EAX,[EBX]        /* 序列号送入 EAX */
0167:0041C5FF  MOV      ECX,[EAX-08]     /* 将其位数送入 ECX */
0167:0041C602  TEST     ECX,ECX
0167:0041C604  JZ       NEAR 0041C739    /* 为空则 Game Over ! */
0167:0041C60A  MOV      ECX,ESI
0167:0041C60C  CALL     0049A227
0167:0041C611  MOV      ECX,ESI
0167:0041C613  CALL     0049A1DB
0167:0041C618  MOV      ECX,[ESI]
0167:0041C61A  CMP      DWORD [ECX-08],BYTE +05
0167:0041C61E  JNG      NEAR 0041C739  /* 邮件地址长度小于 5h 就 Game Over !*/
0167:0041C624  PUSH     DWORD 004F1488
0167:0041C629  MOV      ECX,ESI
0167:0041C62B  CALL     00499E42       /* 测试你输入的邮件地址是否合法 */    
0167:0041C630  TEST     EAX,EAX
0167:0041C632  JL       NEAR 0041C739  /* 不合法则Game Over ! */  
0167:0041C638  PUSH     DWORD 004F1484
0167:0041C63D  MOV      ECX,ESI
0167:0041C63F  CALL     00499E42
0167:0041C644  TEST     EAX,EAX
0167:0041C646  JL       NEAR 0041C739
0167:0041C64C  MOV      ECX,EBX
0167:0041C64E  CALL     0049A227
0167:0041C653  MOV      ECX,EBX
0167:0041C655  CALL     0049A1DB         /* 获得你输入的序列号 */
0167:0041C65A  MOV      EDX,[EBX]        /* 将其送入 EDX */
0167:0041C65C  MOV      EAX,[EDX-08]     /* 长度送入 EAX */
0167:0041C65F  CMP      EAX,BYTE +2C     /* 比较序列号是否等于 2Ch 位 */
0167:0041C662  JNZ      NEAR 0041C739    /* 不等于就 Game Over ! */  
0167:0041C668  PUSH     DWORD 004F147C   /* “fgc-” 入栈  */
0167:0041C66D  MOV      ECX,EBX
0167:0041C66F  CALL     00499E42         /* 测序列号试前 4 为是否为 fgc-  */
0167:0041C674  TEST     EAX,EAX
0167:0041C676  JNZ      0041C67E         /* 不是跳向下一步比较  */
0167:0041C678  MOV      [ESP+10],EDI
0167:0041C67C  JMP      SHORT 0041C696
0167:0041C67E  PUSH     DWORD 004F1474   /* “fgf-” 入栈  */
0167:0041C683  MOV      ECX,EBX
0167:0041C685  CALL     00499E42         /* 测序列号试前 4 为是否为 fgf-  */
0167:0041C68A  TEST     EAX,EAX  
0167:0041C68C  JNZ      NEAR 0041C739    /* 不是则 Game Over ! */

从上面我们知道要成功注册应满足:

1:邮件地址合法,且长度应大于 5 位。

2:序列号长度为 44 位,前四位为“fgc-” 或 “fgf-”。


所以重新输入序列号继续:

0167:0041C692  MOV      [ESP+10],EAX
0167:0041C696  PUSH     BYTE +2C
0167:0041C698  MOV      ECX,EBX
0167:0041C69A  CALL     0049E9A6          /* 获得你输入的序列号 */
0167:0041C69F  MOV      EBP,EAX
0167:0041C6A1  XOR      ESI,ESI
0167:0041C6A3  ADD      EBP,BYTE +04
0167:0041C6A6  XOR      EDI,EDI
0167:0041C6A8  MOV      EAX,[EBP+00]
0167:0041C6AB  MOV      ECX,EDI
0167:0041C6AD  ADD      EBP,BYTE +04
0167:0041C6B0  SUB      ECX,BYTE +00
0167:0041C6B3  MOV      [ESP+1C],EAX
0167:0041C6B7  JZ       0041C6D5            /* 跳向 41C6D5 */

.................................(这里暂时省略一部分)

0167:0041C6D5  MOV      CL,[ESP+1E]         /* 序列号第 7 位送入CL */
0167:0041C6D9  MOV      DL,AH               /* 序列号第 6 位送入DL */
0167:0041C6DB  XOR      ECX,EDX             /* EDX 与 ECX 做异或运算 */
0167:0041C6DD  MOVSX    EDX,BYTE [ESP+1F]   /* 序列号第 8 位送入EDX */
0167:0041C6E2  AND      ECX,BYTE +7F        /* ECX 与 7F 做与运算 */
0167:0041C6E5  IMUL     ECX,EDX             /* ECX 乘以 EDX */
0167:0041C6E8  MOVSX    EAX,AL              /* 序列号第 5 位送入EAX */
0167:0041C6EB  ADD      ECX,EAX             /* ECX 加 EDX */
0167:0041C6ED  MOV      ESI,ECX             /* ECX 送入 ESI */
0167:0041C6EF  MOV      EAX,[ESP+10]
0167:0041C6F3  TEST     EAX,EAX            
0167:0041C6F5  JZ       0041C703            
0167:0041C6F7  MOVSX    ECX,BYTE [004EF643]
0167:0041C6FE  CMP      EDI,BYTE +02
0167:0041C701  JZ       0041C70A
0167:0041C703  MOVSX    ECX,BYTE [EDI+004EF640]
0167:0041C70A  MOV      EAX,ESI             /* ESI 送入 EAX */
0167:0041C70C  XOR      EDX,EDX             /* EDX 清 0 */
0167:0041C70E  DIV      ECX                 /* 除以 ECX */
0167:0041C710  MOV      EAX,EDI
0167:0041C712  SUB      EAX,BYTE +00
0167:0041C715  JZ       0041C721            /* 跳向 41C721 */
0167:0041C717  DEC      EAX
0167:0041C718  JNZ      0041C725
0167:0041C71A  CMP      EDX,BYTE +08
0167:0041C71D  JNZ      0041C730
0167:0041C71F  JMP      SHORT 0041C725
0167:0041C721  TEST     EDX,EDX
0167:0041C723  JNZ      0041C730      /* EDX 为 0 就 Game Over !*/            
0167:0041C725  INC      EDI
0167:0041C726  CMP      EDI,BYTE +02
0167:0041C729  JNL      0041C74E
0167:0041C72B  JMP      0041C6A8            /* 从这里跳走 */    
0167:0041C730  PUSH     BYTE -01
0167:0041C732  MOV      ECX,EBX
0167:0041C734  CALL     0049E9F5
0167:0041C739  POP      EDI
0167:0041C73A  POP      ESI
0167:0041C73B  POP      EBP
0167:0041C73C  XOR      EAX,EAX
0167:0041C73E  POP      EBX
0167:0041C73F  MOV      ECX,[ESP+20]
0167:0041C743  MOV      [FS:00],ECX
0167:0041C74A  ADD      ESP,BYTE +2C
0167:0041C74D  RET    

从上面我们知道:序列号第 7 位和 7C2E00 加第 6 位的和做异或运算的值与7F做

与运算,之后再乘以第 8 位,最后再加上序列号第 5 位的 HEX 值的和除以 6B,

余数不为0就会Game Over !

即:((SN[7] XOR (7C2E00+SN[8])AND 7F)*SN[8]+SN[5])MOD 6B = 0

然后重新填入序列号,会来到:

0167:0041C6BC  MOVSX    ESI,BYTE [ESP+1E]     /* 序列号第 11 位送入 ESI */
0167:0041C6C1  MOVSX    EDX,BYTE [ESP+1F]     /* 序列号第 12 位送入 EDX */
0167:0041C6C6  MOVSX    ECX,AH                /* 序列号第 10 位送入 ECX */
0167:0041C6C9  AND      ESI,ECX               /* ESI 与 ECX 做与运算 */
0167:0041C6CB  IMUL     ESI,EDX               /* 然后乘以 EDX */
0167:0041C6CE  MOVSX    EAX,AL                /* 序列号第 9 位 送入 EAX */
0167:0041C6D1  ADD      ESI,EAX               /* ESI 加上 EAX */
0167:0041C6D3  JMP      SHORT 0041C6EF        /* 跳向 41C6EF */

......................................

0167:0041C6EF  MOV      EAX,[ESP+10]          /* 将 [ESP+10] 的值送入 EAX */
0167:0041C6F3  TEST     EAX,EAX               /* 测试 EAX */
0167:0041C6F5  JZ       0041C703              /* EAX 为 0 就 Game Over !*/
0167:0041C6F7  MOVSX    ECX,BYTE [004EF643]  
0167:0041C6FE  CMP      EDI,BYTE +02
0167:0041C701  JZ       0041C70A
0167:0041C703  MOVSX    ECX,BYTE [EDI+004EF640]
                                   /* 将 [EDI+004EF640] 的值送入ECX */
0167:0041C70A  MOV      EAX,ESI               /* ESI 送入 EAX */
0167:0041C70C  XOR      EDX,EDX               /* EDX 清 0 */
0167:0041C70E  DIV      ECX                   /* 除以 ECX */
0167:0041C710  MOV      EAX,EDI
0167:0041C712  SUB      EAX,BYTE +00
0167:0041C715  JZ       0041C721
0167:0041C717  DEC      EAX
0167:0041C718  JNZ      0041C725
0167:0041C71A  CMP      EDX,BYTE +08          /* 比较余数是否等于 8 */
0167:0041C71D  JNZ      0041C730              /* 不是就 Game Over !*/
0167:0041C71F  JMP      SHORT 0041C725        /* 天堂之门 */

从上面我们知道:序列号第 11 位与序列号第 10 位做与运算之后乘以序列号第 12 位,再

加上序列号第9位的 HEX 制除以 41C703 处的 ECX 的制,余数为 8 就可注册成功。

即: ((SN[10] AND SN[11])*SN[12]+SN[9]) MOD 65 = 8


最后总结:

1:邮件地址合法,且长度应大于 5 位;

2:序列号长度为 44 位,前四位为“fgc-” 或 “fgf-”;

3:((SN[7] XOR (7C2E00+SN[8])AND 7F)*SN[8]+SN[5])MOD 6B = 0;

4:((SN10 AND SN11)*SN12+SN9) MOD 65 = 8。


OK,这下可以做注册机了!:)

TC2.0 注册机源码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main()
{ long a,b,c,d;
 int e,f,g,h,i,k,temp;
 int sn[62]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J'
,'K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d'
,'e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x'
,'y','z'};
 char name[15],mail[30];

 randomize();
 k=random(2);

 printf("**************************************************************\n");
 printf("*                  FlashGet(JetCar) v1.40 Keygen             *\n");
 printf("*                 Made by fengma(fengma@2911.net)            *\n");
 printf("*                         2003-1-12                          *\n");
 printf("**************************************************************\n");
 
input_name:
 printf("\nInput your name:");
   gets(name);
   if(strlen(name)==0)
     {printf("\nYour must input your name!\n");
      goto input_name;
     }
input_mail:
 printf("\nAnd your E-mail:");
   gets(mail);
   if(strlen(mail)<=5)
     {printf("\nYour must input your E-mail correctly!\n");
      goto input_mail;
     }

 printf("\nYour register code:");
   if(k==0)
     printf("fgc-");
   else
     printf("fgf-");

   for(i=0;;i++)
     { a=random(62);
b=random(62);
       c=random(62);
       d=random(62);
        if (((sn[c]^(7745024+sn[b])&127)*sn[d]+sn[a])%107==0)
           break;
     }
      printf("%c%c%c%c",sn[a],sn[b],sn[c],sn[d]);

    for(i=0;;i++)
     { e=random(62);
       f=random(62);
       g=random(62);
       h=random(62);
        if (((sn[f]&sn[g])*sn[h]+sn[e])%101==8)
            break;
     }
      printf("%c%c%c%c",sn[e],sn[f],sn[g],sn[h]);

    for (i=13;i<=44;i++)
     { temp=random(62);
       printf("%c",sn[temp]);
     }
     
 printf("\n\n\n");
 printf("Happy new year!\n\nBye!\n");  
}


整理:
用 户 名:fengma
邮件地址:fengma_cn@msn.com
序 列 号:fgf-amy6tCrQN1uNTQHWk5JWnc1sphkRVIRsuPm5LY5x

风马 于 10:44 03-1-12