如今,用ASP技術(shù)構(gòu)建的網(wǎng)站隨處可見。由于ASP腳本是在服務(wù)器上解釋執(zhí)行的(無(wú)法編譯),因此你辛苦開發(fā)出來(lái)的ASP代碼,很容易被人拷去任意修改,如何保護(hù)ASP源代碼呢?這是每個(gè)ASP站長(zhǎng)都會(huì)遇到的難題,網(wǎng)上求解這類問題的帖子非常多,下面我們就來(lái)談?wù)凙SP程序的加密方法。
一、如何加密ASP程序?
目前對(duì)ASP程序的加密方法主要有三種:腳本編碼器(SRCENC.EXE)加密、組件加密、自編程序加密,下面我們就來(lái)展開介紹這三種加密方法。
1、使用微軟的MS Script Encode進(jìn)行加密
微軟提供了腳本編碼器MS Script Encode(下載地址http://www.itgene.cn/itgene/download/download.aspID=232),可以對(duì)ASP程序進(jìn)行加密。這是一個(gè)簡(jiǎn)單的命令行工具,其執(zhí)行文件是SRCENC.EXE,需要在DOS下運(yùn)行。它只加密頁(yè)面中嵌入的腳本代碼,把網(wǎng)頁(yè)中之間的ASP代碼轉(zhuǎn)換成不可讀的亂碼,其他部分則保持原樣不變。加密后的程序,必須使用Internet Explorer 5.0以上版本才能正常瀏覽。
用SRCENC加密之后,文件中被加密過的部分將變成只讀類型,假如你修改了加密部分(哪怕只改動(dòng)一個(gè)字),就會(huì)導(dǎo)致整個(gè)文件不能使用。對(duì)于 VBScript,加密后在源文件的第一行會(huì)顯示:<SCRIPT LANGUAGE="VBScript.Encode">;而JScript(或 JavaScript)則會(huì)顯示:<SCRIPT LANGUAGE="JScript.Encode">
(1)加密方法
單擊“開始”/程序/附件/命令提示符,在MS-DOS 命令行中輸入以下命令,即可對(duì)某個(gè)asp文件加密:
SRCENC [switches] <要加密asp文件名> <加密后的文件名>
其中[switches]項(xiàng)目可以選以下5個(gè)參數(shù)
[switches] 含義 舉例
/s 可選。命令中帶了該參數(shù),加密過程中屏幕上就不會(huì)有輸出。 screnc /s lacl.sct ulacl.sct
對(duì)當(dāng)前目錄中的腳本小程序lacl.sct加密,加密過程中屏幕不顯示任何信息
/f 可選。指定輸出文件是否覆蓋同名輸入文件。忽略,將不執(zhí)行覆蓋。 screnc /f lacl.asp
對(duì)文件 lacl.asp加密,并用編碼后的同名文件覆蓋原文件
/xl 可選。是否在.asp文件的頂部添加@Language指令。忽略,將添加。
/l defLanguage 可選。指定Script Encoder加密中選擇的缺省腳本語(yǔ)言。文件中不包含這種腳本語(yǔ)言特性的腳本將被Script Encoder 忽略。
對(duì)于HTML文件,JScript為內(nèi)置缺省腳本語(yǔ)言;對(duì)于ASP文件,VBScript為缺省腳本語(yǔ)言;對(duì)于擴(kuò)展名為.vbs或.js的文件,Script Encoder也有自適應(yīng)能力。 screnc /l vbscript lacl.htm ulacl.htm
對(duì)文件 lacl.htm加密,并生成輸出文件 ulacl.htm,確保沒有指定語(yǔ)言屬性的腳本塊使用 VBScript
/e defExtension 可選。指定待加密文件的文件擴(kuò)展名。缺省狀態(tài)下,Script Encoder能識(shí)別asa,asp,cdx,htm,html,js,sct和vbs文件。 screnc /e asp 11\*.* f:\labxw-jm
對(duì)11目錄中的所有.ASP 文件進(jìn)行加密,并把編碼后的輸出文件放在f:\labxw-jm目錄中
(2)操作舉例
例如要加密當(dāng)前目錄中的lacl.asp文件,生成加密文件ulacl.asp,則在DOS下輸入命令:
screnc lacl.asp ulacl.asp
對(duì)當(dāng)前目錄中的所有 .ASP 文件進(jìn)行加密,并把編碼后的輸出文件放在f:\labxw中,則使用命令:
screnc *.asp f:\labxw
2、使用組件加密asp
以上被screnc加密過的程序,是可以解密的(解密方法下文有介紹),如果你想徹底保護(hù)自己的asp代碼,可以通過開發(fā)activex dll組件的方法進(jìn)行保護(hù)。
Dll文件是被編譯過的機(jī)器代碼,如果沒有源項(xiàng)目文件,是不可能被反編譯的,所以組件加密這種方法最安全,也不可能被破解。下面我們來(lái)舉例說(shuō)明操作過程,例如你要保護(hù)以下asp代碼:
set rs=server.createobject("adodb.recordset")
sql="select * from gq where xs=1 order by date asc"
rs.open sql,conn,1,1
if rs.eof and rs.bof then
response.write"<A HREF=new0.asp?lbid=gqx ><%= gqx %></A>"
else
Response.Write ""
end if
set rs=nothing
conn.close
set conn=nothing
可以把它們改寫成VB組件,然后在ASP文件中調(diào)用組件即可。操作步驟如下:
(1)新建一個(gè)vb6的activex dll項(xiàng)目
在屬性窗口中,命名你的庫(kù)模塊和項(xiàng)目文件(例如項(xiàng)目名lacl,模塊名disp),以后在asp文件中,調(diào)用的對(duì)象名將為lacl_disp
選擇vb6中的項(xiàng)目菜單中的references ,選中microsoft activex data objects 2.0 library
(2)編寫VB組件
接下來(lái)把<欲保護(hù)的asp代碼>改寫成VB組件,代碼如下:
public function html_combo(disp_table as string) as string
dim outstring as string
dim conn as adodb.connection
dim rst as adodb.recordset
dim sqlstring as string
set conn = createobject("adodb.connection")
set rst = createobject("adodb.recordset")
sqlstring = "select * from " & disp_table & " where xs=1 order by date asc"
'以上是在VB中打開數(shù)據(jù)庫(kù)操作,數(shù)據(jù)庫(kù)中的表名、字段名,你可以根據(jù)自己的需要修改
conn.open "dsn=sumnet"
rst.open sqlstring, conn, 3, 3
if rst.eof and rst.bof then
outstring = "還沒有這類單位信息"
else
rst.movefirst
outstring = "<A HREF=new0.asp?lbid="&request("lbid") & "></A>"
end if
html_combo = outstring
rst.close
conn.close
end function
寫好以上VB代碼后,保存項(xiàng)目并開始編譯。
(3)生成安裝文件
打開visual studio 6中附帶的package deployment wizard程序,選擇剛才建立的activex項(xiàng)目文件lacl;選擇package,選擇要打包的腳本或使用默認(rèn)腳本,選擇標(biāo)準(zhǔn)安裝,為生成的安裝文件選擇一個(gè)存放目錄,選擇single cab. 其他均默認(rèn);然后單擊下一步,安裝文件就自動(dòng)生成了!
(4)在IIS服務(wù)器上安裝組件
在IIS服務(wù)器上運(yùn)行這個(gè)安裝文件,把組件安裝到服務(wù)器上。
(5)在網(wǎng)頁(yè)中調(diào)用組件
以后在ASP文件中,通過調(diào)用該組件完成原來(lái)的功能。在網(wǎng)頁(yè)中調(diào)用你制作的組件,方法如下:
<%@ language="vbscript" %>
<%
set diaoyong = server.createobject("lacl_disp.disp")
%>
<html>
<body>
<%= diaoyong.html_combo("gq")%>
<br>
</body>
</html>
你看,現(xiàn)在Asp文件中的內(nèi)容只是組件的調(diào)用(與以前完全不同),別人即使得到該文件,也無(wú)法編輯修改源代碼,因?yàn)榇a都被封裝在VB組件中了,對(duì)于組件中的代碼,外人是無(wú)法看到、也不能反編譯的!
3、自己編寫加密程序
組件加密方法雖然不可破解,但是要求你熟悉VB編程,需要把ASP代碼改寫成VB組件,工作量很大,所以建議大家自己編程來(lái)保護(hù)asp代碼,其基本思路是:寫一個(gè)加密函數(shù)base64Encode和解密函數(shù)base64Decode,先用加密函數(shù)處理<要保護(hù)的asp代碼>,得到對(duì)應(yīng)的密文hu;然后再用execute(base64Decode(hu))替換<欲保護(hù)的asp代碼>。
例如我們要保護(hù)上面那段asp代碼,可以這樣操作:
(1)用WORD處理<要保護(hù)的ASP代碼>
將<要保護(hù)的ASP代碼>拷到WORD中;在WORD中,把代碼里的段落標(biāo)記(回車換行)全部替換成“水”這個(gè)漢字,方法是:點(diǎn)擊“編輯”/替換,光標(biāo)移到“查找內(nèi)容”欄,點(diǎn)“高級(jí)”/特殊字符,選擇“段落標(biāo)記”;光標(biāo)移到“替換為”欄,輸入“水”,最后點(diǎn)“全部替換”。同法,把代碼中的單引號(hào)也全部替換成“加”這個(gè)漢字。
(2)編寫、運(yùn)行加密程序
在FrontPage中編寫加密程序,該程序中有初始化函數(shù)initCodecs、加密函數(shù)base64Encode(代碼如下),把WORD處理后的代碼,copy粘貼在inp = ""這句中,最后以test1.asp名存盤;在IE中輸入http://127.0.0.1/test1.asp本地運(yùn)行該文件;屏幕上會(huì)顯示一大段亂碼(例如c2V0IHJzPXNlcnZlci5jcmVhd...),這就是《要保護(hù)的asp代碼》對(duì)應(yīng)的密文!
OPTION EXPLICIT
const BASE_64_MAP_INIT = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
dim newline
dim Base64EncMap(63)
dim Base64DecMap(127)
dim inp,hu,encode
call initCodecs '初始化
inp = "<WORD處理后的asp代碼>" '將要保護(hù)的asp代碼用WORD處理,然后填在此處
hu= base64Encode(inp) '調(diào)用函數(shù)base64Encode進(jìn)行加密,得到密文hu
Response.Write(hu) '顯示密文
PUBLIC SUB initCodecs() '初始化函數(shù)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) '加密函數(shù)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)重新改寫要保護(hù)的asp文件
改寫原來(lái)的asp文件,在文件中增加UnEncode 和base64Decode函數(shù),全部代碼如下:
Dim Hu,Hu2
'拷貝“欲保護(hù)asp代碼”的密文 將之存放到Hu變量中
Hu=”c2V0IHJzPXNlcnZlci5jcmVhdGVvYmplY3Qo12Fkb2RiLnJlY29yZHNldOMpICAgICDuc3FsPeNzZWxlY3QgKiBmcm9tIGdxICB3aGVyZSB4cz0xIG9yZGVyIGJ5IGRhdGUgYXNj1yAgICAgsnJzLm9wZW4gc3FsLGNvbm4sMSwxICAgICDuaWYgcnMuZW9mIGFuZCBycy5ib2YgdGhlbiDucmVzcG9uc2Uud3JpdGUTvSD7INAg5iAgILUgvyAFILITsmVsc2UgsiAgICAgUmVzcG9uc2UuV3JpdGUg1zxBIEhSRUY9bmV3MC5hc3A/bGJpZD0TJnJlcXVlc3Qo12xiaWQTKSAmIOM+PC9BPuPuZW5kIGlmICAgIL5zZXQgcnM9bm90aGluZyAgICAgICAgsmNvbm4uY2xvc2UgICAgICDuc2V0IGNvbm49bm90aGluZyAgIL4”
Hu2= base64Decode(hu) '還原要保護(hù)的ASP代碼
execute(UnEncode(Hu2)) '還原單引號(hào)、回車換行,并執(zhí)行原代碼
’解密函數(shù)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
'還原單引號(hào)、回車換行函數(shù)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,然后把它發(fā)布到服務(wù)器上,這樣別人即使得到該文件、破解了SRCENC加密,也無(wú)法看到原代碼,因?yàn)樵a在test2.asp中是密文(Hu=”c2V0IHJzPXNlcnZlc...),所以ASP代碼就被保護(hù)起來(lái)了!
二、加密過的asp程序如何解密?
如何對(duì)加密過的asp程序解密呢?首先我們要告訴大家,用組件法加密的asp程序是無(wú)法解密的,而screnc加密過的程序則可以解密,方法是:使用解密軟件(ZWDECODE.EXE)。
ZWDECODE.EXE(下載地址http://www.mydown.com/softdown/45/45183.html)可以對(duì)MS Script Encode加密的ASP文件進(jìn)行解密,還原出源代碼。
(1)解密方法
單擊“開始”/程序/附件/命令提示符,在MS-DOS 命令行中輸入以下命令,即可恢復(fù)原代碼:
ZWDECODE <已加密asp文件名>
其中<已加密asp文件名>必需輸入,該文件名可帶目錄路徑;也必需輸入,這是要生成的輸出文件名,也可以帶路徑信息。
(2)舉例
例如F:\22\lacl.asp曾被screnc加密處理過,現(xiàn)在要恢復(fù)其中的源代碼,你可以在MS-DOS中輸入以下命令:
ZWDECODE F:\22\lacl.asp d:\ulacl.asp
執(zhí)行完畢,在D盤上就會(huì)生成一個(gè)ulacl.asp文件,打開該文件,你就能看到源代碼了!