| 目前對ASP程序的加密方法主要有三種:腳本編碼器(SRCENC.EXE)加密、組件加密、自編程序加密,下面我們就來展開介紹這三種加密方法…… 如今,用ASP技術構建的網站隨處可見。由于ASP腳本是在服務器上解釋執行的(無法編譯),因此你辛苦開發出來的ASP代碼,很容易被人拷去任意修改,如何保護ASP源代碼呢?這是每個ASP站長都會遇到的難題,網上求解這類問題的帖子非常多,下面我們就來談談ASP程序的加密方法。 一、如何加密ASP程序? 目前對ASP程序的加密方法主要有三種:腳本編碼器(SRCENC.EXE)加密、組件加密、自編程序加密,下面我們就來展開介紹這三種加密方法。 1、使用微軟的MS?Script?Encode進行加密 微軟提供了腳本編碼器MS?Script?Encode(下載地址http://www.itgene.cn/itgene/download/download.aspID=232),可以對ASP程序進行加密。這是一個簡單的命令行工具,其執行文件是SRCENC.EXE,需要在DOS下運行。它只加密頁面中嵌入的腳本代碼,把網頁中之間的ASP代碼轉換成不可讀的亂碼,其他部分則保持原樣不變。加密后的程序,必須使用Internet?Explorer?5.0以上版本才能正常瀏覽。 用SRCENC加密之后,文件中被加密過的部分將變成只讀類型,假如你修改了加密部分(哪怕只改動一個字),就會導致整個文件不能使用。對于?VBScript,加密后在源文件的第一行會顯示:<SCRIPT?LANGUAGE="VBScript.Encode">;而JScript(或?JavaScript)則會顯示:<SCRIPT?LANGUAGE="JScript.Encode"> (1)加密方法 單擊“開始”/程序/附件/命令提示符,在MS-DOS?命令行中輸入以下命令,即可對某個asp文件加密: SRCENC??[switches]??<要加密asp文件名>??<加密后的文件名> 其中[switches]項目可以選以下5個參數 [switches]?含義?舉例 /s?可選。命令中帶了該參數,加密過程中屏幕上就不會有輸出。?screnc?/s?lacl.sct?ulacl.sct 對當前目錄中的腳本小程序lacl.sct加密,加密過程中屏幕不顯示任何信息 /f?可選。指定輸出文件是否覆蓋同名輸入文件。忽略,將不執行覆蓋。?screnc?/f?lacl.asp 對文件?lacl.asp加密,并用編碼后的同名文件覆蓋原文件 /xl?可選。是否在.asp文件的頂部添加@Language指令。忽略,將添加。 /l?defLanguage?可選。指定Script?Encoder加密中選擇的缺省腳本語言。文件中不包含這種腳本語言特性的腳本將被Script?Encoder?忽略。 對于HTML文件,JScript為內置缺省腳本語言;對于ASP文件,VBScript為缺省腳本語言;對于擴展名為.vbs或.js的文件,Script?Encoder也有自適應能力。?screnc?/l?vbscript?lacl.htm?ulacl.htm 對文件?lacl.htm加密,并生成輸出文件?ulacl.htm,確保沒有指定語言屬性的腳本塊使用?VBScript /e?defExtension?可選。指定待加密文件的文件擴展名。缺省狀態下,Script?Encoder能識別asa,asp,cdx,htm,html,js,sct和vbs文件。?screnc?/e?asp?11\*.*?f:\labxw-jm 對11目錄中的所有.ASP?文件進行加密,并把編碼后的輸出文件放在f:\labxw-jm目錄中 (2)操作舉例 例如要加密當前目錄中的lacl.asp文件,生成加密文件ulacl.asp,則在DOS下輸入命令: screnc?lacl.asp?ulacl.asp 對當前目錄中的所有?.ASP?文件進行加密,并把編碼后的輸出文件放在f:\labxw中,則使用命令: screnc?*.asp?f:\labxw 2、使用組件加密asp 以上被screnc加密過的程序,是可以解密的(解密方法下文有介紹),如果你想徹底保護自己的asp代碼,可以通過開發activex?dll組件的方法進行保護。 Dll文件是被編譯過的機器代碼,如果沒有源項目文件,是不可能被反編譯的,所以組件加密這種方法最安全,也不可能被破解。下面我們來舉例說明操作過程,例如你要保護以下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文件中調用組件即可。操作步驟如下: (1)新建一個vb6的activex?dll項目 在屬性窗口中,命名你的庫模塊和項目文件(例如項目名lacl,模塊名disp),以后在asp文件中,調用的對象名將為lacl_disp 選擇vb6中的項目菜單中的references?,選中microsoft?activex?data?objects?2.0?library (2)編寫VB組件 接下來把<欲保護的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中打開數據庫操作,數據庫中的表名、字段名,你可以根據自己的需要修改? 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代碼后,保存項目并開始編譯。 (3)生成安裝文件 打開visual?studio?6中附帶的package?deployment?wizard程序,選擇剛才建立的activex項目文件lacl;選擇package,選擇要打包的腳本或使用默認腳本,選擇標準安裝,為生成的安裝文件選擇一個存放目錄,選擇single?cab.?其他均默認;然后單擊下一步,安裝文件就自動生成了! (4)在IIS服務器上安裝組件 在IIS服務器上運行這個安裝文件,把組件安裝到服務器上。 (5)在網頁中調用組件 以后在ASP文件中,通過調用該組件完成原來的功能。在網頁中調用你制作的組件,方法如下: 以下是引用片段: ??<%@?language="vbscript"?%>? ??<%? ??set?diaoyong?=?server.createobject("lacl_disp.disp")? ??%>??????????????????????????? ??<html>? ??<body>? ??<%=?diaoyong.html_combo("gq")%>? ??<br>? ??</body>? ??</html>? 你看,現在Asp文件中的內容只是組件的調用(與以前完全不同),別人即使得到該文件,也無法編輯修改源代碼,因為代碼都被封裝在VB組件中了,對于組件中的代碼,外人是無法看到、也不能反編譯的! 3、自己編寫加密程序 組件加密方法雖然不可破解,但是要求你熟悉VB編程,需要把ASP代碼改寫成VB組件,工作量很大,所以建議大家自己編程來保護asp代碼,其基本思路是:寫一個加密函數base64Encode和解密函數base64Decode,先用加密函數處理<要保護的asp代碼>,得到對應的密文hu;然后再用execute(base64Decode(hu))替換<欲保護的asp代碼>。 例如我們要保護上面那段asp代碼,可以這樣操作: (1)用WORD處理<要保護的ASP代碼> 將<要保護的ASP代碼>拷到WORD中;在WORD中,把代碼里的段落標記(回車換行)全部替換成“水”這個漢字,方法是:點擊“編輯”/替換,光標移到“查找內容”欄,點“高級”/特殊字符,選擇“段落標記”;光標移到“替換為”欄,輸入“水”,最后點“全部替換”。同法,把代碼中的單引號也全部替換成“加”這個漢字。 (2)編寫、運行加密程序 在FrontPage中編寫加密程序,該程序中有初始化函數initCodecs、加密函數base64Encode(代碼如下),把WORD處理后的代碼,copy粘貼在inp?=?""這句中,最后以test1.asp名存盤;在IE中輸入http://127.0.0.1/test1.asp本地運行該文件;屏幕上會顯示一大段亂碼(例如c2V0IHJzPXNlcnZlci5jcmVhd...),這就是《要保護的asp代碼》對應的密文! 以下是引用片段: 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代碼>"?'將要保護的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(下載地址http://www.mydown.com/softdown/45/45183.html)可以對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文件,打開該文件,你就能看到源代碼了!? |