下沙论坛

标题: Eagle的破文:(重写)FlashGet1.65的算号器 [打印本页]

作者: Eagle    时间: 2004-11-1 13:35
标题: Eagle的破文:(重写)FlashGet1.65的算号器
Eagle的破文:(重写)FlashGet1.65的算号器
1 W4 D  _1 I' L3 G3 n" h: E2 @
4 }, n+ ~  w* m5 Z, ?6 l1 i再次声明:本破文曾发表于www.chinadfcg.com
7 S: p# n4 X9 z+ b' d$ x: y# e1 B声明:上次写完1.60A的算号器,LeNgHost告诉我,FlashGet会在一段时间后验证第四段KEY,所以现在针对最新的FlashGet重写了算号破文。谢谢大家的支持。其实,这个算号器算出来的号还不是正版的。只能用一段时间,因为最后的几段的算法我没有时间去找了。8 O3 r1 |% t1 W# y
/ U5 B5 z- i+ K) q8 c/ h0 m. q3 k2 }- `2 t
【破解作者】 Eagle
2 H. j) F, Z; I+ i【作者邮箱】 eagle_twenty@163.com
2 @# o' `% Z7 @【使用工具】 OllyDbg1.09
. i1 u8 [8 [3 t0 x0 M& j3 H【破解平台】 WinXP
. ]" T3 A  W* c- J; |( Y【软件名称】 FlashGet1.65
8 V) g4 A, E/ }【加壳方式】 无壳2 O4 ^* e) M* F- V8 h% @+ p
【破解声明】 7 k( N: t! \0 F( ]8 Y3 F  m4 N; `  \
--------------------------------------------------------------------------------
- @* e( I! z5 R【破解内容】
( f6 L) o3 R) Z7 A$ g) Z# N2 B2 E! a6 Y5 d6 p$ t

3 a( t' N- Q7 |; S& U: t! X+ h安装FlashGet1.60A并运行,输入完注册码的时候,它会提示重新启动软件来检测是否注册成功,同时用RegMoniter监视到FlashGet1.60A写入注册表项RegPass, RegName等。用PEID侦壳:无。* ]/ z7 m  M& E' b% a
! I. i& ]0 G) o
1.用OD加载FlashGet1.60A,查找参考字符串,在涉及RegPass的地方下断,运行# }4 h* R  N; W' ?+ G
2.程序第一次即中断在此,从上下文来看,这段代码有大量的跳转,有很大可能是注册码验证代码; U: |' D9 ]9 W  U( g
0041DCE6  |. 68 98E55200    PUSH flashget.0052E598                   ;  ASCII "RegPass"- o9 H) N+ @4 N* A
0041DCEB  |. 8D4C24 1C      LEA ECX,DWORD PTR SS:[ESP+1C]
5 y: f: A2 N. W4 r0041DCEF  |. 68 A0C15200    PUSH flashget.0052C1A0                   ;  ASCII "General"6 g; w5 A. B9 W! p
0041DCF4  |. 51             PUSH ECX
" E) b' v; x; @, C0 z0041DCF5  |. 8BCD           MOV ECX,EBP
0 d* D) d% S! i; U;这个CALL将从注册表中读入注册码6 H9 m/ `0 ~! n3 Y7 y
0041DCF7  |. E8 54C70C00    CALL flashget.004EA4500 C1 H8 K6 ~* n. `/ Q7 h: \
9 F! K, H! t! X/ y
, e  T( ?! X  X3 r( y" ~- g1 e0 e
分析下面一段代码,可以发现每个条件跳转都跳向flashget.0041DE7B,可以那儿就是验证失败后的跳转方向
0 O$ }9 U) A/ t$ L……; E/ d7 X! X! J& M# H! Z  `
0041DD27  |. 0F84 4E010000  JE flashget.0041DE7B2 y" V7 ~# v& l* Q. b; ?
……
9 I% h1 h+ l" ^' N0041DD35  |. 0F84 40010000  JE flashget.0041DE7B
- Q& q+ i$ X2 p% Z( Y4 M4 U4 P……
  X4 r0 @8 s  r' A0041DD4F  |. 0F8E 26010000  JLE flashget.0041DE7B" [) x$ N$ }& ^
……) G# h. c2 @: R- U: j' t1 h, I
0041DD63  |. 0F8C 12010000  JL flashget.0041DE7B
# }& N7 k" ?: b4 u……
( q) B' L! {2 h0041DD77  |. 0F8C FE000000  JL flashget.0041DE7B
$ T9 [/ I) u5 ?2 U……
, \5 I7 J. L2 j, ~5 X9 T$ Z* K0 h;下面这个CALL是计算KEY的长度的,要求的KEY的长度为0x2C,也就是44位  z. n# x* }% @
0041DD86  |. E8 F4200B00    CALL flashget.004CFE7F
) E3 o$ q: f) y( A: R0041DD8B  |. 8B55 00        MOV EDX,DWORD PTR SS:[EBP]2 X5 l4 N7 M2 U5 `! K8 e3 V* f/ [
0041DD8E  |. 8B42 F8        MOV EAX,DWORD PTR DS:[EDX-8]6 b  U/ L' d& d  S' x) g
0041DD91  |. 83F8 2C        CMP EAX,2C
6 ]' k: q7 |- D; N! S0041DD94  |. 0F85 E1000000  JNZ flashget.0041DE7B% ^) Q$ w* w( z0 Q2 ]
" B4 S5 H& N% s
;下面是验证注册码的类型的,fgc-和fgf-两种KEY的验证算法是一的,
/ w1 z3 T- B* F;但用来对KEY进行解密的密钥是不一样的,我们可以看到密钥类型的标志是存入DWORD PTR SS:[ESP+10]
2 m2 Z6 p: U8 H! \4 W  N;这次破解我们用的是fgf-的类型的密钥
* D! C; x/ o1 p# C  w* p! L0041DD9A  |. 68 B0E55200    PUSH flashget.0052E5B0                   ;  ASCII "fgc-"
, b7 B9 \# B4 W7 _- m0041DD9F  |. 8BCD           MOV ECX,EBP
3 A, x4 D$ Q9 c0041DDA1  |. E8 401D0B00    CALL flashget.004CFAE6, w" {; \/ b# n# }
0041DDA6  |. 85C0           TEST EAX,EAX
+ ?/ Y; C6 c7 m$ R# C* ~$ }9 z: G0041DDA8  |. 75 06          JNZ SHORT flashget.0041DDB0
$ k* }1 U' G3 J6 \0041DDAA  |. 895C24 10      MOV DWORD PTR SS:[ESP+10],EBX
! ?5 B, i) b& z  u9 `; f0041DDAE  |. EB 18          JMP SHORT flashget.0041DDC8' C" o9 f. Z/ S/ X% T, i. M- B9 K
0041DDB0  |> 68 A8E55200    PUSH flashget.0052E5A8                   ;  ASCII "fgf-"0 q9 {/ G8 Y5 O6 a3 I' X
0041DDB5  |. 8BCD           MOV ECX,EBP
! U3 T9 B# @, s5 g0041DDB7  |. E8 2A1D0B00    CALL flashget.004CFAE6* c& x- o: p) A1 [7 c1 A
0041DDBC  |. 85C0           TEST EAX,EAX
+ ~. z% p2 }3 `0 |7 j, ^, G5 e# x3 Z  \0041DDBE  |. 0F85 B7000000  JNZ flashget.0041DE7B
9 R8 r2 g' [( C/ Q" x0041DDC4  |. 894424 10      MOV DWORD PTR SS:[ESP+10],EAX( K4 v. g3 ~0 ^# q- S* `, ]# p! r  @
( ^/ y8 V' y/ s, I% z

! ?+ g, y; e- l+ z5 X;下面是对KEY的验证算法
: C9 K: I# z: D! A! Z+ e' c9 }0041DDC8  |> 6A 2C          PUSH 2C
1 M" m; Q  F" J3 U, ]# K/ e/ V0041DDCA  |. 8BCD           MOV ECX,EBP7 E, s% t& ^6 d. e
0041DDCC  |. E8 7A680B00    CALL flashget.004D464B3 z9 r& l4 M, r: ?
0041DDD1  |. 8BF8           MOV EDI,EAX
7 C* G: I. r& A* `: R; J0041DDD3  |. 33C9           XOR ECX,ECX
9 H5 L: v+ ?) Y& r! |- \0041DDD5  |. 83C7 04        ADD EDI,4: P$ D2 [5 g9 i7 w; E6 H
0041DDD8  |. 33F6           XOR ESI,ESI
/ Y" q- S0 l7 L* S: r: _$ z# B' [1 ^& t( u
3 u. S/ U4 r4 [8 H* k- f8 G% T
分析下面一个循环,我们把每一段KEY的四们定义成ABCD,则有
9 F" b% j6 e+ f2 O0 ]0041DDDA  |> 8B07           /MOV EAX,DWORD PTR DS:[EDI]
5 P1 d# j4 ]% C3 R0 x5 x: A0 Z' }& z0041DDDC  |. 8BD6           |MOV EDX,ESI9 y4 J- ?- S( R" m+ X
0041DDDE  |. 83C7 04        |ADD EDI,4
; {" F: V! b4 D0041DDE1  |. 83EA 00        |SUB EDX,0                               ;  Switch (cases 0..2)
$ v9 z( a, }) ]$ T* |; Q* p' ?0041DDE4  |. 894424 1C      |MOV DWORD PTR SS:[ESP+1C],EAX
$ l; m6 d- f- a  G0041DDE8  |. 74 26          |JE SHORT flashget.0041DE10( Y. O5 n6 ~  R$ D; w4 ^- D
0041DDEA  |. 4A             |DEC EDX
4 f+ c9 l  G" W  b0041DDEB  |. 74 17          |JE SHORT flashget.0041DE04
3 Q  G( M: u; w# D$ h0041DDED  |. 4A             |DEC EDX% _, ]/ c7 A" c9 K
0041DDEE  |. 75 38          |JNZ SHORT flashget.0041DE28
5 h: r, e! S7 ?' D* q# S9 v7 t+ }- p5 g
0041DDF0  |. 0FBE4C24 1E    |MOVSX ECX,BYTE PTR SS:[ESP+1E]          ;  Case 2 of switch 0041DDE1
& d2 T8 A+ y( x0041DDF5  |. 0FBED4         |MOVSX EDX,AH
  E' D6 ?- _3 d0 Q5 @" b1 ^0041DDF8  |. 0FAFCA         |IMUL ECX,EDX
6 D8 k" o2 u* Q9 R7 L0041DDFB  |. 0FBE5424 1F    |MOVSX EDX,BYTE PTR SS:[ESP+1F]& y( T( Q" h8 a+ Y4 t1 p3 b
0041DE00  |. 03CA           |ADD ECX,EDX/ D5 I* p1 m* L, r% O7 C) b
0041DE02  |. EB 1F          |JMP SHORT flashget.0041DE236 W# h* l' c: ^" S# K2 {: G7 G* ]$ c: ~
;ECX = B * C + D
- y: G/ p. E: g
/ R- U% d$ u. ~4 v$ M- H1 c: L7 {2 f% P0 l% I* o
0041DE04  |> 0FBE4C24 1E    |MOVSX ECX,BYTE PTR SS:[ESP+1E]          ;  Case 1 of switch 0041DDE1% w% ?* J. e; O
0041DE09  |. 0FBED4         |MOVSX EDX,AH! d" }7 L( ~4 [3 U
0041DE0C  |. 23CA           |AND ECX,EDX& N4 h* v1 T' }! R
0041DE0E  |. EB 0B          |JMP SHORT flashget.0041DE1B
5 l& s0 l7 j! u' g;ECX = C AND B6 |0 E$ H2 Z" ]3 ~) f! _$ e
9 H" q) E9 ]- W$ [( P
# l1 M: V  S4 e1 y' x
0041DE10  |> 8A4C24 1E      |MOV CL,BYTE PTR SS:[ESP+1E]             ;  Case 0 of switch 0041DDE1
1 y7 x6 L$ j( k% S6 n0041DE14  |. 8AD4           |MOV DL,AH5 X+ q+ }' |. W+ i" D
0041DE16  |. 33CA           |XOR ECX,EDX
1 T( ^4 ?7 L! [) ]4 D0041DE18  |. 83E1 7F        |AND ECX,7F
7 H6 D0 a# c+ ^  L7 i# |4 D;ECX = C XOR B,不要被后面的那个AND ECX,7F迷惑了,它只不过是用来把高位屏蔽的9 e( Q* w  ~* e* X2 S

4 E2 r" Q- ]7 D" e( I" a5 X/ e* q' F- q
0041DE1B  |> 0FBE5424 1F    |MOVSX EDX,BYTE PTR SS:[ESP+1F]
1 y' b5 |- w1 R: R* G  A7 N2 n. v1 F5 M0041DE20  |. 0FAFCA         |IMUL ECX,EDX( ^8 W- h( s. i, ]1 ?. M
;ECX = ECX * D
! B. p7 _5 y" B8 r* N6 w4 `
0 `3 k& k: t. n; Y4 |7 `5 o. j9 H, y4 @" K
0041DE23  |> 0FBEC0         |MOVSX EAX,AL
) N5 \/ `# }( C& H8 `6 v# x0041DE26  |. 03C8           |ADD ECX,EAX
; |6 w$ d) |: \8 t3 G6 h; s;ECX = ECX + A
- }  c9 V6 i% Z;处理后那些跳转,可以得到9 y: t" Y) K( b- g) j+ Z
;Case 0:ECX = (C XOR B) * D + A$ y( G. o* v, j1 c: F$ G
;Case 1:ECX = (C AND B) * D + A& a' U2 h, Q  p' p3 H! _: ]
;Case 2:ECX = B * C + D + A  q# x$ c6 l' G9 w2 R
5 `5 q4 H+ R# Z$ _$ {
2 r9 k% u3 t5 f8 ]

6 Y: a3 ]  R" @# B4 S+ v;下面是用验证密钥来对算得的ECX值进行验证,我们来看它的密钥获取方法+ e# m- J/ l: [8 j! ?
;密钥存放在DS:[52C72B]起始的一段空间,为kevinhyx12345,* L2 Z5 g. ]* \% I: G# l
;如果KEY的第一段为fgf-,运算所用到的密钥是顺序从这个字符串中读取的,, _  R! ^! F- n8 P
;如果KEY的第一段是fgc-,运算所用到的密钥是顺序在Case 2的时候会从DS:[52C72B]中读取,即密钥的第四位: i
( c  W% s. l# Q0041DE28  |> 8B4424 10      |MOV EAX,DWORD PTR SS:[ESP+10]           ;  Default case of switch 0041DDE1  p0 n' T' ?; L
0041DE2C  |. 85C0           |TEST EAX,EAX  p0 _2 w  {3 P: A  Z2 T% U( T4 q
0041DE2E  |. 74 0C          |JE SHORT flashget.0041DE3C$ L4 y5 d( O  c6 U( u$ \$ l# ~4 z
0041DE30  |. 0FBE1D 2BC7520>|MOVSX EBX,BYTE PTR DS:[52C72B]* d* K, p/ s$ T  {/ V# q
0041DE37  |. 83FE 02        |CMP ESI,2
* m, P4 a% J% Z& _* Y! p0041DE3A  |. 74 07          |JE SHORT flashget.0041DE43
; X: s' e$ j% O% L& k$ y0041DE3C  |> 0FBE9E 28C7520>|MOVSX EBX,BYTE PTR DS:[ESI+52C728]" S; ~& X7 Z+ E7 P5 K7 O

  C+ v$ q7 ^  H: B9 B3 b;对于运算结果的验证也很简单,只是用密钥的ASC码来除ECX中的值,余数在EDX中。
! p* W5 }2 j7 J$ b5 P- J8 ~, m0041DE43  |> 8BC1           |MOV EAX,ECX- \" G0 m4 _+ ^# @; M& w
0041DE45  |. 33D2           |XOR EDX,EDX: T. M; Q4 u, E; `
0041DE47  |. F7F3           |DIV EBX8 i# i$ c; M7 t; h& O3 i- O
. D0 @7 O5 n9 t- ?7 I

0 K' a# _4 U: F4 @- c5 y% @* R) q1 L+ M; ^# p
;以上是对指定段的KEY的验证运算,下面是对结果的判断( s. E# q5 v( F& e" A: Z
0041DE49  |. 8BC6           |MOV EAX,ESI
! F4 E% E4 Z$ z& b- l0041DE4B  |. 83E8 00        |SUB EAX,0                               ;  Switch (cases 0..2)
8 y! J# |4 I3 X2 L( u0041DE4E  |. 74 13          |JE SHORT flashget.0041DE63
9 m% Y& r5 |( [2 P; t8 G0041DE50  |. 48             |DEC EAX' J' u7 S; E! g% ~
0041DE51  |. 74 09          |JE SHORT flashget.0041DE5C
! l' n4 m" x$ j) o! e0 T6 m0041DE53  |. 48             |DEC EAX& q" M& p0 e# Y, _- \8 ^; p- R
0041DE54  |. 75 11          |JNZ SHORT flashget.0041DE67- ~/ R( s9 @7 q5 j

! Y- M1 |. I9 U;余数是否为0& N9 ?7 _# K# a( j9 ^
0041DE56  |. 85D2           |TEST EDX,EDX                            ;  Case 2 of switch 0041DE4B1 M1 T$ {2 T3 X6 W1 J
0041DE58  |. 75 18          |JNZ SHORT flashget.0041DE725 Z" |$ e( [, e* d) t1 w
0041DE5A  |. EB 0B          |JMP SHORT flashget.0041DE67
9 q( S4 q2 w. `( Z* u9 T( j: l0 `6 x9 B4 [
;余数是否为8
* j/ U8 W/ ~$ P& z$ [0041DE5C  |> 83FA 08        |CMP EDX,8                               ;  Case 1 of switch 0041DE4B% Q3 t" c+ ?/ o  e- E
0041DE5F  |. 75 11          |JNZ SHORT flashget.0041DE72
1 c, A# q% x4 q8 ^3 W4 m5 T4 o0041DE61  |. EB 04          |JMP SHORT flashget.0041DE67/ r" c5 \! n. U! `

' U: r# n0 x4 B, \: S;余数是否为0
3 R. t8 T* U+ w3 J& C1 y% o0041DE63  |> 85D2           |TEST EDX,EDX                            ;  Case 0 of switch 0041DE4B
3 x5 ?. R+ d# J$ i) J! Y. M0041DE65  |. 75 0B          |JNZ SHORT flashget.0041DE72
3 Q8 [: D7 [( L$ k
6 @/ I+ X2 X0 P: N" M5 _6 k0041DE67  |> 46             |INC ESI                                 ;  Default case of switch 0041DE4B1 G6 f$ d- k# v0 [
0041DE68  |. 83FE 03        |CMP ESI,3, d+ o, ]6 d8 c
0041DE6B  |. 7D 23          |JGE SHORT flashget.0041DE90
1 e  k/ T3 U# f4 W; M& }7 S0041DE6D  |.^E9 68FFFFFF    \JMP flashget.0041DDDA. \, i/ |" w7 `: m- x

# D3 I5 Y# m% F7 {4 V) m所以这三段的KEY的验证算法是:
: n+ o  d7 \# e& ^/ }- L* X& \; ~Case 0(B XOR C) * D + A) MOD X = 0,这儿X是'k'* t% {& W' Z2 \: P
Case 1(B AND C) * D + A) MOD X = 0,这儿X是'e'
" Y; ]9 J; p2 R: q( ECase 2B * C + D + A) MOD X = 0,对于fgf-类的KEY,这儿X是'v';对于fgc-类的KEY,这儿X是'i'5 r0 a; m6 Q, D6 W: }- [5 z7 ~

' b/ f& M% d! D: I$ u8 [LeNgHost告诉我,FlashGet会在一段时间后验证第四段KEY,于是我就在程序正常运行后在那段已经读入内存的KEY上下了内存断点,并在RegPass也下了断点。出去逛完一个下午后……中断成功了……- h8 t: C9 o% b- }' v* Q
0042514C  |. 8B48 10        MOV ECX,DWORD PTR DS:[EAX+10]! d6 T+ C: Q5 e( E, k( [
0042514F  |. 83C0 10        ADD EAX,10
1 U9 J8 h) ^6 I* b  A5 F8 e3 `00425152  |. 894C24 08      MOV DWORD PTR SS:[ESP+8],ECX4 s* c! I( C! |
00425156  |. 6A FF          PUSH -1" }; A5 w& ^% B. I
00425158  |. 0FBE4424 0E    MOVSX EAX,BYTE PTR SS:[ESP+E]
" V0 Q, e6 ]: A& I- L5 q3 l0042515D  |. 0FBED5         MOVSX EDX,CH" T) |; t) \3 F. V3 K
00425160  |. 0BC2           OR EAX,EDX$ B) O1 _) `& ?; n5 z0 L) V1 h
00425162  |. 0FBE5424 0F    MOVSX EDX,BYTE PTR SS:[ESP+F]
" }4 e2 e9 G) I& z4 B5 z+ R' |00425167  |. 0FAFC2         IMUL EAX,EDX
# Y, C+ Y! s0 C* M, o. t4 [. y0042516A  |. 0FBEC9         MOVSX ECX,CL) R3 `0 Y% E6 E" v1 y: p: `
0042516D  |. 03C1           ADD EAX,ECX
9 O. ^, Z, s! r( h" N$ A1 M. w; l;跟踪分析得EAX = (B OR C) * D + A: q, c: Q2 W9 b$ z) l! G) R

# K8 N! X5 h3 t; a8 n. X0042516F  |. 33D2           XOR EDX,EDX
5 M- f% I, z# }0 u6 ?* [" Z% |4 _4 b6 r0 V$ w) V
;验证用的密钥直接来自DS:[52C72B],哈哈,就是'i'
  G, F! n) [# l  s. q00425171  |. 0FBE0D 2BC7520>MOVSX ECX,BYTE PTR DS:[52C72B]' {5 ]- j; M5 f2 }6 T; @
00425178  |. F7F1           DIV ECX
/ b& Y) \( i+ D; H: R/ h& W0 _0042517A  |. 8BCE           MOV ECX,ESI
& G6 }) D1 a- o% ?5 b# \$ I2 A, o& g: T9 r# h7 S; Z9 u" q' o
;判断余数是否为0, O' n! ^2 z+ I8 e2 }
0042517C  |. 85D2           TEST EDX,EDX/ @7 I% s. P% e; v- e8 `- J
0042517E  |. 74 1E          JE SHORT flashget.0042519E( u4 y% C6 c/ a. F) P
$ h6 B4 @  ?  Z
所以这一段的算法是((B OR C) * D + A) MOD X = 0,这儿X是'i'3 n9 y# C0 n0 u

: W( F! ?  H, s5 U/ v) o
/ G* r1 \: a- s% |* V' P5 X8 g只要KEY能符合这四个条件就可以了。我用VB做出了对应的算号器代码:; m- l# R+ \; y$ {. X* }
    Randomize8 j! P9 y/ w9 G$ C6 e: ^
    Dim intEbx As Integer
( N0 b& B! J$ j' L/ U2 L) ?5 g6 h    Dim i As Integer, j As Integer, k As Integer, intChar As Integer* \8 @8 q- [' ]  v
    Dim strCode As String
( l- s% X: R1 |3 ^   
% {# o+ N# U7 b# n$ u- D    If fgf Then
" D& M; D' ~. q. c2 Z        strCode = "fgf-"
! }0 V- Z7 x. E% a5 e; ?+ h        intEbx = 118# [9 L! z/ _! u5 I( u0 \
    Else
# Z9 m. _+ C/ o. E- ^7 G        strCode = "fgc-"8 J  z8 h) f2 R/ v$ q
        intEbx = 105
% P6 G) ?5 g* o. y$ ~0 H6 v    End If: t7 j( \! c% k3 I1 U
   
4 t9 j( x$ V" b8 t    Do; S1 j& N3 ?7 m2 Y& R7 u  d1 R  \
        intChar = 97 + Int(Rnd() * 25)1 w0 {  ~: q; E# R9 v
        For i = 48 To 57
+ m$ T( ^" u7 N+ Z            For j = 48 To 579 `& S. X8 i% y& Q9 u
                For k = 48 To 570 B: H# T4 h5 W7 Z
                    If (((i Xor j) And 127) * k + intChar) Mod 107 = 0 Then
  y' R+ g) W) q7 _/ [/ `                        strCode = strCode & Chr(intChar) & Chr(i) & Chr(j) & Chr(k)
9 \; N2 ]. d& F                        Exit Do
  [* I! I. d3 [% Y8 s                    End If4 t. G8 @4 h! U$ F% r% V9 A
                Next k
  e3 |# d- d6 [  z9 U3 a8 b6 V% F            Next j
. x' x% {: j0 I        Next i
9 y7 j. e( x: V( p- n6 o8 B% j    Loop
3 Y2 p; z2 r9 r8 \. E    9 i- S. L: M$ U$ q( J/ ]6 e( x
    Do# {& c% k" ]4 ~# B& Q0 U
        intChar = 97 + Int(Rnd() * 25)' q+ O2 c% l) h5 ~
        For i = 48 To 57
# b3 ]/ R0 F. X            For j = 48 To 57( e" P( @% \6 t# J7 I
                For k = 48 To 575 X3 y; l' K# g5 x! d) W! n/ v) W
                    If ((i And j) * k + intChar) Mod 101 = 8 Then- E5 _3 }* q- w2 |. U- s
                        strCode = strCode & Chr(intChar) & Chr(i) & Chr(j) & Chr(k)/ J1 E) G: Z5 u" X+ ^
                        Exit Do
% f: D6 P8 C% C7 v( t  c* F                    End If
; V) g- {, y( d3 i: N% F% t( W; B# g: K8 K                Next k# e0 ?9 f6 j3 m9 d1 J6 {. ~4 m
            Next j4 s& Y6 R1 O4 d- ?0 U
        Next i" f/ p* [; @3 [: ^2 O3 |
    Loop
  r8 ]( O8 X; O- [1 t    8 L% }# u$ H/ f0 _. C* [/ i) R1 e
    Do
5 V$ P' B( X- {- u- F0 S        intChar = 97 + Int(Rnd() * 25). L  N6 t; m; R" [+ {$ N/ i" i
        For i = 48 To 57: x4 ~' W- s5 P- ^, o
            For j = 48 To 57
1 |* }7 @/ ?. }( m  @/ V                For k = 48 To 57& H: E7 N) V1 g4 a
                    If (i * j + k + intChar) Mod intEbx = 0 Then7 C' A& d9 t5 N+ t
                        strCode = strCode & Chr(intChar) & Chr(i) & Chr(j) & Chr(k)
! ^) q8 Y/ d, W2 k0 \" \                        Exit Do
8 z* J' [, ?( m) b5 `                    End If
" b$ u! p3 l1 A! P: _                Next k
- `( a, s9 G# T0 _            Next j. o" L+ X: d' J' v' f* ?9 A& w2 p
        Next i8 |( z5 ]6 |" ?0 _$ M5 R, h4 R' Z
    Loop
6 m  @7 s1 X2 v/ w9 I3 W$ x    3 l( r' ?- t5 V* S- _3 N
    Do
9 A3 H3 M' T- s: Z- u& ?+ V  R        intChar = 97 + Int(Rnd() * 25)) W0 _: g* O) n5 @( W5 a: S
        For i = 48 To 57
7 i3 W9 D# A" K" H* F3 h            For j = 48 To 57
3 y' s4 O. I' ~                For k = 48 To 57
& o8 N( X, U0 {% l: T1 K                    If ((i Or j) * k + intChar) Mod 105 = 0 Then' j  T. k- Y' i# U0 Q5 n+ {  X/ G1 o
                        strCode = strCode & Chr(intChar) & Chr(i) & Chr(j) & Chr(k)9 p4 z+ b- S4 ?9 V! y  E' n& B% C
                        Exit Do
" m5 n- z: g) l, s. ~2 V                    End If
& F, I, `/ l+ s4 [- Z5 q                Next k
- Z! m: g. N( M4 k! Y) n# R            Next j
/ b: ^# Y4 z( q8 E7 y4 i        Next i
( i3 X. Q( V8 y% }) Z: T7 y    Loop8 M& q9 H" a# ?0 b: v+ v: o
   ! z4 B% b5 d# }

; x+ s7 i5 B9 _7 i    '后面的24位随机生成。$ B1 o( n2 s# S+ }$ A
    For i = 1 To 6; t+ x2 c* Q  ?. r) H
        intChar = 97 + Int(Rnd() * 25)
  j. f' p3 B0 J        strCode = strCode & Chr(intChar)) x7 ^3 x0 {' @3 W) E
        For j = 1 To 3
; W, p; y  d9 [$ N( _+ `* }4 w            intChar = 48 + Int(Rnd() * 9). J/ t- y# n" b2 b% R' z
            strCode = strCode & Chr(intChar)
* D4 k' q4 W0 V5 l7 ^3 w        Next j
/ T) ^3 y# I- I1 T" I    Next i
1 ^0 P$ L; M- I
& k( Z) r  y. {6 W
2 x3 L& l" K$ ^! v1 k$ L最后字符串strCode就是所要求的KEY




欢迎光临 下沙论坛 (http://bbs.xiasha.cn/) Powered by Discuz! X3.3