下沙论坛

 找回密码
 注册论坛(EC通行证)

QQ登录

QQ登录

下沙大学生网QQ群8(千人群)
群号:6490324 ,验证:下沙大学生网。
用手机发布本地信息严禁群发,各种宣传贴请发表在下沙信息版块有问必答,欢迎提问 提升会员等级,助你宣传
新会员必读 大学生的论坛下沙新生必读下沙币获得方法及使用
查看: 3899|回复: 0
打印 上一主题 下一主题

Eagle的破文:(重写)FlashGet1.65的算号器

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-11-1 13:35:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Eagle的破文:(重写)FlashGet1.65的算号器
* ]' a" _+ s: E: O1 G# e1 P: N; \9 p! k- V
再次声明:本破文曾发表于www.chinadfcg.com
4 b+ U# ~# e" r4 ~1 Y) ^声明:上次写完1.60A的算号器,LeNgHost告诉我,FlashGet会在一段时间后验证第四段KEY,所以现在针对最新的FlashGet重写了算号破文。谢谢大家的支持。其实,这个算号器算出来的号还不是正版的。只能用一段时间,因为最后的几段的算法我没有时间去找了。* u( j6 u' v. n. d8 \; u/ I( i! X' ^

: _3 H$ @5 {4 Y. S1 c【破解作者】 Eagle
, m+ i9 w0 b+ g6 P. J( H& Q( I* Y【作者邮箱】 eagle_twenty@163.com) X9 d( Z& {- z
【使用工具】 OllyDbg1.09
' i1 a$ K+ i+ e【破解平台】 WinXP( {- u! H5 F) {7 C- Q% F
【软件名称】 FlashGet1.65
8 O+ K: Q, A) W: L6 i【加壳方式】 无壳, h/ k5 e$ e; N* p7 C4 Q
【破解声明】
& x2 q1 N, e$ ?/ g7 E--------------------------------------------------------------------------------
- |" q# r: Y: l$ f' R) o) ]【破解内容】5 L- w- U# s4 x* `& a

3 ]; m$ p( J' w$ e- B  u1 C' v5 D3 {) J" f
安装FlashGet1.60A并运行,输入完注册码的时候,它会提示重新启动软件来检测是否注册成功,同时用RegMoniter监视到FlashGet1.60A写入注册表项RegPass, RegName等。用PEID侦壳:无。
+ u& N& N/ U/ {2 `' ~" h! ^7 `! v' c2 p3 m
1.用OD加载FlashGet1.60A,查找参考字符串,在涉及RegPass的地方下断,运行
; H( j$ B4 F) R  h+ g+ _" B2.程序第一次即中断在此,从上下文来看,这段代码有大量的跳转,有很大可能是注册码验证代码! @& {( x7 V0 |7 n6 N6 t
0041DCE6  |. 68 98E55200    PUSH flashget.0052E598                   ;  ASCII "RegPass"$ k$ B: L, o4 P; X* Y
0041DCEB  |. 8D4C24 1C      LEA ECX,DWORD PTR SS:[ESP+1C]
6 O( d1 B7 H  k. ~- Y0041DCEF  |. 68 A0C15200    PUSH flashget.0052C1A0                   ;  ASCII "General"
3 z+ B( ]0 D" M4 Q; |9 r0041DCF4  |. 51             PUSH ECX
( L+ v( I. I# Q# F7 b. D0041DCF5  |. 8BCD           MOV ECX,EBP
$ Q4 C+ D" H# C;这个CALL将从注册表中读入注册码) Q" K' `+ O8 l) g& ~3 v
0041DCF7  |. E8 54C70C00    CALL flashget.004EA450
+ k* K' \0 V+ z2 z. ^; H4 M' S: v( q0 |
4 U6 G1 `# R" Z
分析下面一段代码,可以发现每个条件跳转都跳向flashget.0041DE7B,可以那儿就是验证失败后的跳转方向' F2 u: E9 x8 K* [. g" i8 N
……0 f; f8 a0 q) D0 `1 E: @
0041DD27  |. 0F84 4E010000  JE flashget.0041DE7B9 S" Q% ~: r0 \, D% I. H
……
$ u9 f4 v, f6 Z1 Z$ o0041DD35  |. 0F84 40010000  JE flashget.0041DE7B
4 ?" z, y' D6 v7 f! i……0 t0 Y4 C% R2 [+ o& a
0041DD4F  |. 0F8E 26010000  JLE flashget.0041DE7B
) R* X- L, X% e0 a……
5 A. U8 O' h0 Z& P5 }" g0041DD63  |. 0F8C 12010000  JL flashget.0041DE7B% A; {5 G% F2 m8 O2 }8 \6 B. L
……
% Z& b4 ?/ u' E- i# g  w0041DD77  |. 0F8C FE000000  JL flashget.0041DE7B
/ {( @/ C9 p6 B( d! \! M……/ m; c9 s3 L& u; [  L0 `8 `
;下面这个CALL是计算KEY的长度的,要求的KEY的长度为0x2C,也就是44位
1 m4 u/ [  u* L' I8 {  u: F3 K0041DD86  |. E8 F4200B00    CALL flashget.004CFE7F
; {& }. N$ A; ?0041DD8B  |. 8B55 00        MOV EDX,DWORD PTR SS:[EBP]0 a2 b: S  p8 E" A+ T
0041DD8E  |. 8B42 F8        MOV EAX,DWORD PTR DS:[EDX-8]
( V# I$ u" |8 S6 _0041DD91  |. 83F8 2C        CMP EAX,2C* w6 z& G- s9 s/ F
0041DD94  |. 0F85 E1000000  JNZ flashget.0041DE7B
5 y9 `# Y' g# a2 `% K/ r
7 E& h- x) o+ \. `4 X$ O5 L;下面是验证注册码的类型的,fgc-和fgf-两种KEY的验证算法是一的,2 [9 @$ I7 x/ Y9 c7 Q+ Z
;但用来对KEY进行解密的密钥是不一样的,我们可以看到密钥类型的标志是存入DWORD PTR SS:[ESP+10]9 y9 r& t- Y- b+ k9 [4 A7 F5 B- E
;这次破解我们用的是fgf-的类型的密钥# S/ Z6 `( K/ _: K
0041DD9A  |. 68 B0E55200    PUSH flashget.0052E5B0                   ;  ASCII "fgc-"
: Z" }* f4 z* e* I0041DD9F  |. 8BCD           MOV ECX,EBP1 i4 R1 }6 O- B/ N
0041DDA1  |. E8 401D0B00    CALL flashget.004CFAE62 t) Z# a: e0 R
0041DDA6  |. 85C0           TEST EAX,EAX
) g8 A  v9 b% }. b- q' |0041DDA8  |. 75 06          JNZ SHORT flashget.0041DDB06 j' n3 n4 W! B2 ?5 F8 @
0041DDAA  |. 895C24 10      MOV DWORD PTR SS:[ESP+10],EBX
: C! w) ~9 G$ d0 |0041DDAE  |. EB 18          JMP SHORT flashget.0041DDC8% N6 [! D% n% _) d5 D+ h. ^8 n. P& Z
0041DDB0  |> 68 A8E55200    PUSH flashget.0052E5A8                   ;  ASCII "fgf-"9 g$ C5 p- V& ^  @
0041DDB5  |. 8BCD           MOV ECX,EBP% k3 }8 I( [) H, P0 \% r
0041DDB7  |. E8 2A1D0B00    CALL flashget.004CFAE6
& D! E: v; d7 i! J; |) N; Y  `0041DDBC  |. 85C0           TEST EAX,EAX
1 ]7 O7 P/ T" C$ O0 P5 ?3 }3 P0041DDBE  |. 0F85 B7000000  JNZ flashget.0041DE7B: Q$ A) v+ i( l' w" t2 S
0041DDC4  |. 894424 10      MOV DWORD PTR SS:[ESP+10],EAX
! H7 b+ E' E3 Q- q
& N% q3 J0 d% S# _& I5 O" [6 ], |3 c* a4 ^0 o
;下面是对KEY的验证算法  Y$ Z: k, t( |& Z3 J
0041DDC8  |> 6A 2C          PUSH 2C
  w- L9 y* D& f6 E; v0041DDCA  |. 8BCD           MOV ECX,EBP
4 H3 g* X0 v' W- S# x( y0041DDCC  |. E8 7A680B00    CALL flashget.004D464B
- j+ [% v) ]1 W& `% F! _0041DDD1  |. 8BF8           MOV EDI,EAX6 D! z9 Q4 {2 t2 o: y4 Q, {
0041DDD3  |. 33C9           XOR ECX,ECX7 m9 E: x. q0 u- }7 ~
0041DDD5  |. 83C7 04        ADD EDI,4
$ c% s+ ]7 M+ x$ d% b$ F. i0041DDD8  |. 33F6           XOR ESI,ESI& V! h$ Y2 D- k' K5 Y& [
: K  R* z, H8 I* U& Q$ F
' l& N6 U# p, n8 B* }7 M0 B
分析下面一个循环,我们把每一段KEY的四们定义成ABCD,则有
2 E; ?' a6 O1 O, V/ w( S: ^4 r$ r0041DDDA  |> 8B07           /MOV EAX,DWORD PTR DS:[EDI]% C/ r0 {) J  ^+ `8 u. V" [' M
0041DDDC  |. 8BD6           |MOV EDX,ESI) o: O. @$ M$ L- T& ?2 H, U; x
0041DDDE  |. 83C7 04        |ADD EDI,4
, L1 |# ^; c6 h6 }/ u* c& G( R0041DDE1  |. 83EA 00        |SUB EDX,0                               ;  Switch (cases 0..2)# |9 o. J% b* s6 [
0041DDE4  |. 894424 1C      |MOV DWORD PTR SS:[ESP+1C],EAX8 \& Q# ], t, r4 Q: ~, @
0041DDE8  |. 74 26          |JE SHORT flashget.0041DE10- t: C8 ^) @6 @3 }# R2 D. X
0041DDEA  |. 4A             |DEC EDX
7 `& n5 M3 q" `1 \, D0041DDEB  |. 74 17          |JE SHORT flashget.0041DE04
, n. l( V% t9 [) {# r& f0041DDED  |. 4A             |DEC EDX5 a) F+ n, P/ [# n& C( B2 N
0041DDEE  |. 75 38          |JNZ SHORT flashget.0041DE28( N# c1 p: R, [5 C; S) u9 G
3 p1 y5 x! d* K/ ^6 [* m# G
0041DDF0  |. 0FBE4C24 1E    |MOVSX ECX,BYTE PTR SS:[ESP+1E]          ;  Case 2 of switch 0041DDE19 p/ e' w: F* q4 w
0041DDF5  |. 0FBED4         |MOVSX EDX,AH& _( ]; [# f$ r' L7 q
0041DDF8  |. 0FAFCA         |IMUL ECX,EDX& K! Q" D& n. h( n. I4 f9 }
0041DDFB  |. 0FBE5424 1F    |MOVSX EDX,BYTE PTR SS:[ESP+1F]% t& V5 I0 \' |; V) r
0041DE00  |. 03CA           |ADD ECX,EDX
" O, a8 j  A! D, ?( k0041DE02  |. EB 1F          |JMP SHORT flashget.0041DE23" W9 F" x/ d+ ]$ ^! Z8 X* ^* A
;ECX = B * C + D
: w$ L3 j0 u4 K/ a9 S: h2 [
: d. C6 M+ b% ^9 M7 y6 R+ D" ], P
8 @5 o( F* C+ w& Z0041DE04  |> 0FBE4C24 1E    |MOVSX ECX,BYTE PTR SS:[ESP+1E]          ;  Case 1 of switch 0041DDE1; P" c4 h0 `- ]; i
0041DE09  |. 0FBED4         |MOVSX EDX,AH) P7 z1 i4 W$ T7 \3 @4 d: u
0041DE0C  |. 23CA           |AND ECX,EDX  I9 k* P$ Y2 n: a; i6 j
0041DE0E  |. EB 0B          |JMP SHORT flashget.0041DE1B0 I: h0 G" q3 U; @$ U$ g0 |
;ECX = C AND B
% G- g0 b5 Q- q* y+ |1 m8 w. W' y  A5 k6 C! o

4 c- D- f8 i$ K0041DE10  |> 8A4C24 1E      |MOV CL,BYTE PTR SS:[ESP+1E]             ;  Case 0 of switch 0041DDE1
) Q) W; X' W# j* O; l9 q, g0041DE14  |. 8AD4           |MOV DL,AH
9 z. n: Z, A2 Z* X/ W0041DE16  |. 33CA           |XOR ECX,EDX
: x* \; l  t3 k0041DE18  |. 83E1 7F        |AND ECX,7F
" \3 H* `9 K2 v: Y9 A/ E;ECX = C XOR B,不要被后面的那个AND ECX,7F迷惑了,它只不过是用来把高位屏蔽的" ]. E0 U& m" m5 H0 P8 ]7 K

( `6 `: n/ ~' a  h5 ^+ C+ ~8 L
) j6 D: }% E) y9 Y- n' @3 Z0041DE1B  |> 0FBE5424 1F    |MOVSX EDX,BYTE PTR SS:[ESP+1F]  J4 A( W7 W6 n( o; t( O! i( _
0041DE20  |. 0FAFCA         |IMUL ECX,EDX0 e6 Q, \' C4 i
;ECX = ECX * D7 j# P* f% y6 h. [

0 @2 Q" `/ G$ r- _, a0 F; g: d2 {# U) g! E( o2 `: Z# t
0041DE23  |> 0FBEC0         |MOVSX EAX,AL0 C' C7 F  T1 B7 I9 R  F
0041DE26  |. 03C8           |ADD ECX,EAX. Q- ^3 @5 N" R/ F: I: D4 V' s
;ECX = ECX + A1 m! k5 e' U0 j( }! l3 {6 Y* h6 `
;处理后那些跳转,可以得到
9 y& _' y8 y" G2 ~) q;Case 0:ECX = (C XOR B) * D + A( _2 s( M, f) r0 x$ }1 b, j  d3 l
;Case 1:ECX = (C AND B) * D + A1 v$ R% G( y# d  D- J2 H
;Case 2:ECX = B * C + D + A
( }, ?9 t9 S3 R: `4 x
6 }4 `' W. j% z, }! I& J: W
% f! O4 v. j8 b( _6 Y' z
0 L9 _) x8 c% n) L8 X4 j;下面是用验证密钥来对算得的ECX值进行验证,我们来看它的密钥获取方法. |4 y* W; Y. i  n6 P3 F
;密钥存放在DS:[52C72B]起始的一段空间,为kevinhyx12345,7 j5 `" C" V% h* |2 @
;如果KEY的第一段为fgf-,运算所用到的密钥是顺序从这个字符串中读取的,
# \' R  L" Z" J( v8 F! D;如果KEY的第一段是fgc-,运算所用到的密钥是顺序在Case 2的时候会从DS:[52C72B]中读取,即密钥的第四位: i
: Z3 K& I" M, `% L8 `: d0041DE28  |> 8B4424 10      |MOV EAX,DWORD PTR SS:[ESP+10]           ;  Default case of switch 0041DDE1% x  v) A# b5 I# [
0041DE2C  |. 85C0           |TEST EAX,EAX' ^* Z' r" F4 v# X, d/ t5 z4 }
0041DE2E  |. 74 0C          |JE SHORT flashget.0041DE3C' ~4 e. f2 r$ z1 }+ q( i, [1 D
0041DE30  |. 0FBE1D 2BC7520>|MOVSX EBX,BYTE PTR DS:[52C72B], X. w* U$ }& P
0041DE37  |. 83FE 02        |CMP ESI,2
. d3 T/ f; j4 O0 D: }1 x0041DE3A  |. 74 07          |JE SHORT flashget.0041DE435 P6 c6 u. o. g4 h8 t4 _
0041DE3C  |> 0FBE9E 28C7520>|MOVSX EBX,BYTE PTR DS:[ESI+52C728]$ J# `" ~. o1 K$ @

) r2 B4 d9 p; I# w- Q;对于运算结果的验证也很简单,只是用密钥的ASC码来除ECX中的值,余数在EDX中。
# @: J' B& Q) i. _$ t% @0041DE43  |> 8BC1           |MOV EAX,ECX/ X9 `5 b9 U- \& i, w6 B
0041DE45  |. 33D2           |XOR EDX,EDX
) }* @2 {/ H( f0041DE47  |. F7F3           |DIV EBX, F6 ?) G0 v0 C& ~& ]+ J

% \9 l9 j6 s9 Z2 n6 [0 r9 j
$ Y! g7 e! s1 W' q
1 ~! \8 g% @1 q) F+ p: n6 \;以上是对指定段的KEY的验证运算,下面是对结果的判断
- o1 b0 c" W; Z* X( W3 H0 q7 M0041DE49  |. 8BC6           |MOV EAX,ESI
, V) G. R3 `* n. V0041DE4B  |. 83E8 00        |SUB EAX,0                               ;  Switch (cases 0..2)
9 o4 m1 _0 c6 |3 q; e0041DE4E  |. 74 13          |JE SHORT flashget.0041DE637 T+ e# E% S5 a# p0 z3 U  m, S
0041DE50  |. 48             |DEC EAX
, h1 {% _$ l3 n: u# x0041DE51  |. 74 09          |JE SHORT flashget.0041DE5C* p+ z' _# m7 Y
0041DE53  |. 48             |DEC EAX
9 w9 R: s, m2 w( O8 ^2 G0041DE54  |. 75 11          |JNZ SHORT flashget.0041DE67
  E( b' w% ~0 q  Q4 T7 ~
2 c; w, _7 W) F' D;余数是否为0
( U' U! p8 F, f& \0041DE56  |. 85D2           |TEST EDX,EDX                            ;  Case 2 of switch 0041DE4B0 F3 b" Y) X# W$ o9 z, K* O* g
0041DE58  |. 75 18          |JNZ SHORT flashget.0041DE72( c* q8 i9 @; H
0041DE5A  |. EB 0B          |JMP SHORT flashget.0041DE679 l) |: Q+ g% E1 ^
8 ]; Y& A3 Q; d
;余数是否为8/ P, }/ R- _5 p  I
0041DE5C  |> 83FA 08        |CMP EDX,8                               ;  Case 1 of switch 0041DE4B
! b6 D) G& F$ i+ q* y) q& v  ?; V0041DE5F  |. 75 11          |JNZ SHORT flashget.0041DE72
, W/ d! m" J* W2 D- @3 r0041DE61  |. EB 04          |JMP SHORT flashget.0041DE67
9 x# ?- E7 K0 c* f! k6 m/ ]/ c9 x! j6 f3 @1 @
;余数是否为0
3 ^5 O) T8 p! Q! W* P9 O3 j0041DE63  |> 85D2           |TEST EDX,EDX                            ;  Case 0 of switch 0041DE4B5 I" l- r& M  S2 @8 s" C
0041DE65  |. 75 0B          |JNZ SHORT flashget.0041DE72( i: O0 a0 y6 E( {& g( Q

# w; @5 [& m, C6 B8 A$ e4 W% w0041DE67  |> 46             |INC ESI                                 ;  Default case of switch 0041DE4B
) m0 A2 S9 N  o: H' ~  k0041DE68  |. 83FE 03        |CMP ESI,3
5 k8 |8 e1 q: p6 _0041DE6B  |. 7D 23          |JGE SHORT flashget.0041DE90
3 ?! e5 a4 m5 Z% R3 B, P3 {( \0041DE6D  |.^E9 68FFFFFF    \JMP flashget.0041DDDA, E  h4 G. h+ R- H
) m. p% `$ G& n- u+ [
所以这三段的KEY的验证算法是:
8 `; ~% X# w; I/ y, d4 F, J( wCase 0(B XOR C) * D + A) MOD X = 0,这儿X是'k'
. L$ G3 M0 q% M, u; NCase 1(B AND C) * D + A) MOD X = 0,这儿X是'e'
8 U! L4 r) }; U. x9 o; ICase 2B * C + D + A) MOD X = 0,对于fgf-类的KEY,这儿X是'v';对于fgc-类的KEY,这儿X是'i'& ]4 i; p% k+ Y4 l" Z
/ T' h, ]3 U" [
LeNgHost告诉我,FlashGet会在一段时间后验证第四段KEY,于是我就在程序正常运行后在那段已经读入内存的KEY上下了内存断点,并在RegPass也下了断点。出去逛完一个下午后……中断成功了……2 w) t8 E2 }# q6 ]- |; k, [
0042514C  |. 8B48 10        MOV ECX,DWORD PTR DS:[EAX+10]3 B9 i% V) m# c3 z* s& I
0042514F  |. 83C0 10        ADD EAX,10/ s5 x6 b; C1 H; a$ L; {- z- |
00425152  |. 894C24 08      MOV DWORD PTR SS:[ESP+8],ECX9 u# C* L  m( t' {
00425156  |. 6A FF          PUSH -1/ ^5 U  C0 \( l7 d7 f- z) e
00425158  |. 0FBE4424 0E    MOVSX EAX,BYTE PTR SS:[ESP+E]+ E- f3 ~3 G. W2 g
0042515D  |. 0FBED5         MOVSX EDX,CH
! G, R8 t; u9 z9 I00425160  |. 0BC2           OR EAX,EDX
1 i) |9 y4 [! C5 l- b/ j00425162  |. 0FBE5424 0F    MOVSX EDX,BYTE PTR SS:[ESP+F]2 d! [' }8 T) d+ U& z2 X
00425167  |. 0FAFC2         IMUL EAX,EDX
1 L5 y; G% b, |9 z  _& w. Y0042516A  |. 0FBEC9         MOVSX ECX,CL
1 H' D4 a4 Y; O9 p0042516D  |. 03C1           ADD EAX,ECX
! K9 V2 z3 ]: m/ {% K) A;跟踪分析得EAX = (B OR C) * D + A
; v0 |$ b( V7 i2 Z+ f+ k" [
, ?: h% f! ]2 i! s- x/ O8 h" a0042516F  |. 33D2           XOR EDX,EDX
8 ^0 w& @6 o$ _: e6 `" {  d! p$ z  h+ E# l4 D! Z8 F
;验证用的密钥直接来自DS:[52C72B],哈哈,就是'i'% Y! A6 C3 y; A; ~3 j/ `( R, _
00425171  |. 0FBE0D 2BC7520>MOVSX ECX,BYTE PTR DS:[52C72B]; e4 ~( C! m2 v7 D
00425178  |. F7F1           DIV ECX7 r3 G; k- ?7 G" S
0042517A  |. 8BCE           MOV ECX,ESI" k2 q- i' [* \
+ k. r5 i$ b1 M. t7 ~
;判断余数是否为0
) g! z+ j' ?: W8 G0 T2 S0042517C  |. 85D2           TEST EDX,EDX! @" f* g- L3 H# Z
0042517E  |. 74 1E          JE SHORT flashget.0042519E
8 M6 K/ Q1 D1 }- H, x' _, X/ \$ d# r$ C% S. u" m
所以这一段的算法是((B OR C) * D + A) MOD X = 0,这儿X是'i'8 w) X5 x4 D* c" P( L

) K- T5 |3 }% i3 X' a3 s( }9 B* N
: ~5 ~4 w5 n8 o7 U8 I* n$ ]; h只要KEY能符合这四个条件就可以了。我用VB做出了对应的算号器代码:+ G# `1 b% B+ k1 @! ~# C8 j% a
    Randomize/ j9 J( x# n! w! A) o0 ^' ?
    Dim intEbx As Integer
8 I( y0 K& b1 P" V4 X    Dim i As Integer, j As Integer, k As Integer, intChar As Integer
7 y8 A- y* t* g" x% A5 N    Dim strCode As String% h& n/ z1 t7 B8 z& b. G3 g# o0 z
   
. @5 k; K- j! H3 B1 `) i: W4 l$ [    If fgf Then
3 E0 U8 T; f6 h1 o5 v        strCode = "fgf-"
6 U0 K1 Z! U, p        intEbx = 118
' x$ L& a: z  f. r1 a4 d    Else" o' B8 ~7 s7 i$ g7 L
        strCode = "fgc-"
( Q$ Y; s* @+ S* Y& j6 e7 l        intEbx = 105
- E/ K# B* {' l2 o7 W    End If
6 K; \/ Q! z. r   
4 c; V7 M9 I0 U9 X    Do
6 X& v6 l) y8 b" V4 e% x        intChar = 97 + Int(Rnd() * 25)4 N1 A6 W/ i8 Q5 Q
        For i = 48 To 57. S. O; c9 n+ ~
            For j = 48 To 571 L9 T$ V! \) U! g  m
                For k = 48 To 57$ r/ A: z, C$ w8 F
                    If (((i Xor j) And 127) * k + intChar) Mod 107 = 0 Then
3 r1 [9 E4 |5 G0 I                        strCode = strCode & Chr(intChar) & Chr(i) & Chr(j) & Chr(k)+ X/ f- J; n' ]+ ~! C  I
                        Exit Do( u- j$ |! w, R% A- O' D
                    End If' G/ u' i5 Q) p# C/ d% o
                Next k8 R7 u- t# N! ^1 m1 `& k
            Next j
5 @2 [# F$ A# G* C5 Z6 i0 v3 J        Next i
* r1 D, d' @4 y2 G9 t9 r+ v    Loop& ^  S, b  g1 J: d9 g
    & N# [  {3 K2 \" c: j
    Do
: c  f! F, n3 S% [9 @( i) H        intChar = 97 + Int(Rnd() * 25); @- m% b' k  k
        For i = 48 To 570 {; o* _8 u* T2 Y3 A- k3 W
            For j = 48 To 576 V" F* L* o# Q' |
                For k = 48 To 57
& t0 C7 X4 i* x& h/ s4 i. S                    If ((i And j) * k + intChar) Mod 101 = 8 Then
/ f# _3 t" |- a3 t3 M2 E                        strCode = strCode & Chr(intChar) & Chr(i) & Chr(j) & Chr(k)/ y. a  j3 X: T  W
                        Exit Do
7 i6 @; e; h# o, x9 ~4 Z                    End If
+ R; Y+ W3 `4 ]1 M- f- H) J) V                Next k) Q3 ^; X" J9 Z) S  Z
            Next j' R' a1 Z4 g* x8 \- O9 @
        Next i
5 W  {; E* ~' s# R/ N    Loop- M2 n6 x# ]! R" t( r4 I) E+ J
    8 N+ |, R- a% y9 g9 H" L
    Do' F1 {) K- }$ H
        intChar = 97 + Int(Rnd() * 25), N4 o# Q# P3 _/ l: B/ {: f0 }
        For i = 48 To 57  t0 k" p  E4 B2 @
            For j = 48 To 57- ~3 I: w' \' c
                For k = 48 To 57) Z2 R) o4 d! g1 E% N
                    If (i * j + k + intChar) Mod intEbx = 0 Then8 O& o- F5 [1 O1 y) g# [  E  H
                        strCode = strCode & Chr(intChar) & Chr(i) & Chr(j) & Chr(k)1 W  @5 W$ F! ?4 l4 h
                        Exit Do
6 L4 p/ ^9 T, {& [$ m5 o7 @: k                    End If
" z% ]7 `; y% Y* w9 ^1 f8 d/ `1 _                Next k
+ ^6 {) f* }: Z8 K6 B$ o2 p+ g            Next j
8 g% d: b. F9 `        Next i
( d4 X& Q; L) _% K" G# q    Loop; E8 c2 Z! ]( j1 \! g
   
! m  I, n. F) _/ @" C* l- s$ V    Do: K% M! X$ O, D9 ]% v' a
        intChar = 97 + Int(Rnd() * 25)/ \% U8 r" a6 p0 G9 j% T
        For i = 48 To 57" m- d& B6 j& J' t4 }
            For j = 48 To 57
0 ]+ ]# k* S9 E6 L2 V9 ?" Z" m" j, c( W                For k = 48 To 57
0 n) e* u/ a! n1 `& k, R                    If ((i Or j) * k + intChar) Mod 105 = 0 Then( f, V$ C9 `$ o, B0 c; {. C% \' z3 w
                        strCode = strCode & Chr(intChar) & Chr(i) & Chr(j) & Chr(k)5 F+ S$ a) k& R0 W3 @& k
                        Exit Do5 R* x$ P" R& M8 ]  u. _/ t
                    End If
- h6 C' [/ L* Z. ]                Next k
8 e( G5 J$ H& o            Next j
% n, }9 L" N5 b7 Q6 a. r        Next i
3 l$ N' o4 }0 ?( v- a% F    Loop
% l. q9 j0 o0 p. q* M; H; \. S: b   2 v6 _- L+ q7 \
. Q( u. E5 d6 B4 u$ `, ?8 o, i
    '后面的24位随机生成。
3 X0 F  X- `% f$ z5 P) Y    For i = 1 To 6' v0 ^" L6 ~9 \9 @
        intChar = 97 + Int(Rnd() * 25)
+ }% {; @4 T$ r8 Q7 d7 h) X! B. d9 ?        strCode = strCode & Chr(intChar)% F6 S) O' T& L, |+ \9 _& _
        For j = 1 To 31 V  [/ y( P3 n  |
            intChar = 48 + Int(Rnd() * 9)
9 m. ~3 i9 J( w8 I            strCode = strCode & Chr(intChar)
- o3 f1 P# m% y! [& J: W5 |" V        Next j* n+ y: l+ X( A; o7 ], c  m  |
    Next i
" D. U, f+ x# A# S* {5 w
% u/ {5 K. s. c
+ @5 Q7 p; p6 k$ `; T最后字符串strCode就是所要求的KEY
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩

本版积分规则

关闭

下沙大学生网推荐上一条 /1 下一条

快速回复 返回顶部 返回列表