老文章档案 · 2003 年

网际快车(FlashGet) V1.40 国际版 算法分析

破解教程 · 算法分析 · 2003-08-07 · 作者:风马 人气: · 出处:赢政天下整理收藏)

目标软件: 网际快车(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

(出处:赢政天下整理收藏)

相关文章:

·语音界面2.0算法分析及注册机源码!

·侠客系统修改器1.21破解手记--算法分析

·中文拨号上网计时计费器 V4.12注册算法分析

·ClockWise 3.22e注册码算法分析

·CoolClock V1.02注册算法分析

·Directory Scanner v1.5 注册算法分析

·Disk Chief 1.2 简单注册算法分析

·EffeTech HTTP Sniffer 3.2注册算法分析

·eLib2.01算法分析

·EZ MP3 Recorder 1.15 注册算法分析

相关软件:

→ 特别推荐

→ 热点TOP10

我为人人《《==》》人人为我

关于我们 |

帮助(?)

| 广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright © 1999-2003

winzheng.com All Rights Reserved.

繁体版:由华琦数码技术提供

Powered

by:MeSky.Net

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。

档案馆里的相关老软件

🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史