|  | 
 
| ASP程序加密解密方法全面解析 2 R8 D4 d+ A1 A6 Z2007-08-18 16:416 N! I5 [$ H9 M
 
 | 目前对ASP程序的加密方法主要有三种:脚本编码器(SRCENC.EXE)加密、组件加密、自编程序加密,下面我们就来展开介绍这三种加密方法…… ; q" I: |: a% K7 u) v. s( L* Z; t/ |0 A0 Y) f( R; S
 如今,用ASP技术构建的网站随处可见。由于ASP脚本是在服务器上解释执行的(无法编译),因此你辛苦开发出来的ASP代码,很容易被人拷去任意修改,如何保护ASP源代码呢?这是每个ASP站长都会遇到的难题,网上求解这类问题的帖子非常多,下面我们就来谈谈ASP程序的加密方法。8 {* j6 b2 }$ a
 
 9 a' f5 w. L% M: k( L4 _  一、如何加密ASP程序?* e( G! U! a/ H& d5 t7 y1 b; |! B+ |1 P
 $ A, x$ t  W1 p/ P8 f2 l* Y
 目前对ASP程序的加密方法主要有三种:脚本编码器(SRCENC.EXE)加密、组件加密、自编程序加密,下面我们就来展开介绍这三种加密方法。
 2 i- g( @2 D+ [" ]2 w" p& g" y2 D  j; {- c! b3 H0 u- ?
 1、使用微软的MS Script Encode进行加密3 {6 s! P. g, \1 P6 {
 
 , @/ Z, p$ S- [1 n$ S. r1 n, S+ H0 E  微软提供了脚本编码器MS Script Encode(下载地址http://www.itgene.cn/itgene/download/download.aspID=232),可以对ASP程序进行加密。这是一个简单的命令行工具,其执行文件是SRCENC.EXE,需要在DOS下运行。它只加密页面中嵌入的脚本代码,把网页中之间的ASP代码转换成不可读的乱码,其他部分则保持原样不变。加密后的程序,必须使用Internet Explorer 5.0以上版本才能正常浏览。
 ' ]" A/ M% K% O" x" Q5 I. |" @5 _2 T( j' [: |' M9 G  e3 [
 用SRCENC加密之后,文件中被加密过的部分将变成只读类型,假如你修改了加密部分(哪怕只改动一个字),就会导致整个文件不能使用。对于 VBScript,加密后在源文件的第一行会显示:<SCRIPT LANGUAGE="VBScript.Encode">;而JScript(或 JavaScript)则会显示:<SCRIPT LANGUAGE="JScript.Encode">
 7 D/ z! m' o  b% d2 I" R+ ?9 g0 e# M# q( P
 (1)加密方法
 / x4 K  b; Z: _6 l0 U1 Z& I* b7 [+ u! u3 l  {: f. @& f3 L5 n
 单击“开始”/程序/附件/命令提示符,在MS-DOS 命令行中输入以下命令,即可对某个asp文件加密:
 # f+ W+ q6 P! G! S; o9 U1 J& O' f" x7 o7 ~# R# i8 j
 SRCENC      [switches]      <要加密asp文件名>      <加密后的文件名>2 N4 L2 ]0 n0 h1 Y0 [. Q, F& J
 
 0 e' T, j3 j% @/ K$ H  其中[switches]项目可以选以下5个参数8 W5 I: G' j# _5 W# R
 5 \4 C2 F3 L+ o+ [
 [switches] 含义 举例" J" G8 {, O' p
 ' R% d8 |1 {* a8 y1 s- S3 p  b+ B' l5 A
 /s 可选。命令中带了该参数,加密过程中屏幕上就不会有输出。 screnc /s lacl.sct ulacl.sct! w+ W, L. ~) N* L3 i0 M
 
 . n0 |! C4 \( @4 |& K# r" M  对当前目录中的脚本小程序lacl.sct加密,加密过程中屏幕不显示任何信息$ P# ^, R+ }2 D) O# w2 m8 h
 A. }1 F9 C4 U9 w+ t
 /f 可选。指定输出文件是否覆盖同名输入文件。忽略,将不执行覆盖。 screnc /f lacl.asp
 / m' t. k& L, ^+ A# b- M, R/ f5 X' @) `  h+ e- ?9 v
 对文件 lacl.asp加密,并用编码后的同名文件覆盖原文件, P" ]# N6 s! M( ~$ u
 + F6 f4 F9 e. _
 /xl 可选。是否在.asp文件的顶部添加@Language指令。忽略,将添加。2 Y6 C& b, j5 _: p& y) Z- P% i5 P
 
 5 C9 B- W' p$ v0 \: I6 b1 Q6 G  /l defLanguage 可选。指定Script Encoder加密中选择的缺省脚本语言。文件中不包含这种脚本语言特性的脚本将被Script Encoder 忽略。+ {" k% V7 I) X1 f$ Z6 r8 v
 R. J0 u8 F" X; Q& F( {4 p
 对于HTML文件,JScript为内置缺省脚本语言;对于ASP文件,VBScript为缺省脚本语言;对于扩展名为.vbs或.js的文件,Script Encoder也有自适应能力。 screnc /l vbscript lacl.htm ulacl.htm
 - g0 R7 D7 m6 O5 Q2 F5 L( I' k! n5 J1 Y& H8 q& x7 e
 对文件 lacl.htm加密,并生成输出文件 ulacl.htm,确保没有指定语言属性的脚本块使用 VBScript
 $ ~7 j' x1 O! c3 r4 X. T8 l; a) m4 b
 9 g' D+ o6 i% {5 {  a7 {) x5 ]( U3 d4 f  /e defExtension 可选。指定待加密文件的文件扩展名。缺省状态下,Script Encoder能识别asa,asp,cdx,htm,html,js,sct和vbs文件。 screnc /e asp 11\*.* f:\labxw-jm
 2 T: C9 @3 V6 G7 `6 ?. E( t' {, I% K8 U/ o: D1 t' d$ a
 对11目录中的所有.ASP 文件进行加密,并把编码后的输出文件放在f:\labxw-jm目录中
 9 Q4 r5 ^% C. Z6 r: V+ y+ f
 ! F- D7 [* G2 e# X  (2)操作举例# [7 x: @# P  x+ g0 ?
 2 I' C: G' ]* ~% V) _/ K( h
 例如要加密当前目录中的lacl.asp文件,生成加密文件ulacl.asp,则在DOS下输入命令:
 * V. z) O: _9 g$ o/ x5 @+ `; j: a  f/ F8 J/ f5 `) R! o3 ^7 P+ d# a
 screnc lacl.asp ulacl.asp  m6 o: V$ B1 A
 % h% D) `; Y# m
 对当前目录中的所有 .ASP 文件进行加密,并把编码后的输出文件放在f:\labxw中,则使用命令:
 8 b4 |# k/ k7 ?% o4 ?
 * v$ S  `3 T2 h# h  screnc *.asp f:\labxw
 " k; M* ]& n5 r: U5 r0 X( d" ?% T2 K( T% _. L! K9 D& R
 2、使用组件加密asp. M4 \. j4 U' ]) R- U* ~- v
 % @% Y2 G+ X# G+ T" V8 h
 以上被screnc加密过的程序,是可以解密的(解密方法下文有介绍),如果你想彻底保护自己的asp代码,可以通过开发activex dll组件的方法进行保护。4 \1 w7 f1 T2 L$ x( R& S  x
 + g) W( K0 r9 I# O" r+ k& s5 c
 Dll文件是被编译过的机器代码,如果没有源项目文件,是不可能被反编译的,所以组件加密这种方法最安全,也不可能被破解。下面我们来举例说明操作过程,例如你要保护以下asp代码:
 2 K+ z) i% v. b9 J- W
 + n) j+ t5 C) J  set rs=server.createobject("adodb.recordset") & B* \0 T! W0 d
 sql="select * from gq where xs=1 order by date asc"
 / ^7 y0 j1 s3 y, d* ]! z& O  rs.open sql,conn,1,1 " N* c) I1 \; Z: X& u7 H0 K  D' j
 if rs.eof and rs.bof then
 , d) G1 n' K5 w7 M  response.write"<A HREF=new0.asp?lbid=gqx ><%= gqx %></A>"
 . C4 k9 u2 F5 B; O8 |# Y  else ( h: Z) |& x+ I8 L8 E. U
 Response.Write "" & u+ D2 P9 I& Y. b
 end if
 8 E, Q# a/ B& X4 N# X, x+ A3 S  set rs=nothing * y5 [9 n3 V6 F1 `" Q
 conn.close
 , X- {7 \: y& B$ a8 L; ]) @& }  set conn=nothing
 4 H- @+ [- C  k. b) h% `( B
 7 s* j' z, d& k' o# n# p  x6 F  可以把它们改写成VB组件,然后在ASP文件中调用组件即可。操作步骤如下:5 W4 s7 D7 M+ z
 
 , Z3 Y4 A- ?7 `* I  (1)新建一个vb6的activex dll项目
 " j# x, {9 s# W5 H/ Y- x  R
 : P/ t! T3 \+ ?& h& [! W  在属性窗口中,命名你的库模块和项目文件(例如项目名lacl,模块名disp),以后在asp文件中,调用的对象名将为lacl_disp* _. W" o) g5 {0 m3 b7 p' Z
 : t" H+ F% o, p2 ^
 选择vb6中的项目菜单中的references ,选中microsoft activex data objects 2.0 library$ d3 f' j( M6 s' L0 i" e* {
 . o* L' Y9 K- s) y7 a4 B
 (2)编写VB组件
 / |$ q( T+ k- @# n6 D! X" _4 C! H0 a( M+ X+ @# u
 接下来把<欲保护的asp代码>改写成VB组件,代码如下:( N: r- l, H- H, C$ e
 8 g" w/ C8 [! {/ f) ^
 public function html_combo(disp_table as string) as string
 " Z$ Z3 m8 K' `$ Z, S/ t  dim outstring as string ( V0 k+ x, ]9 z" w
 dim conn as adodb.connection
 * O! R8 r  n; o7 @  R# w) u& W  dim rst as adodb.recordset
 7 v# O  O. a# c" r: j  dim sqlstring as string * ~; b: }4 |; ^; \( h# }
 set conn = createobject("adodb.connection")
 ( K' B5 E, b1 E+ S; X  set rst = createobject("adodb.recordset")
 : ^2 q& c/ D! ^- \0 f/ G  sqlstring = "select * from " & disp_table & " where xs=1 order by date asc" 6 g/ q1 D+ Q9 i6 w1 U
 '以上是在VB中打开数据库操作,数据库中的表名、字段名,你可以根据自己的需要修改 1 _- i$ F. ?3 I+ y; O
 conn.open "dsn=sumnet" , O( t! B* |# _. t* l& ~: g
 rst.open sqlstring, conn, 3, 3 ! s/ v, C/ J& R) x6 L9 y
 if rst.eof and rst.bof then
 : A+ }7 q1 S* p* @0 ^" F+ i  outstring = "还没有这类单位信息"
 1 D" Z5 U0 b: C! r0 b  else
 & D' t4 G7 x2 z1 _  rst.movefirst
 6 a/ a7 T6 {9 w( C1 _* ~  outstring = "<A HREF=new0.asp?lbid="&request("lbid") & "></A>" ( T) T! Z6 T4 o; F- ^/ y2 e
 end if 6 v6 v$ I  J  f, Y, C# p6 f8 s
 html_combo = outstring 0 p- s3 @, {# e! ?9 f  |5 F
 rst.close ( y/ i/ J% J6 {3 W6 f
 conn.close : r. P: n+ ?) k+ g$ X) m7 X
 end function , L3 r! E$ z: f8 |3 K# O
 
 - I3 o  N7 i- h; j  v9 g: {; P  写好以上VB代码后,保存项目并开始编译。4 k. q: p6 I. @' s# m
 
 ! h& \9 `  Z/ ^1 Z  (3)生成安装文件
 : C' k$ H* k6 V0 J/ q9 C( H8 |2 V4 J+ i8 `2 g
 打开visual studio 6中附带的package deployment wizard程序,选择刚才建立的activex项目文件lacl;选择package,选择要打包的脚本或使用默认脚本,选择标准安装,为生成的安装文件选择一个存放目录,选择single cab. 其他均默认;然后单击下一步,安装文件就自动生成了!
 : d' m# i) j. M+ f; \% Q- m, }  Z
 2 q4 c3 d, @" A% L$ l2 i6 x) O6 |  (4)在IIS服务器上安装组件
 / _9 ~0 q* g) A9 I  W* B
 9 u7 A. q5 ~) |& ~6 O: d  在IIS服务器上运行这个安装文件,把组件安装到服务器上。7 d/ u' j* c! b' l
 ; {& z7 y2 z6 ]0 V, K: W0 U' U7 u
 (5)在网页中调用组件, [% \! Z0 m& ]3 n
 3 k1 N  S0 O# v; m/ j7 ^
 以后在ASP文件中,通过调用该组件完成原来的功能。在网页中调用你制作的组件,方法如下:
 7 [# [# B8 J$ o1 O6 J0 i! {+ v; {$ ?# ^: h) \* ?" ?- J" s
 <%@ language="vbscript" %> 0 U; Q9 Z4 u. h# [/ b
 <%
 : t3 _  l2 p0 }0 k' }      set diaoyong = server.createobject("lacl_disp.disp") 8 ]. a% L: k3 b& O# T, ^
 %>
 3 [0 p( w+ s! K) n& o3 N2 w      <html>
 : V0 K, c4 d+ L3 i6 j5 `: i      <body> 9 a: [1 Q, v8 n6 |, ?+ y$ X$ H
 <%= diaoyong.html_combo("gq")%> ( `# @! \5 _0 e! I" n: x
 <br> " l) U+ P! f+ K9 K
 </body>
 # D6 J* U% r) t/ _* k9 w      </html>
 - ^  r4 L# _) t9 ^1 r% l9 `9 Y% w  u# U
 : U$ P( A8 M( y- H
 + r& o) n% f: T1 N# Y& S) Z) N  你看,现在Asp文件中的内容只是组件的调用(与以前完全不同),别人即使得到该文件,也无法编辑修改源代码,因为代码都被封装在VB组件中了,对于组件中的代码,外人是无法看到、也不能反编译的!" h4 \- c$ E. w$ X. J. l4 A+ I
 3 P: E) l7 q/ ~# N8 m
 3、自己编写加密程序
 p; t7 `3 W# {! j5 ^5 i* D( c$ S, Q  R' R( S4 L$ c
 组件加密方法虽然不可破解,但是要求你熟悉VB编程,需要把ASP代码改写成VB组件,工作量很大,所以建议大家自己编程来保护asp代码,其基本思路是:写一个加密函数base64Encode和解密函数base64Decode,先用加密函数处理<要保护的asp代码>,得到对应的密文hu;然后再用execute(base64Decode(hu))替换<欲保护的asp代码>。9 |  l) a0 H0 M* e! c% Z" I
 
 , w& @. b' T3 @+ `. U4 ~2 s8 R9 x4 G  例如我们要保护上面那段asp代码,可以这样操作:6 C3 P5 N# q; H9 J$ s
 0 x# d! _# B( X* f- N* m
 (1)用WORD处理<要保护的ASP代码>
 6 E8 d% O2 i1 }2 t6 w2 a) F/ A3 s
 * k, Z" c& w0 r  将<要保护的ASP代码>拷到WORD中;在WORD中,把代码里的段落标记(回车换行)全部替换成“水”这个汉字,方法是:点击“编辑”/替换,光标移到“查找内容”栏,点“高级”/特殊字符,选择“段落标记”;光标移到“替换为”栏,输入“水”,最后点“全部替换”。同法,把代码中的单引号也全部替换成“加”这个汉字。
 # s1 x( f+ T8 p5 M
 7 q1 Y- P5 G+ c! N7 A8 g' d  (2)编写、运行加密程序  ~7 O' U, G" p1 G- G. g* B& x
 7 e9 ?! e* L8 b" t' x5 y$ q9 f$ ?
 在FrontPage中编写加密程序,该程序中有初始化函数initCodecs、加密函数base64Encode(代码如下),把WORD处理后的代码,copy粘贴在inp = ""这句中,最后以test1.asp名存盘;在IE中输入http://127.0.0.1/test1.asp本地运行该文件;屏幕上会显示一大段乱码(例如c2V0IHJzPXNlcnZlci5jcmVhd...),这就是《要保护的asp代码》对应的密文!
 $ Z8 C9 j9 i+ x" a4 J5 |. H6 d0 `; m9 L* I/ V! w$ ^/ U+ w5 E0 L& G
 OPTION EXPLICIT & J9 q6 ?/ }7 h3 \+ r* H
 const BASE_64_MAP_INIT = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" " E9 b( L! n% D6 A6 L) C) ~
 dim newline
 - E" W: E* a8 o2 t4 m1 T  dim Base64EncMap(63) ; V- Y* D- i9 [  Y% K* l
 dim Base64DecMap(127)
 5 N% r8 T5 m0 d: E/ Y% e6 @: I5 s% }  dim inp,hu,encode 8 b& @: U8 g# k
 call initCodecs '初始化
 $ d/ D2 h* w( W- c6 D  inp = "<WORD处理后的asp代码>" '将要保护的asp代码用WORD处理,然后填在此处 & B* X; C4 P+ w6 {5 }
 hu= base64Encode(inp) '调用函数base64Encode进行加密,得到密文hu
 " Z- N( W1 Y. @7 r5 l  Response.Write(hu) '显示密文
 / S1 O2 d2 H- O: b' x  PUBLIC SUB initCodecs() '初始化函数initCodecs
 % \0 H- F# D: V8 s$ Q4 a  newline = "<P>" & chr(13) & chr(10); H2 f9 N/ n1 j4 K- ~9 n
 dim max, idx
 ' O3 }0 v5 V0 m& e7 V4 f! F* H- Q  max = len(BASE_64_MAP_INIT)
 ( T# L9 a, i: E; h( t0 S  for idx = 0 to max - 1
 - t/ R, u3 F. O" U  Base64EncMap(idx) = mid(BASE_64_MAP_INIT, idx + 1, 1)   f2 H7 o6 n6 t3 g0 ^* ?
 next
 7 i* Q' u6 h4 L- ?  for idx = 0 to max - 1
 * [! D- Z6 ^9 ^' V  Base64DecMap(ASC(Base64EncMap(idx))) = idx 9 c; g, S% ^* `8 a: C, m" t
 next
 6 P7 a8 y, ]$ q& N* ]/ X  END SUB
 W: G& d4 k. X$ h  Z$ M  PUBLIC FUNCTION base64Encode(plain) '加密函数base64Encode & o) Y3 o& _) X$ [/ n
 if len(plain) = 0 then
 1 A! l+ @' j9 A1 Y  base64Encode = "" ( D2 [; v2 g$ `7 B$ q6 f
 exit function 2 M: a- H( _8 m" Z5 j; ^8 i. @
 end if ; u& s# {/ L" t. u& e) K8 t
 dim ret, ndx, by3, first, second, third
 1 E+ x6 Q" p. P+ I' ^( v  y- g  by3 = (len(plain) \ 3) * 3
 1 t; V) y& I: N8 {  ndx = 1
 ; Z4 f$ j4 B9 A  do while ndx <= by3 ! N1 R& `" L$ \& c' Z
 first = asc(mid(plain, ndx+0, 1)) : ~) w' T( B, R$ R: Q0 x
 second = asc(mid(plain, ndx+1, 1)) ! o7 l$ `8 P# o: ?
 third = asc(mid(plain, ndx+2, 1)) # {) X: ~- M$ ]+ Z" H
 ret = ret & Base64EncMap( (first \ 4) AND 63 )
 4 j; D3 h) n0 Z# }) T  ret = ret & Base64EncMap( ((first * 16) AND 48) + ((second \ 16) AND 15 ) ) ) n$ a! Z* F  l  _5 f5 K
 ret = ret & Base64EncMap( ((second * 4) AND 60) + ((third \ 64) AND 3 ) )
 # n: k9 q' x# S" O  ret = ret & Base64EncMap( third AND 63)
 3 l: W1 d0 ]9 i6 H  ndx = ndx + 3
 ' A, p% D! q& D4 _  i* ^4 T  loop
 7 G5 _4 a9 u: d2 R5 `& [0 n  if by3 < len(plain) then
 ! Z8 [/ g: r, C# _+ g5 J3 S9 T1 o& v  first = asc(mid(plain, ndx+0, 1))
 + Z. \! f$ x( L- d  ret = ret & Base64EncMap( (first \ 4) AND 63 )
 , x2 N) s1 _/ v1 C  if (len(plain) MOD 3 ) = 2 then ' T8 B7 b0 E: _/ i' u
 second = asc(mid(plain, ndx+1, 1))
 7 O  T& s5 W; ^; w; X9 I- G$ k  ret = ret & Base64EncMap( ((first * 16) AND 48) + ((second \ 16) AND 15 ) )   Z% n2 M( X' ?( S! ~
 ret = ret & Base64EncMap( ((second * 4) AND 60) ) 4 l7 m& l' O+ |5 Z. J7 B+ Q7 x
 else
 7 D( c) q6 |( b+ a9 M- ~9 b) J  ret = ret & Base64EncMap( (first * 16) AND 48)
 * R2 ^& D! _( F) j  ret = ret '& "=" ) g/ m/ V8 ]- a0 u. m: f8 C  |  X
 end if
 / i# [# h" h0 w$ l4 K: E8 F  ret = ret '& "=" 8 {% D3 B0 W% ^" z% j3 T
 end if : f+ ^- h$ U. o" Q/ @
 base64Encode = ret ( p, g. e& g8 m. _1 _
 END FUNCTION 0 B" \" K& z& c$ U( K
 + T/ t0 S7 m2 c
 (3)重新改写要保护的asp文件6 i0 z4 H$ k* H, X
 4 M7 m: Q" c1 j! S- {7 ^. _* W
 改写原来的asp文件,在文件中增加UnEncode 和base64Decode函数,全部代码如下:/ o- T2 r6 y) Y8 e# W9 o$ U
 
 & K5 U5 J# K0 G- s$ D+ f  Dim Hu,Hu2 , Z# f7 P3 o( R
 '拷贝“欲保护asp代码”的密文 将之存放到Hu变量中 # b/ J: s8 @( H. |" T
 Hu=”c2V0IHJzPXNlcnZlci5jcmVhdGVvYmplY3Qo12Fkb2RiLnJlY29yZHNldOMpICAgICDuc3FsPeNzZWxlY3QgKiBmcm9tIGdxICB3aGVyZSB4cz0xIG9yZGVyIGJ5IGRhdGUgYXNj1yAgICAgsnJzLm9wZW4gc3FsLGNvbm4sMSwxICAgICDuaWYgcnMuZW9mIGFuZCBycy5ib2YgdGhlbiDucmVzcG9uc2Uud3JpdGUTvSD7INAg5iAgILUgvyAFILITsmVsc2UgsiAgICAgUmVzcG9uc2UuV3JpdGUg1zxBIEhSRUY9bmV3MC5hc3A/bGJpZD0TJnJlcXVlc3Qo12xiaWQTKSAmIOM+PC9BPuPuZW5kIGlmICAgIL5zZXQgcnM9bm90aGluZyAgICAgICAgsmNvbm4uY2xvc2UgICAgICDuc2V0IGNvbm49bm90aGluZyAgIL4”
 ) I" p. i% f- d& ?& \% ~( q( S' G$ p  Hu2= base64Decode(hu) '还原要保护的ASP代码
 - H1 t) U2 _  E8 r8 u" A  execute(UnEncode(Hu2)) '还原单引号、回车换行,并执行原代码 : L, y9 L# `3 z, X3 v
 ’解密函数base64Decode 6 I: R& q9 g, r+ U  ]- p
 FUNCTION base64Decode(scrambled) 9 U. z- R- j4 f4 S* z( p* W1 V
 if len(scrambled) = 0 then
 4 @/ A3 ^0 h$ _  base64Decode = "" - L: Y% @; ?: v5 V0 _+ y
 exit function ' v$ C% B4 J) @
 end if & H+ H/ A3 |+ G5 U: J# R$ T3 B
 dim realLen + h* b3 S. ~( V
 realLen = len(scrambled) 5 ~9 z% ~# u# E0 q& S1 y
 do while mid(scrambled, realLen, 1) = "=" , W, e+ P0 j  ~# ~& Z+ B
 realLen = realLen - 1 ! b3 S" t4 N% b/ m. @2 \
 loop
 7 D: y0 O+ Z2 P5 |; M  dim ret, ndx, by4, first, second, third, fourth ) ]/ ^$ G1 D$ c) b, _
 ret = "" " t6 j2 }0 e; F# T2 i) P! O
 by4 = (realLen \ 4) * 4 0 r% w! S+ Z! L: O9 k* Q" E7 x/ c
 ndx = 1
 6 G* I) \0 z! ]+ T! f3 F/ b5 p  do while ndx <= by4
 9 F9 B% A$ s0 x/ R4 T  first = Base64DecMap(asc(mid(scrambled, ndx+0, 1))) 1 h# Q6 E  o* ]
 second = Base64DecMap(asc(mid(scrambled, ndx+1, 1))) 5 _  b& |% `1 Y* G
 third = Base64DecMap(asc(mid(scrambled, ndx+2, 1))) * J. q/ Y3 E, Q6 L
 fourth = Base64DecMap(asc(mid(scrambled, ndx+3, 1)))
 & {: \$ r) Z- t9 f  ret = ret & chr( ((first * 4) AND 255) + ((second \ 16) AND 3))
 5 R% Y$ \1 d* ^% t( p6 Z/ j  ret = ret & chr( ((second * 16) AND 255) + ((third \ 4) AND 15)) 2 o: j/ v  D# U& D$ D
 ret = ret & chr( ((third * 64) AND 255) + (fourth AND 63)) 5 f7 g( b+ H( R9 c
 ndx = ndx + 4 : y7 m( s* W" V& z
 loop * L7 v# [; a6 m$ N; f
 if ndx < realLen then
 & x5 R7 M( I7 o$ q  first = Base64DecMap(asc(mid(scrambled, ndx+0, 1)))
 # q7 X$ K. W# ^( V4 \; M6 @  second = Base64DecMap(asc(mid(scrambled, ndx+1, 1)))
 9 \' x4 s% U# Y# U  ret = ret & chr( ((first * 4) AND 255) + ((second \ 16) AND 3))
 - B  L6 `9 @3 @# k) n( S: u  if realLen MOD 4 = 3 then " _' q" i. t4 ~& E% e6 z
 third = Base64DecMap(asc(mid(scrambled,ndx+2,1)))
 ) b& l( F) }- K/ B, Z9 q  ret = ret & chr( ((second * 16) AND 255) + ((third \ 4) AND 15)) : @) k0 }: Q; I. N" W$ @
 end if
 & @8 m3 r: C$ [' e$ r& j. O6 a' O) Q  end if
 , d) F" n2 R2 j: k, ]- F! A- q) n  base64Decode = ret
 4 @5 u; C+ q4 R9 H2 F/ N' n  END FUNCTION " l- V2 Q" j" c" W, z* ?
 '还原单引号、回车换行函数UnEncode
 7 I$ c: g' S6 F/ e! o  function UnEncode(cc)
 4 M1 ~+ R6 `2 l+ K1 J) w6 ~  for i = 1 to len(cc)
 : Q" e7 q) q# X) h; }  if mid(cc,i,1)<> "水" then 0 I" Z+ P: J& m4 ~% S7 b
 if mid(cc,i,1)="加" then
 7 \  L; y/ C. U$ }0 P9 d  temp = """" & temp ; {, F& U9 H+ k+ m% c! T
 else
 6 [; _- q! p4 T* k5 n# Y$ m+ s  temp = Mid(cc, i, 1) + temp 4 `( i) B; r( B2 d" S2 U
 end if
 * e& i8 w+ T- W( X6 \( Q+ n  else 0 {# U, f9 V: Z  d5 s0 K: X
 temp=newline&temp ) {5 r. G  @5 n% _
 end if
 4 N5 L& `1 y$ }; _, R' P5 z, e/ w  next ( H! {& @5 Z  \" e+ e
 UnEncode=temp : Y1 a$ @5 w* L1 K: X
 end function
 ; {; T8 c) @' F" V. l
 ; G# u( s! D% w4 X4 p$ w+ Q. H) E0 p. {. _/ s
 将以上代码以test2.asp名存盘。
 * K- Y9 s: z' _( u3 W9 ~
 9 m4 Z2 G( g( g% V0 Z  (4)用SRCENC加密test2.asp
 8 i# v6 o, @2 B% U8 j0 L; U- v
 # J) Q$ C4 P: A  用SRCENC加密test2.asp,然后把它发布到服务器上,这样别人即使得到该文件、破解了SRCENC加密,也无法看到原代码,因为原代码在test2.asp中是密文(Hu=”c2V0IHJzPXNlcnZlc...),所以ASP代码就被保护起来了!; ]% Y. i; j5 h# v7 @  e6 s
 , p$ n2 ^5 i% ?! E
 二、加密过的asp程序如何解密?0 _- ]3 ?, a  @& Q# d- @% i  C
 0 l$ }4 M" o  v
 如何对加密过的asp程序解密呢?首先我们要告诉大家,用组件法加密的asp程序是无法解密的,而screnc加密过的程序则可以解密,方法是:使用解密软件(ZWDECODE.EXE)。) k1 V7 y( `# Y$ }# p
 
 - }+ l* ^  ~9 `, W5 \2 r  ZWDECODE.EXE(下载地址http://www.mydown.com/softdown/45/45183.html)可以对MS Script Encode加密的ASP文件进行解密,还原出源代码。
 9 @4 B4 {# ~# r9 X! v& k# D
 7 D0 _, Y7 a6 G* j8 o  (1)解密方法1 T& v+ K/ o+ F( V4 k
 / y% k  N( f* o/ G# P/ [
 单击“开始”/程序/附件/命令提示符,在MS-DOS 命令行中输入以下命令,即可恢复原代码:) V- M& L2 x9 ?7 Z* p+ W$ D
 
 - W& l. V; p+ S  M  ZWDECODE <已加密asp文件名>
 # h0 Z- N* i, u
 ' Y, O! n& P' l" h1 K  其中<已加密asp文件名>必需输入,该文件名可带目录路径;也必需输入,这是要生成的输出文件名,也可以带路径信息。) a/ ^4 O% ]% W
 & b. h0 N; [& n, E6 V
 (2)举例. {4 f) g: A: l4 @% ^2 b+ o4 X
 ! z) c; k: q5 I; O7 a# ]2 e
 例如F:\22\lacl.asp曾被screnc加密处理过,现在要恢复其中的源代码,你可以在MS-DOS中输入以下命令:6 d0 O6 f0 C8 k- M5 t7 x& F2 `
 ! r, [, k! K/ N& ^+ n
 ZWDECODE F:\22\lacl.asp d:\ulacl.asp3 B- L; b9 j4 w# m
 5 K# e9 O# k' a6 l
 执行完毕,在D盘上就会生成一个ulacl.asp文件,打开该文件,你就能看到源代码了!
 " ~/ G% @% A$ y5 z' ~! Q+ t+ Q
 | 
 | 
 |