网站安全之ASP程序加密/解密方法大揭密

网络整理 - 09-01
如今,用ASP技术构建的网站随处可见。由于ASP脚本是在服务器上解释执行的(无法编译),因此你辛苦开发出来的ASP代码,很容易被人拷去任意修改,如何保护ASP源代码呢?这是每个ASP站长都会遇到的难题,网上求解这类问题的帖子非常多,下面我们就来谈谈ASP程序的加密方法。

  一、如何加密ASP程序?

  目前对ASP程序的加密方法主要有三种:脚本编码器(SRCENC.EXE)加密、组件加密、自编程序加密,下面我们就来展开介绍这三种加密方法。

  1、使用微软的MS Script Encode进行加密

  微软提供了脚本编码器MS Script Encode(下载地址=232),可以对ASP程序进行加密。这是一个简单的命令行工具,其执行文件是SRCENC.EXE,需要在DOS下运行。它只加密页面中嵌入的脚本代码,把网页中之间的ASP代码转换成不可读的乱码,其他部分则保持原样不变。加密后的程序,必须使用Internet Explorer 5.0以上版本才能正常浏览。

  用SRCENC加密之后,文件中被加密过的部分将变成只读类型,假如你修改了加密部分(哪怕只改动一个字),就会导致整个文件不能使用。对于 VBScript,加密后在源文件的第一行会显示:

  (1)加密方法

  单击“开始”/程序/附件/命令提示符,在MS-DOS 命令行中输入以下命令,即可对某个asp文件加密:

"
  else
  rst.movefirst
  outstring = "" '将要保护的asp代码用WORD处理,然后填在此处
  hu= base64Encode(inp) '调用函数base64Encode进行加密,得到密文hu
  Response.Write(hu) '显示密文
  PUBLIC SUB initCodecs() '初始化函数initCodecs
  newline = "<P>" & chr(13) & chr(10)
  dim max, idx
  max = len(BASE_64_MAP_INIT)
  for idx = 0 to max - 1
  Base64EncMap(idx) = mid(BASE_64_MAP_INIT, idx + 1, 1)
  next
  for idx = 0 to max - 1
  Base64DecMap(ASC(Base64EncMap(idx))) = idx
  next
  END SUB
  PUBLIC FUNCTION base64Encode(plain) '加密函数base64Encode
  if len(plain) = 0 then
  base64Encode = ""
  exit function
  end if
  dim ret, ndx, by3, first, second, third
  by3 = (len(plain) \ 3) * 3
  ndx = 1
  do while ndx <= by3
  first = asc(mid(plain, ndx+0, 1))
  second = asc(mid(plain, ndx+1, 1))
  third = asc(mid(plain, ndx+2, 1))
  ret = ret & Base64EncMap( (first \ 4) AND 63 )
  ret = ret & Base64EncMap( ((first * 16) AND 48) + ((second \ 16) AND 15 ) )
  ret = ret & Base64EncMap( ((second * 4) AND 60) + ((third \ 64) AND 3 ) )
  ret = ret & Base64EncMap( third AND 63)
  ndx = ndx + 3
  loop
  if by3 < len(plain) then
  first = asc(mid(plain, ndx+0, 1))
  ret = ret & Base64EncMap( (first \ 4) AND 63 )
  if (len(plain) MOD 3 ) = 2 then
  second = asc(mid(plain, ndx+1, 1))
  ret = ret & Base64EncMap( ((first * 16) AND 48) + ((second \ 16) AND 15 ) )
  ret = ret & Base64EncMap( ((second * 4) AND 60) )
  else
  ret = ret & Base64EncMap( (first * 16) AND 48)
  ret = ret '& "="
  end if
  ret = ret '& "="
  end if
  base64Encode = ret
  END FUNCTION

  (3)重新改写要保护的asp文件

  改写原来的asp文件,在文件中增加UnEncode 和base64Decode函数,全部代码如下:

  Dim Hu,Hu2
  '拷贝“欲保护asp代码”的密文 将之存放到Hu变量中
  Hu=”c2V0IHJzPXNlcnZlci5jcmVhdGVvYmplY3Qo12Fkb2RiLnJlY29yZHNldOMpICAgICDuc3FsPeNzZWxlY3QgKiBmcm9tIGdxICB3aGVyZSB4cz0xIG9yZGVyIGJ5IGRhdGUgYXNj1yAgICAgsnJzLm9wZW4gc3FsLGNvbm4sMSwxICAgICDuaWYgcnMuZW9mIGFuZCBycy5ib2YgdGhlbiDucmVzcG9uc2Uud3JpdGUTvSD7INAg5iAgILUgvyAFILITsmVsc2UgsiAgICAgUmVzcG9uc2UuV3JpdGUg1zxBIEhSRUY9bmV3MC5hc3A/bGJpZD0TJnJlcXVlc3Qo12xiaWQTKSAmIOM+PC9BPuPuZW5kIGlmICAgIL5zZXQgcnM9bm90aGluZyAgICAgICAgsmNvbm4uY2xvc2UgICAgICDuc2V0IGNvbm49bm90aGluZyAgIL4”
  Hu2= base64Decode(hu) '还原要保护的ASP代码
  execute(UnEncode(Hu2)) '还原单引号、回车换行,并执行原代码
  ’解密函数base64Decode
  FUNCTION base64Decode(scrambled)
  if len(scrambled) = 0 then
  base64Decode = ""
  exit function
  end if
  dim realLen
  realLen = len(scrambled)
  do while mid(scrambled, realLen, 1) = "="
  realLen = realLen - 1
  loop
  dim ret, ndx, by4, first, second, third, fourth
  ret = ""
  by4 = (realLen \ 4) * 4
  ndx = 1
  do while ndx <= by4
  first = Base64DecMap(asc(mid(scrambled, ndx+0, 1)))
  second = Base64DecMap(asc(mid(scrambled, ndx+1, 1)))
  third = Base64DecMap(asc(mid(scrambled, ndx+2, 1)))
  fourth = Base64DecMap(asc(mid(scrambled, ndx+3, 1)))
  ret = ret & chr( ((first * 4) AND 255) + ((second \ 16) AND 3))
  ret = ret & chr( ((second * 16) AND 255) + ((third \ 4) AND 15))
  ret = ret & chr( ((third * 64) AND 255) + (fourth AND 63))
  ndx = ndx + 4
  loop
  if ndx < realLen then
  first = Base64DecMap(asc(mid(scrambled, ndx+0, 1)))
  second = Base64DecMap(asc(mid(scrambled, ndx+1, 1)))
  ret = ret & chr( ((first * 4) AND 255) + ((second \ 16) AND 3))
  if realLen MOD 4 = 3 then
  third = Base64DecMap(asc(mid(scrambled,ndx+2,1)))
  ret = ret & chr( ((second * 16) AND 255) + ((third \ 4) AND 15))
  end if
  end if
  base64Decode = ret
  END FUNCTION
  '还原单引号、回车换行函数UnEncode
  function UnEncode(cc)
  for i = 1 to len(cc)
  if mid(cc,i,1)<> "水" then
  if mid(cc,i,1)="加" then
  temp = """" & temp
  else
  temp = Mid(cc, i, 1) + temp
  end if
  else
  temp=newline&temp
  end if
  next
  UnEncode=temp
  end function

  将以上代码以test2.asp名存盘。

  (4)用SRCENC加密test2.asp

  用SRCENC加密test2.asp,然后把它发布到服务器上,这样别人即使得到该文件、破解了SRCENC加密,也无法看到原代码,因为原代码在test2.asp中是密文(Hu=”c2V0IHJzPXNlcnZlc...),所以ASP代码就被保护起来了!

  二、加密过的asp程序如何解密?

  如何对加密过的asp程序解密呢?首先我们要告诉大家,用组件法加密的asp程序是无法解密的,而screnc加密过的程序则可以解密,方法是:使用解密软件(ZWDECODE.EXE)。

  ZWDECODE.EXE(下载地址)可以对MS Script Encode加密的ASP文件进行解密,还原出源代码。

  (1)解密方法

  单击“开始”/程序/附件/命令提示符,在MS-DOS 命令行中输入以下命令,即可恢复原代码:

  ZWDECODE <已加密asp文件名>

  其中<已加密asp文件名>必需输入,该文件名可带目录路径;也必需输入,这是要生成的输出文件名,也可以带路径信息。

  (2)举例

  例如F:\22\lacl.asp曾被screnc加密处理过,现在要恢复其中的源代码,你可以在MS-DOS中输入以下命令:

  ZWDECODE F:\22\lacl.asp d:\ulacl.asp

  执行完毕,在D盘上就会生成一个ulacl.asp文件,打开该文件,你就能看到源代码了!