首页
社区
课程
招聘
[原创]Throttle浮点算法注册
发表于: 2005-4-18 14:27 7881

[原创]Throttle浮点算法注册

2005-4-18 14:27
7881

10:50 2005-4-18
破解电脑报2003光盘软件Throttle
这个软件是用来调整上网设置的,据说会使上网速度快200-300%
能应用于各种操作系统

用PECompact 1.68 - 1.84 -> Jeremy Collake加壳
但是用Peid找到的OEP居然是假的!
我不得不手动脱壳,这还是第一次。

浮点数作为注册码
我不得不再次翻阅有关浮点的资料,总算搞清了,我自已以为。
破文在说明浮点运算上,可能让人看不明白,不过经过多次跟踪,我还是知道是什么意思了。

破解人:wofan[OCN][PYG]

OD载入,输入:
name:wofan
serial:123456789 后来证明这个假码是不合法的

在这里下断:
0047A0CE    .  BA 80A44700       mov edx,unpack.0047A480                          ;  ASCII "Name"
0047A0D3    .  8B45 EC           mov eax,dword ptr ss:[ebp-14]
0047A0D6    .  E8 316BFAFF       call unpack.00420C0C
0047A0DB    .  8B4D F8           mov ecx,dword ptr ss:[ebp-8]
0047A0DE    .  BA 90A44700       mov edx,unpack.0047A490                          ;  ASCII "Serial"
省略一大段,无非是注册名,注册框是否为空,并取得注册名长度,注册码长度
0047A1B8    .  8BD3              mov edx,ebx
0047A1BA    .  8B45 FC           mov eax,dword ptr ss:[ebp-4]
0047A1BD    .  E8 A6A3F8FF       call unpack.00404568
0047A1C2    .  8B45 D4           mov eax,dword ptr ss:[ebp-2C]                 注册名首址送EAX,开始处理注册名wofan
0047A1C5    .  0FB600            movzx eax,byte ptr ds:[eax]                   逐位ASCII送EAX,第一位77(w)
0047A1C8    .  F7EB              imul ebx                                       EBX中是循环次数   77*1=77
0047A1CA    .  8945 D0           mov dword ptr ss:[ebp-30],eax                 保存起来,
0047A1CD    .  DB45 D0           fild dword ptr ss:[ebp-30]                    浮点运算,
0047A1D0    .  E8 A788F8FF       call unpack.00402A7C
0047A1D5    .  8945 C8           mov dword ptr ss:[ebp-38],eax
0047A1D8    .  8955 CC           mov dword ptr ss:[ebp-34],edx
0047A1DB    .  DF6D C8           fild qword ptr ss:[ebp-38]
0047A1DE    .  83C4 F4           add esp,-0C
0047A1E1    .  DB3C24            fstp tbyte ptr ss:[esp]                          ; |
0047A1E4    .  9B                wait                                             ; |
0047A1E5    .  8D55 D8           lea edx,dword ptr ss:[ebp-28]                    ; |
0047A1E8    .  B8 ACA44700       mov eax,unpack.0047A4AC                          ; |
0047A1ED    .  E8 DEF8F8FF       call unpack.00409AD0                             ; \unpack.00409AD0
0047A1F2    .  FF75 D8           push dword ptr ss:[ebp-28]                   77的十进制119
0047A1F5    .  8D55 C4           lea edx,dword ptr ss:[ebp-3C]
0047A1F8    .  8BC3              mov eax,ebx
0047A1FA    .  E8 99E0F8FF       call unpack.00408298
0047A1FF    .  FF75 C4           push dword ptr ss:[ebp-3C]
0047A202    .  FF35 481F4800     push dword ptr ds:[481F48]
0047A208    .  8D45 E8           lea eax,dword ptr ss:[ebp-18]
0047A20B    .  BA 03000000       mov edx,3
0047A210    .  E8 B3A1F8FF       call unpack.004043C8                        连接
0047A215    .  8B45 E8           mov eax,dword ptr ss:[ebp-18]               1191
0047A218    .  E8 B7E1F8FF       call unpack.004083D4                         取1191的十六进制数4A7
0047A21D    .  8BF0              mov esi,eax
0047A21F    .  8B45 E8           mov eax,dword ptr ss:[ebp-18]
0047A222    .  E8 ADE1F8FF       call unpack.004083D4
0047A227    .  03F0              add esi,eax                               加起来:4A7+4A7=94E
0047A229    .  8BC6              mov eax,esi
0047A22B    .  8D55 C0           lea edx,dword ptr ss:[ebp-40]
0047A22E    .  E8 65E0F8FF       call unpack.00408298                      94E的十进制2382
0047A233    .  8B55 C0           mov edx,dword ptr ss:[ebp-40]
0047A236    .  8D45 E8           lea eax,dword ptr ss:[ebp-18]
0047A239    .  E8 A29EF8FF       call unpack.004040E0
0047A23E    .  43                inc ebx                                 EBX自加1  EBX=1+1=2(第一次循环)
0047A23F    .  8B45 FC           mov eax,dword ptr ss:[ebp-4]            注册名:wofan
0047A242    .  E8 C1A0F8FF       call unpack.00404308                    注册名长度5送EAX
0047A247    .  40                inc eax                                  EAX自加1
0047A248    .  3BD8              cmp ebx,eax                              看看是否该结束了!                        
0047A24A    .^ 0F85 5FFFFFFF     jnz unpack.0047A1AF                       没有结束就往上跳

********************************************************************************************************************
以上循环的运算:
w    77*1=77  十进制为119    119与循环次数1连接起来变成1191 ,它的十六进制是4A7,翻倍,变成94E,取其十进制2382
o    6F*2=DE          222                              2222                 8AE            115C           4444
f    66*3=132         306                              3063                 BF7            17EE           6126
a    61*4=184         388                              3884                 F2C            1E58           7768
n    6E*5=226         550                              5505                 1581           2B02           11010
**********************************************************************************************************************

0047A250    .  6A 06             push 6                              一个固定数压栈
0047A252    .  68 6AEBB29B       push 9BB2EB6A                       又一个固定数压栈(我们应该知道,浮点运算与栈有很大关系)
0047A257    .  8B45 E8           mov eax,dword ptr ss:[ebp-18]       dword ptr ss:[ebp-18]里面是2B02的十进制数:11010
0047A25A    .  E8 75E1F8FF       call unpack.004083D4
0047A25F    .  99                cdq                                 扩展,双字变四字
0047A260    .  E8 DFACF8FF       call unpack.00404F44                ********按F7跟进,看看  Call 之一 计算注册码的中间数********
0047A265    .  8945 C8           mov dword ptr ss:[ebp-38],eax               eax=44F0A4D4
0047A268    .  8955 CC           mov dword ptr ss:[ebp-34],edx               edx=11C34
0047A26B    .  DF6D C8           fild qword ptr ss:[ebp-38]           浮点运算,装入整数Integer
************************************************************************
Stack ss:[0012F5A8]=00011C3444F0A4D4           
************************************************************************

0047A26E    .  83C4 F4           add esp,-0C
0047A271    .  DB3C24            fstp tbyte ptr ss:[esp]            ; | 浮点运算:存实数与上托栈         
**********************************************************************
st=3.1248579720930001920e+14
Stack ss:[0012F53C]=1.3086894416192335360e-4930
**********************************************************************

0047A274    .  9B                wait                               ; |
0047A275    .  8D55 BC           lea edx,dword ptr ss:[ebp-44]      ; |         EDX=11C34
0047A278    .  B8 ACA44700       mov eax,unpack.0047A4AC            ; |         EAX=44F0A4D4
0047A27D    .  E8 4EF8F8FF       call unpack.00409AD0               ; \unpack.00409AD0   
0047A282    .  8B55 BC           mov edx,dword ptr ss:[ebp-44]
*************************************************************************
Stack ss:[0012F59C]=00E7C3E8, (ASCII "312485797209300")                    到这里就获得了注册码的中间数
edx=00000000
*************************************************************************
0047A285    .  8D45 E8           lea eax,dword ptr ss:[ebp-18]
0047A288    .  E8 539EF8FF       call unpack.004040E0
0047A28D    .  8D45 F0           lea eax,dword ptr ss:[ebp-10]
0047A290    .  50                push eax
0047A291    .  8B55 F8           mov edx,dword ptr ss:[ebp-8]           假码123456789
0047A294    .  B8 A0A44700       mov eax,unpack.0047A4A0
0047A299    .  E8 AEA3F8FF       call unpack.0040464C                 
0047A29E    .  8BC8              mov ecx,eax
0047A2A0    .  49                dec ecx
0047A2A1    .  BA 01000000       mov edx,1
0047A2A6    .  8B45 F8           mov eax,dword ptr ss:[ebp-8]
0047A2A9    .  E8 BAA2F8FF       call unpack.00404568
0047A2AE    .  8B45 F0           mov eax,dword ptr ss:[ebp-10]
0047A2B1    .  E8 72F8F8FF       call unpack.00409B28                这个Call看看假码是否合法浮点数
0047A2B6    .  DB7D B0           fstp tbyte ptr ss:[ebp-50]
0047A2B9    .  9B                wait
0047A2BA    .  8B45 E8           mov eax,dword ptr ss:[ebp-18]        EAX=312485797209300
0047A2BD    .  E8 66F8F8FF       call unpack.00409B28                *******这个Call看看假码是否合法浮点数  CAll 之二*******
0047A2C2    .  DB6D B0           fld tbyte ptr ss:[ebp-50]            装上刚才假码,(如果是真正的浮点数的话)
0047A2C5    .  DEE1              fsubrp st(1),st                       浮点运算:fsubrp:反向实数相减并上托

******************************
st0=
st(1)=3.1248579720930001920e+14

******************************
0047A2C7    .  D81D B0A44700     fcomp dword ptr ds:[47A4B0]          在这里进行浮点数比较,如果输入的注册码不合法,根本就到不了这里!
*****************************************
st=-UNORM F798 00E7C3A0 00000005
ds:[0047A4B0]=1000.000                反向相减(这里是假码减真码的中间数)的结果与ds:[0047A4B0]相比:1000.000的话,相等(大于Ja就死)就继续下去
****************************************

0047A2CD    .  DFE0              fstsw ax
0047A2CF    .  9E                sahf
******************************
AH=01 (S0 Z0 A0 P0 C1)
FL=12
******************************

0047A2D0    .  0F87 E2000000     ja unpack.0047A3B8
0047A2D6    .  8B45 E8           mov eax,dword ptr ss:[ebp-18]
0047A2D9    .  E8 4AF8F8FF       call unpack.00409B28
0047A2DE    .  DB7D A4           fstp tbyte ptr ss:[ebp-5C]
0047A2E1    .  9B                wait
0047A2E2    .  8B45 F0           mov eax,dword ptr ss:[ebp-10]
0047A2E5    .  E8 3EF8F8FF       call unpack.00409B28
0047A2EA    .  DB6D A4           fld tbyte ptr ss:[ebp-5C]
0047A2ED    .  DEE1              fsubrp st(1),st
0047A2EF    .  D81D B0A44700     fcomp dword ptr ds:[47A4B0]
0047A2F5    .  DFE0              fstsw ax
0047A2F7    .  9E                sahf
省略,下面是第二次减,注册名算出的中间数减去假码,如果结果等于1000.000,注册通过!以后会使AL得到1

0047A2E5    .  E8 3EF8F8FF                   call unpack.00409B28
0047A2EA    .  DB6D A4                       fld tbyte ptr ss:[ebp-5C]
0047A2ED    .  DEE1                          fsubrp st(1),st
0047A2EF    .  D81D B0A44700                 fcomp dword ptr ds:[47A4B0]
0047A2F5    .  DFE0                          fstsw ax
0047A2F7    .  9E                            sahf                           
0047A2F8    .  0F87 BA000000                 ja unpack.0047A3B8
0047A2FE    .  C605 401F4800 01              mov byte ptr ds:[481F40],1
0047A305    .  C645 F7 01                    mov byte ptr ss:[ebp-9],1
0047A309    .  33C0                          xor eax,eax
0047A30B    .  55                            push ebp

*************************按F7跟进,看看  Call 之一   计算注册码的中间数 ***********************
00404F44   /$  52                push edx
00404F45   |.  50                push eax                                  EAX=2B02(11010)压栈
00404F46   |.  8B4424 10         mov eax,dword ptr ss:[esp+10]             EAX=6         
00404F4A   |.  F72424            mul dword ptr ss:[esp]                    乘起来,EAX=2B02*6=1020C
00404F4D   |.  89C1              mov ecx,eax                                1020C放在ECX
00404F4F   |.  8B4424 04         mov eax,dword ptr ss:[esp+4]               开始dword ptr ss:[esp+4] 为零            
00404F53   |.  F76424 0C         mul dword ptr ss:[esp+C]                  dword ptr ss:[esp+C] 里面是:  9BB2EB6A
00404F57   |.  01C1              add ecx,eax                               加起来ECX=1020C+0=1020C
00404F59   |.  8B0424            mov eax,dword ptr ss:[esp]                 EAX= 2B02
00404F5C   |.  F76424 0C         mul dword ptr ss:[esp+C]                   EAX=2B02*9BB2EB6A=44F0A4D4 r 1A28
00404F60   |.  01CA              add edx,ecx                                EDX=1A28+1020C=11C34
00404F62   |.  59                pop ecx
00404F63   |.  59                pop ecx
00404F64   \.  C2 0800           retn 8
********************************************************************************

*********************这个Call看看假码是否合法浮点数  CAll 之二*********************

00409B28   /$  53                            push ebx
00409B29   |.  83C4 EC                       add esp,-14
00409B2C   |.  8BD8                          mov ebx,eax
00409B2E   |.  8BC3                          mov eax,ebx
00409B30   |.  E8 D3A9FFFF                   call unpack.00404508
00409B35   |.  8BD4                          mov edx,esp
00409B37   |.  33C9                          xor ecx,ecx
00409B39   |.  E8 1EFEFFFF                   call unpack.0040995C             那么这里就一定要看看,看看注册码是否全法浮点数Call 之三
00409B3E   |.  84C0                          test al,al                       AL被置0,表示,不是合法浮点数,我的假码123456789不是合法的!合法浮点数,在末尾应该是E+10形式!
00409B40   |.  75 19                         jnz short unpack.00409B5B         这里没有跳就完了,强行改为Jmp,进行下面的浮点运算,后来就进行浮点比较,然后会弹出浮点运算错误!
00409B42   |.  895C24 0C                     mov dword ptr ss:[esp+C],ebx
00409B46   |.  C64424 10 0B                  mov byte ptr ss:[esp+10],0B
00409B4B   |.  8D5424 0C                     lea edx,dword ptr ss:[esp+C]
00409B4F   |.  A1 20074800                   mov eax,dword ptr ds:[480720]
00409B54   |.  33C9                          xor ecx,ecx
00409B56   |.  E8 DDE1FFFF                   call unpack.00407D38                Econvertioner
00409B5B   |>  DB2C24                        fld tbyte ptr ss:[esp]
00409B5E   |.  83C4 14                       add esp,14
00409B61   |.  5B                            pop ebx
00409B62   \.  C3                            retn

××××××××××那么这里就一定要看看,看看注册码是否全法浮点数Call 之三×××××××××××××××××××××

00409970    .  A0 87164800                   mov al,byte ptr ds:[481687]
00409975    .  8845 FB                       mov byte ptr ss:[ebp-5],al         AL=2E (.)
00409978    .  89CB                          mov ebx,ecx
0040997A    .  9B                            wait
0040997B    .  D97D F8                       fstcw word ptr ss:[ebp-8]        Stack SS:[0012F51C]=2B02   fstcw:把控制字存入16位寄存器
0040997E    .  9B                            wait
0040997F    .  DBE2                          fclex                             浮点运算:清除异常
00409981    .  D92D 78F14700                 fldcw word ptr ds:[47F178]       ds:[47F178]=133F           fldcw:装控制字
00409987    .  D9EE                          fldz                              装入常数0
00409989    .  E8 85000000                   call unpack.00409A13              *************这个Call还是要看的!!看Call之四*******
0040998E    .  8A3E                          mov bh,byte ptr ds:[esi]
00409990    .  80FF 2B                       cmp bh,2B
00409993    .  74 05                         je short unpack.0040999A
00409995    .  80FF 2D                       cmp bh,2D
00409998    .  75 01                         jnz short unpack.0040999B
0040999A    >  46                            inc esi
0040999B    >  89F1                          mov ecx,esi
0040999D    .  E8 7C000000                   call unpack.00409A1E
004099A2    .  31D2                          xor edx,edx
004099A4    .  8A06                          mov al,byte ptr ds:[esi]
004099A6    .  3A45 FB                       cmp al,byte ptr ss:[ebp-5]       byte ptr ss:[ebp-5]=2E  (.)
004099A9    .  75 08                         jnz short unpack.004099B3       跳吧:
004099AB    .  46                            inc esi
004099AC    .  E8 6D000000                   call unpack.00409A1E
004099B1    .  F7DA                          neg edx
004099B3    >  39F1                          cmp ecx,esi                   跳到这里:
004099B5    .  74 4F                         je short unpack.00409A06       不跳了
004099B7    .  8A06                          mov al,byte ptr ds:[esi]        byte ptr ds:[esi]=0
004099B9    .  24 DF                         and al,0DF
004099BB    .  3C 45                         cmp al,45
004099BD    .  75 0A                         jnz short unpack.004099C9          又走了
004099BF    .  46                            inc esi
004099C0    .  52                            push edx
004099C1    .  E8 74000000                   call unpack.00409A3A
004099C6    .  58                            pop eax
004099C7    .  01C2                          add edx,eax
004099C9    >  E8 45000000                   call unpack.00409A13
004099CE    .  803E 00                       cmp byte ptr ds:[esi],0
004099D1    .  75 33                         jnz short unpack.00409A06
004099D3    .  89D0                          mov eax,edx
004099D5    .  80FB 01                       cmp bl,1
004099D8    .  75 03                         jnz short unpack.004099DD            看一下跳到那里去了?
004099DA    .  83C0 04                       add eax,4
004099DD    >  53                            push ebx
004099DE    .  8B5D FC                       mov ebx,dword ptr ss:[ebp-4]
004099E1    .  E8 E293FFFF                   call unpack.00402DC8
004099E6    .  5B                            pop ebx
004099E7    .  80FF 2D                       cmp bh,2D
004099EA    .  75 02                         jnz short unpack.004099EE
004099EC    .  D9E0                          fchs
004099EE    >  80FB 00                       cmp bl,0
004099F1    .  74 04                         je short unpack.004099F7
004099F3    .  DF3F                          fistp qword ptr ds:[edi]
004099F5    .  EB 02                         jmp short unpack.004099F9
004099F7    >  DB3F                          fstp tbyte ptr ds:[edi]           转到了这里: fstp:存实数与上托栈
004099F9    >  9B                            wait
004099FA    .  DFE0                          fstsw ax                            fstsw: 存状态字,AX=0000
004099FC    .  66:A9 0900                    test ax,9
00409A00    .  75 06                         jnz short unpack.00409A08
00409A02    .  B0 01                         mov al,1                             AL=1(AL得到1,就一切都好了!!!)表明是合法的浮点数!
00409A04    .  EB 04                         jmp short unpack.00409A0A
00409A06    >  DDD8                          fstp st
00409A08    >  31C0                          xor eax,eax
00409A0A    >  9B                            wait
00409A0B    .  DBE2                          fclex                             清除异常
00409A0D    .  D96D F8                       fldcw word ptr ss:[ebp-8]       fldcw:装控制字:Stack ss:[0012F51C]=1272
00409A10    .  9B                            wait
00409A11    .  EB 56                         jmp short unpack.00409A69
00409A13   /$  AC                            /lods byte ptr ds:[esi]
00409A14   |.  08C0                          |or al,al
00409A16   |.  74 04                         |je short unpack.00409A1C
00409A18   |.  3C 20                         |cmp al,20
00409A1A   |.^ 74 F7                         \je short unpack.00409A13
00409A1C   |>  4E                            dec esi
00409A1D   \.  C3                            retn

……

00409A69    > \5B                            pop ebx         ;  00E7C430     Jmp到这里:EBX=312485797209300
00409A6A    .  5E                            pop esi                                    ESI=2B02
00409A6B    .  5F                            pop edi
00409A6C    .  8BE5                          mov esp,ebp
00409A6E    .  5D                            pop ebp
00409A6F    .  C3                            retn

****************************这个Call还是要看的!!看Call之四******************************
00409A13   /$  AC                            /lods byte ptr ds:[esi]            AL得到第一位的ASCII码:33
00409A14   |.  08C0                          |or al,al
00409A16   |.  74 04                         |je short unpack.00409A1C
00409A18   |.  3C 20                         |cmp al,20
00409A1A   |.^ 74 F7                         \je short unpack.00409A13
00409A1C   |>  4E                            dec esi
00409A1D   \.  C3                            retn

省略
00409A22   |> /AC                            /lods byte ptr ds:[esi]
00409A23   |. |2C 3A                         |sub al,3A                       AL=33-3A=F9
00409A25   |. |04 0A                         |add al,0A                       AL=F9+0A=3
00409A27   |. |73 0F                         |jnb short unpack.00409A38       跳转没有实现
00409A29   |. |DA0D 74F14700                 |fimul dword ptr ds:[47F174]     浮点运算:浮点寄存器ST=0  dword ptr ds:[47F174]=A
00409A2F   |. |8945 F4                       |mov dword ptr ss:[ebp-C],eax    dword ptr ss:[ebp-C]=EAX=3
00409A32   |. |DA45 F4                       |fiadd dword ptr ss:[ebp-C]      浮点运算:ST=0 ,ST=0+3=3
00409A35   |. |42                            |inc edx                          EDX自加1
00409A36   |.^\EB EA                         \jmp short unpack.00409A22       跳上去进行第二次取数
00409A38   |>  4E                            dec esi
00409A39   \.  C3                            retn

这里总结一下:
处理:312485797209300   ST初值是0
33-3A+A=3
ST*A=0
ST+3=3

以后:
31-3A+A=1
ST=3*A=1E(30十进制)
ST=30+1=31
……
最后ST0 valid 3.1248579720930001920e+14     ST0 得到有效浮点数!!!!
EDX=F

*****************************************************************************************************

如果是输入的是合法的浮点数注册码,最后会到这里:
00478A9E    .  3C 01                         cmp al,1                    比较注册标志值,Al=1注册成功!!!!
这一行改为:
00478A9E       3C 00                         cmp al,0
爆破成功!
00478AA0    .  0F85 B1000000                 jnz unpack.00478B57       跳向注册不成功的地方,请重新输入注册码提示框!

不过软件的说明文档表示,程序会联网效验注册码,我试了一下并没有这个现象!不过我总是用着不放心,爆破总是有种不安全感。
用上这个软件后,我上网的速度的确快了不少!推荐一下!
在到达这里之前,程序与一个内置数据66064比较了一下,我在里面转了好久,才明白它对注册一点用也没有!!!!

从上面分析可知,注册码只与注册名的最后一个字符有关。

我的注册码:
注册名:wofan  长度为5
最后一个是n,它的ASCII码是6E
6E*5=226   226的十进制形式是550   
变成5505 它的十六进制形式是1581
翻个倍变成:2B02

两个固定数:6 和 9BB2EB6A
2B02×6=1020C
2B02*9BB2EB6A=44F0A4D4 r 1A28  EAX=44F0A4D4  数太大,扩展到EDX中的是1A28
1020C+1A28=11C34  放在EDX中
EDX与EAX中的值连接起来,为
11C3444F0A4D4
它的十进制形式就是注册码的中间数:
312485797209300

这个中间数减去1000,就得到注册码,当然在输入注册码时,一定要输入它的浮点样式!!切切!!
312485797209300-1000=312485797208300
数一下它有多少位?这里是14位!
那么填入注册框中的数据就是:
312485797208300E+14

我的注册名:wofan
我的注册码:312485797208300E+14

12:55 2005-4-18

by wofan[OCN]

附VB6注册机:
Option Explicit
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long        '函数声明,产生网络链接效果'

Private Sub Image2_Click()
ShellExecute 0, "open", "http://ocn.e5v.com/cgi-bin/bbs/ccb/index.cgi?", vbNullString, vbNullString, 0  '到OCN破解组织
End Sub

Private Sub Image3_Click()
ShellExecute 0, "open", "http://luowei.mireene.com/bbs/index.php", vbNullString, vbNullString, 0  '到飘云论坛
End Sub

Private Sub Text2_Click()

Dim name As String
Dim code As String
Dim lenj As Integer
Dim a, b, c, N, d, e As Double '将常数作label2.caption,解决数制问题

N = Val(Label2.Caption)  'N表示常数&H9BB2EB6A,如查直接赋值,它竟然是个负数,这是VB的错误!

name = Trim(Text1.Text)
lenj = Len(name)
If Len(name) = 0 Then
MsgBox "请输入注册名!", 48, "wofan[OCN]"
Text1.SetFocus
Exit Sub
End If

a = Asc(Mid$(name, lenj, 1))
b = a * lenj
code = CStr(b)
code = code & CStr(lenj)
a = CLng(code) * 2

b = a * 6
c = a * N

b = b * &H10000000
b = b * &H10

c = c - 1000                     '让它转成真正的注册码
a = b + c

code = CStr(a)                   '转换成字串
lenj = Len(code)                 '取它的长度,以便确定浮点位数!
code = code & "E+" & (lenj - 1)  '转成合法的浮点样式注册码

'因为VB6在数据太大时,会自作主张转换为浮点数,这个注机对于注册名长度超过9位,就会得到
'错误的注册码,它的形式就是多了一个E+……这真是莫名其妙!

Text2.Text = code

End Sub

Private Sub Text2_GotFocus()
With Text2
.SelStart = 0
.SelLength = Len(Trim(Text2.Text))
End With
End Sub

by wofan[OCN][PYG]

感谢你看完!


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 221
活跃值: (137)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
2
坐沙发啦。支持
2005-4-18 19:37
0
雪    币: 2943
活跃值: (1788)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
3
Option Explicit
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long        '函数声明,产生网络链接效果'
Const N As Double = 2612194154#       'N表示常数&H9BB2EB6A

Private Sub Image2_Click()
ShellExecute 0, "open", "http://ocn.e5v.com/cgi-bin/bbs/ccb/index.cgi?", vbNullString, vbNullString, 0  '到OCN破解组织
End Sub

Private Sub Image3_Click()
ShellExecute 0, "open", "http://luowei.mireene.com/bbs/index.php", vbNullString, vbNullString, 0  '到飘云论坛
End Sub

Private Sub Text2_Click()

Dim name As String
Dim code, codeyes As String
Dim lenj, d, e  As Integer
Dim a, b, c As Double

name = Trim(Text1.Text)
lenj = Len(name)
If Len(name) = 0 Then
MsgBox "请输入注册名!", 48, "wofan[OCN]"
Text1.SetFocus
Exit Sub
End If

a = Asc(Mid$(name, lenj, 1))
b = a * lenj
code = CStr(b)
code = code & CStr(lenj)
a = CLng(code) * 2

b = a * 6
c = a * N

b = b * &H10000000
b = b * &H10

c = c - 1000
a = b + c

code = CStr(a)                   '转换成字串
lenj = Len(code)                 '取它的长度,以便确定浮点位数!

If StrComp(".", Mid$(code, 2, 1)) = 0 Then  '看看是不是太大的数!
  d = InStr(code, "+")         '取得浮点位数的位置
  e = CInt(Mid$(code, (d + 1))) '取得浮点位数
  codeyes = Mid$(code, 1, 1) & Mid$(code, 3, (d - 4))
       While Len(codeyes) < e + 1   '位数不够,就补零吧!
       codeyes = codeyes & "0"
       Wend
code = codeyes
lenj = Len(code)
End If

code = code & "E+" & (lenj - 1)  '转成合法的浮点样式注册码

'因为VB6在数据太大时,会自作主张转换为浮点数,这个注机对于注册名长度超过9位,就会得到
'错误的注册码,它的形式就是多了一个E+……这真是莫名其妙!
'2005-4-19解决这个问题!
'这么一个简单的问题,都要成为拦路虎!
'虽然有点罗嗦,不过问题还是解决了。VB真是有点麻烦。
Text2.Text = code

End Sub

Private Sub Text2_GotFocus()
With Text2
.SelStart = 0
.SelLength = Len(Trim(Text2.Text))
End With
End Sub

by wofan[OCN]
2005-4-19 02:20
0
雪    币: 328
活跃值: (925)
能力值: ( LV9,RANK:1010 )
在线值:
发帖
回帖
粉丝
4
支持
2005-4-19 12:38
0
雪    币: 207
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
好东东・・・・・・
2005-4-20 19:49
0
游客
登录 | 注册 方可回帖
返回
//