| 
 | 
 
ASP程序加密解密方法全面解析" c: R! ?0 {1 k4 C) T5 A5 |; [ 
2007-08-18 16:41. h$ p& L- a8 `( L, ]! U3 ~ 
 目前对ASP程序的加密方法主要有三种:脚本编码器(SRCENC.EXE)加密、组件加密、自编程序加密,下面我们就来展开介绍这三种加密方法……  
6 x0 O, c% \5 S4 ~+ b& [/ u* } 
6 H4 k7 q7 Z2 x/ W  如今,用ASP技术构建的网站随处可见。由于ASP脚本是在服务器上解释执行的(无法编译),因此你辛苦开发出来的ASP代码,很容易被人拷去任意修改,如何保护ASP源代码呢?这是每个ASP站长都会遇到的难题,网上求解这类问题的帖子非常多,下面我们就来谈谈ASP程序的加密方法。 
2 @# C# t9 N2 O7 E! G; t+ v! W7 L; p# l% C 
  一、如何加密ASP程序?3 D4 o" o0 @4 t$ C9 W5 q 
 
3 n: y# B) N- r  M! F  目前对ASP程序的加密方法主要有三种:脚本编码器(SRCENC.EXE)加密、组件加密、自编程序加密,下面我们就来展开介绍这三种加密方法。 
( O" c5 q9 o- j5 D- G! F$ |, e" _& \$ X$ B1 a" d 
  1、使用微软的MS Script Encode进行加密 
* A9 x9 w: [) A( Y# T( R* f% i3 M0 {7 }( O% U. O 
  微软提供了脚本编码器MS Script Encode(下载地址http://www.itgene.cn/itgene/download/download.aspID=232),可以对ASP程序进行加密。这是一个简单的命令行工具,其执行文件是SRCENC.EXE,需要在DOS下运行。它只加密页面中嵌入的脚本代码,把网页中之间的ASP代码转换成不可读的乱码,其他部分则保持原样不变。加密后的程序,必须使用Internet Explorer 5.0以上版本才能正常浏览。 
% X* h! v3 a) ]8 t4 r) W1 T6 Y6 T  B" G: [/ Y+ F4 i 
  用SRCENC加密之后,文件中被加密过的部分将变成只读类型,假如你修改了加密部分(哪怕只改动一个字),就会导致整个文件不能使用。对于 VBScript,加密后在源文件的第一行会显示:<SCRIPT LANGUAGE="VBScript.Encode">;而JScript(或 JavaScript)则会显示:<SCRIPT LANGUAGE="JScript.Encode"> 
1 \  P) |$ y; k  q5 M 
) D% ?/ t$ i7 Z/ B5 G- r  (1)加密方法" a* [$ N$ @( |( h4 Z7 n 
: X% U( L$ D* Z) N5 U& g  D 
  单击“开始”/程序/附件/命令提示符,在MS-DOS 命令行中输入以下命令,即可对某个asp文件加密: 
' G7 q  a5 M  z: U( ~3 H 
3 n! y* h5 c/ o/ N' H- f5 v8 g! V5 S9 N  SRCENC      [switches]      <要加密asp文件名>      <加密后的文件名>1 Q  X% x9 S; ]7 L 
8 q; ~) [& Q7 I, X4 J- Y 
  其中[switches]项目可以选以下5个参数 
" @/ o5 S$ Z. Z: U" A$ e& c* Y 
/ a4 u  l& \% w0 j! `  [switches] 含义 举例0 G( B. `6 D" @; d& P 
 
9 K1 Y5 u4 @0 k$ W! x; }+ G  /s 可选。命令中带了该参数,加密过程中屏幕上就不会有输出。 screnc /s lacl.sct ulacl.sct 
1 j: x9 P3 p, i: e 
/ N6 S) f5 _' H) t9 e7 Q  对当前目录中的脚本小程序lacl.sct加密,加密过程中屏幕不显示任何信息8 J- h" o6 k" } 
" O* v( G, O# o  Z- D5 l  B0 h 
  /f 可选。指定输出文件是否覆盖同名输入文件。忽略,将不执行覆盖。 screnc /f lacl.asp 
/ e' B5 L$ r  N8 x0 ~9 n& J( e( l- G0 y9 e7 l: q 
  对文件 lacl.asp加密,并用编码后的同名文件覆盖原文件" K  Y. n/ b, x- M 
 
0 O" [2 p9 X$ ^  /xl 可选。是否在.asp文件的顶部添加@Language指令。忽略,将添加。 
, y* y: k8 _, Z+ ^ 
0 H' w) t5 e/ t! j  /l defLanguage 可选。指定Script Encoder加密中选择的缺省脚本语言。文件中不包含这种脚本语言特性的脚本将被Script Encoder 忽略。 
' ?/ v% m! g0 N) j# _9 w2 q* C1 G. d$ a 
  对于HTML文件,JScript为内置缺省脚本语言;对于ASP文件,VBScript为缺省脚本语言;对于扩展名为.vbs或.js的文件,Script Encoder也有自适应能力。 screnc /l vbscript lacl.htm ulacl.htm9 \+ L+ |" k: F. R 
7 [2 b' R2 p* }( y3 a 
  对文件 lacl.htm加密,并生成输出文件 ulacl.htm,确保没有指定语言属性的脚本块使用 VBScript 
& d9 }0 R( e! @/ _5 S( g& E2 L2 T5 f/ Z' C" N 
  /e defExtension 可选。指定待加密文件的文件扩展名。缺省状态下,Script Encoder能识别asa,asp,cdx,htm,html,js,sct和vbs文件。 screnc /e asp 11\*.* f:\labxw-jm 
! u* a4 Y7 j, w2 t$ A 
" {) S$ Q9 N% W: f  ?: e  对11目录中的所有.ASP 文件进行加密,并把编码后的输出文件放在f:\labxw-jm目录中 
1 M* C( \. z0 p. s7 e  ~" b2 t; o: e- {4 v% E" X0 n- m 
  (2)操作举例( e. e" {2 |- y- e8 j 
" l/ D) y2 \8 \8 `) [, ` 
  例如要加密当前目录中的lacl.asp文件,生成加密文件ulacl.asp,则在DOS下输入命令:$ d+ F* @5 J5 ] 
 
, L" F4 ?  e; a: y  screnc lacl.asp ulacl.asp# a- Q. j3 |7 f; K0 V+ z 
  r6 k6 H' ~+ x6 @$ j2 @/ D3 D" A/ _) | 
  对当前目录中的所有 .ASP 文件进行加密,并把编码后的输出文件放在f:\labxw中,则使用命令: 
0 M) f! d9 V" O5 n/ Q* }3 L, C  {6 W# {2 W: ~! g" S% A 
  screnc *.asp f:\labxw 
1 t* U- D* w2 F6 J" V/ n# W 
) p) m) T5 G5 H6 ]( o  2、使用组件加密asp 
, b+ Y6 Q2 B  C! @3 {6 a' N# C 
+ }1 \) D* J! ?- P  d& f  以上被screnc加密过的程序,是可以解密的(解密方法下文有介绍),如果你想彻底保护自己的asp代码,可以通过开发activex dll组件的方法进行保护。 
& h4 b( @/ p3 F$ ]+ x, `! H" i 
, A; w& @2 a" I" r  Dll文件是被编译过的机器代码,如果没有源项目文件,是不可能被反编译的,所以组件加密这种方法最安全,也不可能被破解。下面我们来举例说明操作过程,例如你要保护以下asp代码:. s# ?5 L0 [& I3 x  S 
/ l0 w6 O' N" H9 d; J$ G8 t" C3 D! I( N 
  set rs=server.createobject("adodb.recordset")  
' B+ e, q3 z' L  H* Z: |9 N  |- j( h  sql="select * from gq where xs=1 order by date asc" " z$ G3 C7 z& s+ _/ a2 [' X 
  rs.open sql,conn,1,1 . I" v- m  _2 u# {" w7 [- d5 D 
  if rs.eof and rs.bof then 5 d# ^1 `4 k  ` 
  response.write"<A HREF=new0.asp?lbid=gqx ><%= gqx %></A>"  
6 N$ v) T6 B8 o  q; W* w" ?  else  
8 P; ~6 n- ^7 h3 q! e  Response.Write "" # m" E4 y5 W6 d 
  end if 1 |/ O$ g) k) W, U/ @1 a 
  set rs=nothing ! u9 W# M' y6 @8 T, T, ~6 H 
  conn.close 0 R2 y/ b. _" Q: Q/ B; [# A1 ` 
  set conn=nothing ) S  x+ p% P5 R+ q+ x 
. w5 I; [7 R' f7 t# z8 I6 a 
  可以把它们改写成VB组件,然后在ASP文件中调用组件即可。操作步骤如下: 
* w; |- o5 n; l* f. e  Z  O* {# q" Y2 c/ c2 T6 p8 b 
  (1)新建一个vb6的activex dll项目 
% F$ [* l+ M2 C1 I  p0 ^% Q( h$ p4 ~8 B4 o  Z& B 
  在属性窗口中,命名你的库模块和项目文件(例如项目名lacl,模块名disp),以后在asp文件中,调用的对象名将为lacl_disp  |1 N6 S; U- V# _2 n9 q 
 
; }) j5 i; m% z; b2 c! ~; }  选择vb6中的项目菜单中的references ,选中microsoft activex data objects 2.0 library) u6 z9 ]" o1 L9 h5 g; Y 
  ~. T$ X* U  W, [( ]& S! p# S0 L, F 
  (2)编写VB组件& U& g, z. p4 {# Z- s% S( R5 b# j 
1 Q! K2 k5 H3 R: C; M3 R 
  接下来把<欲保护的asp代码>改写成VB组件,代码如下: 
1 P6 h2 o7 V5 y 
2 S+ j$ E/ I2 x1 _. n  public function html_combo(disp_table as string) as string  
( G) P. m0 g& n' R+ q  dim outstring as string * }8 Q& l' \  W1 V 
  dim conn as adodb.connection  
) v8 z' v1 X( ~7 r  dim rst as adodb.recordset ! n3 `: E  d2 B, W 
  dim sqlstring as string  
" M1 F2 r+ j2 ^% ^- A  set conn = createobject("adodb.connection")  
' T1 w6 F0 a$ F" x* J. L  set rst = createobject("adodb.recordset") 3 E: ?# h2 w% T# c4 G9 X5 I2 [0 W 
  sqlstring = "select * from " & disp_table & " where xs=1 order by date asc" 8 s# |# k3 q; O: p3 g 
  '以上是在VB中打开数据库操作,数据库中的表名、字段名,你可以根据自己的需要修改  
8 Y3 {( e; b0 ?3 q" |  conn.open "dsn=sumnet" : P& ~9 \. d- F2 `2 z) X( m 
  rst.open sqlstring, conn, 3, 3  
9 Z  j( E/ o( V. m3 b  if rst.eof and rst.bof then  
1 Y4 ?$ i% C; M4 j/ {* x5 Y6 s  outstring = "还没有这类单位信息"  
  o* s; _- g+ _5 T7 H0 h. M: O" K  else  
% U. `) j+ ~5 h/ A0 Q0 j$ c! C3 B  rst.movefirst  
# {8 w  a' l$ K4 _! G0 f% p1 _: N  outstring = "<A HREF=new0.asp?lbid="&request("lbid") & "></A>" # I9 ?8 }2 x  R" T! b 
  end if $ o/ q3 P5 t! f% X# X. W4 C1 B# ^( u 
  html_combo = outstring  
) i8 f$ P% [4 g. D( @* u4 a9 J  rst.close : ]. E0 }5 u& ` 
  conn.close 9 @3 x/ b! o' ?5 [/ B 
  end function 0 \/ ?( J; }# Q 
 
1 S% @8 h/ B  I! s  写好以上VB代码后,保存项目并开始编译。, F9 m+ g+ K: [5 S 
" ~( d: x# D2 @( `- x 
  (3)生成安装文件 
" d/ ?! ~. K0 o& N' t$ l; B& `0 t/ L. X0 C3 A  B: D- f 
  打开visual studio 6中附带的package deployment wizard程序,选择刚才建立的activex项目文件lacl;选择package,选择要打包的脚本或使用默认脚本,选择标准安装,为生成的安装文件选择一个存放目录,选择single cab. 其他均默认;然后单击下一步,安装文件就自动生成了!% }9 O; @( T, Y% C4 `' Q# k. w 
$ n" x  j' l$ g( n. Q 
  (4)在IIS服务器上安装组件+ Q7 g9 }" W/ w0 g* o( n6 W! t8 ^ 
 
7 t8 [4 E! V8 t% r  t  在IIS服务器上运行这个安装文件,把组件安装到服务器上。 
& q7 Y- d% X8 V* B) G! a$ |) p 
$ [5 r& v8 q$ K  (5)在网页中调用组件 
6 ?( G4 ]1 |5 \( s% N7 O, F 
; q9 o& D5 \( A7 J6 f2 U  以后在ASP文件中,通过调用该组件完成原来的功能。在网页中调用你制作的组件,方法如下: 
6 X) `1 J6 [. Y( a' E( W& Z; s$ g4 ~' D: ] 
      <%@ language="vbscript" %> 2 b( N) v  d( g$ N9 ~! N* c 
      <%  
/ c' _# O6 y) ~      set diaoyong = server.createobject("lacl_disp.disp")  
8 C+ w4 l* `' c      %>                           ( `: v6 j8 [0 d3 t 
      <html>  
8 p, R- `9 N, C) H+ |% t      <body>  
0 g7 b3 Z1 ?& d$ N# W4 L" a      <%= diaoyong.html_combo("gq")%>  
" M2 K0 C9 X  b" ?, F8 E" r      <br>  
4 ^* H' ^6 H/ [  u: w) H      </body> 7 I! J# B& {2 }8 D 
      </html>  
' R! h3 g! d& u  Y1 K: J/ c" D& H0 z9 J9 G" [ 
/ _' A: _( z0 g! F+ G 
  你看,现在Asp文件中的内容只是组件的调用(与以前完全不同),别人即使得到该文件,也无法编辑修改源代码,因为代码都被封装在VB组件中了,对于组件中的代码,外人是无法看到、也不能反编译的! 
8 h7 K' Z8 m" W$ L6 s% Y 
% Z4 w! w2 y2 u* A. {4 g  3、自己编写加密程序! a& r( ~& ]7 {5 N 
! N0 p$ f( V& `: k 
  组件加密方法虽然不可破解,但是要求你熟悉VB编程,需要把ASP代码改写成VB组件,工作量很大,所以建议大家自己编程来保护asp代码,其基本思路是:写一个加密函数base64Encode和解密函数base64Decode,先用加密函数处理<要保护的asp代码>,得到对应的密文hu;然后再用execute(base64Decode(hu))替换<欲保护的asp代码>。 
, a9 v. `2 W6 |: u 
/ W* K3 W3 D* P4 [  例如我们要保护上面那段asp代码,可以这样操作:5 S! |' Y" }" g+ K( D+ p 
 
, J9 A1 y$ ^: T# @7 A$ x6 V  (1)用WORD处理<要保护的ASP代码> 
9 J4 k4 n! T8 r; {* v1 Q! [' u2 c" b 
  将<要保护的ASP代码>拷到WORD中;在WORD中,把代码里的段落标记(回车换行)全部替换成“水”这个汉字,方法是:点击“编辑”/替换,光标移到“查找内容”栏,点“高级”/特殊字符,选择“段落标记”;光标移到“替换为”栏,输入“水”,最后点“全部替换”。同法,把代码中的单引号也全部替换成“加”这个汉字。( \. ?! C, _5 k" p5 v6 Z  L, d: G2 i 
' P4 a; h* B- a0 T1 ?( N; t 
  (2)编写、运行加密程序 
& {8 W% O. @* C8 ` 
6 S: y, \) ~+ n  在FrontPage中编写加密程序,该程序中有初始化函数initCodecs、加密函数base64Encode(代码如下),把WORD处理后的代码,copy粘贴在inp = ""这句中,最后以test1.asp名存盘;在IE中输入http://127.0.0.1/test1.asp本地运行该文件;屏幕上会显示一大段乱码(例如c2V0IHJzPXNlcnZlci5jcmVhd...),这就是《要保护的asp代码》对应的密文! 
7 [4 M( Y( O. M2 k' |9 y; S1 d/ y1 ^8 z0 @5 K 
  OPTION EXPLICIT  
" P* i9 f& t  P  const BASE_64_MAP_INIT = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"  
0 P# t& R7 p' p. c. c  dim newline  
$ f  Z% E$ f! p. R5 m$ p3 l  dim Base64EncMap(63)  
+ T3 @, ?$ _' G- j  dim Base64DecMap(127)  
0 i5 H0 K5 e! {8 k/ U! b) R  dim inp,hu,encode  
8 N5 {0 ~* q! b0 `. X0 L  call initCodecs '初始化 ) k* q& g; h0 l/ A! A+ j) h 
  inp = "<WORD处理后的asp代码>" '将要保护的asp代码用WORD处理,然后填在此处  
( O/ A3 I( A9 b# V4 y$ c- ?  hu= base64Encode(inp) '调用函数base64Encode进行加密,得到密文hu  
7 T/ e0 N+ e! c- q, _. T  Response.Write(hu) '显示密文 " l/ {  W% ?$ Y" U 
  PUBLIC SUB initCodecs() '初始化函数initCodecs  
9 o0 z7 Q" B/ d9 a  newline = "<P>" & chr(13) & chr(10)3 R1 V4 }/ S/ Z% o' c, K 
  dim max, idx 9 ~* q$ }; s+ P1 x8 K 
  max = len(BASE_64_MAP_INIT) * C2 G- I) n) r4 ^7 h- Y: u 
  for idx = 0 to max - 1  
+ G! V, @7 I8 N% g& ]  Base64EncMap(idx) = mid(BASE_64_MAP_INIT, idx + 1, 1)  
# K' p/ q& X/ B% A( p  l/ J2 ?5 f  next  
8 ]: H: E2 u( N: a- t& R, \  for idx = 0 to max - 1 % x0 Y3 d) z  E5 J* B 
  Base64DecMap(ASC(Base64EncMap(idx))) = idx 5 |# ^2 |) {2 @( S5 x 
  next  
, }) K# M. e* z  END SUB % A  F( X0 T3 L 
  PUBLIC FUNCTION base64Encode(plain) '加密函数base64Encode  
8 C7 y/ \" C- H9 ~- w3 @& u  if len(plain) = 0 then : t4 `! _4 B& u, D+ |2 q% p: X3 [# U 
  base64Encode = "" , X7 l; l# ^0 e$ q7 e 
  exit function 3 i. f5 r1 t+ r: R! L: I% p8 ^' X 
  end if  
5 m) C  j% h# q; U4 q8 t+ k  dim ret, ndx, by3, first, second, third  
; |1 l) n% q1 k4 X) S  by3 = (len(plain) \ 3) * 3  
9 p- q- U$ W+ H" z- _+ k; H  ndx = 1  
3 y3 U$ ^" ^7 o6 t6 B# @  do while ndx <= by3  
: O  e) T0 p3 r( d$ g7 G  first = asc(mid(plain, ndx+0, 1))  
2 ?+ H1 b$ Z  K& A# L) i  second = asc(mid(plain, ndx+1, 1))  
6 O( q' O' \  s( ?, R- X, L  third = asc(mid(plain, ndx+2, 1))  
6 y( U0 U: s0 h" B+ O  ret = ret & Base64EncMap( (first \ 4) AND 63 )   i0 R4 U8 V$ m2 _3 n/ c 
  ret = ret & Base64EncMap( ((first * 16) AND 48) + ((second \ 16) AND 15 ) ) ' F! }6 ?4 a; V" q) k 
  ret = ret & Base64EncMap( ((second * 4) AND 60) + ((third \ 64) AND 3 ) )  
9 b0 G$ L1 i4 i2 U" ~9 p+ v  C7 ?  ret = ret & Base64EncMap( third AND 63)  
; J3 q, g$ {% s2 e8 G  r: a$ e  ndx = ndx + 3 & o1 Q$ Q: q) Y  E( L 
  loop  
! ^# s( J( t, _8 Q  if by3 < len(plain) then  
7 b7 a+ O. l6 U  first = asc(mid(plain, ndx+0, 1))  
' i3 G6 r6 ?3 u  ret = ret & Base64EncMap( (first \ 4) AND 63 ) : B& X6 Z0 k8 W6 | 
  if (len(plain) MOD 3 ) = 2 then + F( d8 a8 E2 B 
  second = asc(mid(plain, ndx+1, 1)) 1 b- G  L, f  p- w6 g5 G& c  u- V 
  ret = ret & Base64EncMap( ((first * 16) AND 48) + ((second \ 16) AND 15 ) )  
0 w& \0 g" t4 u% Y9 Y% b, q( A  ret = ret & Base64EncMap( ((second * 4) AND 60) )  
; T; n' g  a3 f; ?! g6 u  else  
  V; V) \) ~/ _( j( w, t% K6 ]+ [3 q* P  ret = ret & Base64EncMap( (first * 16) AND 48)  
4 Y1 E, k) S0 c4 k  ret = ret '& "="  
2 h! ^; d6 W  U5 U5 F! q, d( J9 {$ Z  end if 5 a+ D. \# j5 u 
  ret = ret '& "=" 9 x- ~" K3 U# L. h* A, i 
  end if  
- E! r5 b$ i% Q. K4 n+ ]  base64Encode = ret   M' h/ a- O3 t( O* m+ r: ~4 l+ y 
  END FUNCTION   Q5 y: n; s0 D6 [0 P% ^+ P4 e5 y 
) M, G( N" d. Q8 t1 _ 
  (3)重新改写要保护的asp文件8 W/ ^) _" e7 I7 `- w& Z 
: f, A" c) ~- o 
  改写原来的asp文件,在文件中增加UnEncode 和base64Decode函数,全部代码如下:! y( o2 W7 u( R, U 
 
+ S+ o, ^1 Q! v! U- l- O  v  Dim Hu,Hu2 8 t1 n4 w4 F8 }6 f/ R! |: N 
  '拷贝“欲保护asp代码”的密文 将之存放到Hu变量中 8 y/ u! x- R$ f5 V/ N' R( z2 {+ F 
  Hu=”c2V0IHJzPXNlcnZlci5jcmVhdGVvYmplY3Qo12Fkb2RiLnJlY29yZHNldOMpICAgICDuc3FsPeNzZWxlY3QgKiBmcm9tIGdxICB3aGVyZSB4cz0xIG9yZGVyIGJ5IGRhdGUgYXNj1yAgICAgsnJzLm9wZW4gc3FsLGNvbm4sMSwxICAgICDuaWYgcnMuZW9mIGFuZCBycy5ib2YgdGhlbiDucmVzcG9uc2Uud3JpdGUTvSD7INAg5iAgILUgvyAFILITsmVsc2UgsiAgICAgUmVzcG9uc2UuV3JpdGUg1zxBIEhSRUY9bmV3MC5hc3A/bGJpZD0TJnJlcXVlc3Qo12xiaWQTKSAmIOM+PC9BPuPuZW5kIGlmICAgIL5zZXQgcnM9bm90aGluZyAgICAgICAgsmNvbm4uY2xvc2UgICAgICDuc2V0IGNvbm49bm90aGluZyAgIL4” 9 j6 R1 v# T2 X7 y/ Q  M 
  Hu2= base64Decode(hu) '还原要保护的ASP代码  
2 [8 A  [; [  ^- F" r% x  execute(UnEncode(Hu2)) '还原单引号、回车换行,并执行原代码 / e, s5 r( G/ G* ?0 }, {& @ 
  ’解密函数base64Decode 7 R0 V; A, i5 B* w% q- U 
  FUNCTION base64Decode(scrambled)  
0 Y& p6 h7 f  @, c& }- T/ @  if len(scrambled) = 0 then  
& o" O' q, t* T7 ?0 U  base64Decode = ""  
, {; k( L; g, i. c1 [; P  exit function . i+ l. z5 Y, ?) D 
  end if  
! t: V: L1 D* S0 i- j7 r  dim realLen & |) m6 I! `7 W6 p. C: M8 k8 _- c 
  realLen = len(scrambled) ! }  C" B" B$ \7 {# _ 
  do while mid(scrambled, realLen, 1) = "=" 2 d& H/ h  b' t% o: Y3 r( O 
  realLen = realLen - 1 * y' E7 h$ Q9 s( e7 r9 G/ [0 c: r 
  loop 8 n2 f, }/ E5 `4 n  q! H; U. { 
  dim ret, ndx, by4, first, second, third, fourth  
" x2 K6 k9 o- g; Q: P: }: d2 k$ a% ~  ret = "" ) V5 `' P! R: H/ I; U 
  by4 = (realLen \ 4) * 4 " Y( A( c: w( ? 
  ndx = 1 ) a3 ]! b. F( T* A" M1 f0 B 
  do while ndx <= by4  
& e+ \' u  Q4 q! N* T3 e  first = Base64DecMap(asc(mid(scrambled, ndx+0, 1)))  
3 ~* x! Y' }3 }6 u+ r+ E  second = Base64DecMap(asc(mid(scrambled, ndx+1, 1))) 5 g& k! W/ i0 A, } 
  third = Base64DecMap(asc(mid(scrambled, ndx+2, 1))) 3 X+ b8 a4 c) {0 ?  R 
  fourth = Base64DecMap(asc(mid(scrambled, ndx+3, 1)))  
- l% R" r* x4 J- ]! G  ret = ret & chr( ((first * 4) AND 255) + ((second \ 16) AND 3)) 3 I" J( i1 N; i9 j: x5 g 
  ret = ret & chr( ((second * 16) AND 255) + ((third \ 4) AND 15)) / \2 D2 O6 Y. |. \6 e, m 
  ret = ret & chr( ((third * 64) AND 255) + (fourth AND 63))  
- ]/ R* A" {+ A! p. j) ?+ Y  ndx = ndx + 4  
. M" ?' C3 f- X' U( q/ M  loop  
! E3 ?2 z  s( ~+ e/ O6 c  if ndx < realLen then  
! V; {; F# i+ ^" q( i3 Q8 J  first = Base64DecMap(asc(mid(scrambled, ndx+0, 1)))  
* S; t4 y4 y( |# [  second = Base64DecMap(asc(mid(scrambled, ndx+1, 1))) ' M: w# d% n$ e! O* |8 {' S 
  ret = ret & chr( ((first * 4) AND 255) + ((second \ 16) AND 3))  
) P/ q: ?6 N' T: z8 Q" B' h# Z& W  if realLen MOD 4 = 3 then ( p$ s# z: `! x2 W' ~ 
  third = Base64DecMap(asc(mid(scrambled,ndx+2,1))) : Y; H$ A6 i* Z& P3 g& E 
  ret = ret & chr( ((second * 16) AND 255) + ((third \ 4) AND 15))  
$ Q  c5 x( c9 A$ r0 m  end if  
- _% I1 P5 I/ ]0 _! {  end if 6 g7 _; v3 ], m7 Q( R) n7 l4 D 
  base64Decode = ret & d% x8 v9 |& y7 I 
  END FUNCTION 2 n% B* G# ^/ w/ W5 D 
  '还原单引号、回车换行函数UnEncode  
/ }& `% ^6 b8 Z  function UnEncode(cc)  
8 n& c; W: h, I9 T! l4 B5 \) N  for i = 1 to len(cc)  
  ]" k! d7 z/ p7 [+ d  if mid(cc,i,1)<> "水" then  
5 X. Q1 f" X0 Z( ]  if mid(cc,i,1)="加" then 0 X$ o, V. y" u5 N: p! d0 K 
  temp = """" & temp " }9 K% C6 ]# U* l1 b: b: e 
  else  
5 g1 [# Z- J: z. M  temp = Mid(cc, i, 1) + temp $ R5 W, F& [) m0 ?: r$ [  ? 
  end if  
- Q) }1 u2 Q: A5 s% y1 Q  else  
  t1 N1 z  V: V. h- q2 v: M" }" d  temp=newline&temp  
# K" m  s6 W+ x$ \6 j6 ?& w  end if 5 A. V& C$ D4 ~ 
  next / `5 i/ S, s5 c: ?7 G1 O* Z! ` 
  UnEncode=temp  
6 Z2 r  H, _0 \$ ]* l$ I  end function # z- D8 Q1 t8 B 
  M+ u) D9 w  l" H2 z 
( P' ]! z/ f$ v9 {" N0 O 
  将以上代码以test2.asp名存盘。. v# X3 x. S. m' r  m 
 
/ F  F6 S' a, M) U9 j' Z  (4)用SRCENC加密test2.asp8 b* F$ K) v- N! { 
0 u+ u$ W; c/ |9 M/ K$ L 
  用SRCENC加密test2.asp,然后把它发布到服务器上,这样别人即使得到该文件、破解了SRCENC加密,也无法看到原代码,因为原代码在test2.asp中是密文(Hu=”c2V0IHJzPXNlcnZlc...),所以ASP代码就被保护起来了! 
" p% I7 @# b2 D. o+ i. q" h- H) R 
$ R) `6 w  |8 }5 Y  二、加密过的asp程序如何解密?; n6 Z; ~* R# e 
 
/ `5 E. Z4 t( [* Z: W7 Y  如何对加密过的asp程序解密呢?首先我们要告诉大家,用组件法加密的asp程序是无法解密的,而screnc加密过的程序则可以解密,方法是:使用解密软件(ZWDECODE.EXE)。  w' g' m4 Y  i4 o1 L 
 
! o, f: o6 f: L' X  ZWDECODE.EXE(下载地址http://www.mydown.com/softdown/45/45183.html)可以对MS Script Encode加密的ASP文件进行解密,还原出源代码。 
; _5 h4 S4 c2 {: K3 M1 s2 Q3 K9 p" K/ A' R$ e 
  (1)解密方法 
: ~) j- H" y2 \4 ^: M5 f6 o) F: ]% v, T' q% ], {0 n6 ] 
  单击“开始”/程序/附件/命令提示符,在MS-DOS 命令行中输入以下命令,即可恢复原代码: 
, B$ E- a- r4 F5 ?- @3 @$ w8 ~% k* [5 q' U) E 
  ZWDECODE <已加密asp文件名>8 b& L5 @3 V: U 
 
9 c* E7 A& E1 j  其中<已加密asp文件名>必需输入,该文件名可带目录路径;也必需输入,这是要生成的输出文件名,也可以带路径信息。/ p2 x9 i2 |0 A* f; c  d$ p 
 
" u" P7 M( t! x1 f" U' N  B  D  (2)举例- F& r! v) m6 I) |2 i 
0 Z0 R% @4 O8 c8 O 
  例如F:\22\lacl.asp曾被screnc加密处理过,现在要恢复其中的源代码,你可以在MS-DOS中输入以下命令:: p  {# F; R0 I- c. Y. F 
 
! x5 R" B9 W, [9 n  ZWDECODE F:\22\lacl.asp d:\ulacl.asp$ J4 F; X/ [5 ^/ e 
 
! ^6 \$ A6 E. T' E# ]+ ]' x# ]/ S  执行完毕,在D盘上就会生成一个ulacl.asp文件,打开该文件,你就能看到源代码了!  ! y7 \& H+ B4 b  E4 e3 _ 
 |  
  |   
 
 
 
 |