큰 관심을 가지고 인터넷에서 ASP 소스 코드를 다운로드했습니다. 공부하고 연구할 때 파일을 열었을 때 천국의 책처럼 암호화된 코드를 보았습니다.
복호화 방법을 인터넷에서 찾았는데 파일을 하나씩 열어서 복사하고 붙여넣고 복호화하고 다시 복사하고 다시 붙여넣고 저장을 해야하는데...
ASP 프로그램에 수백 개의 파일이 있으면 어떻게 될까요???
여기에 해결책이 있습니다..
decode.asp
<% @Language="JavaScript" %>
<%
/*
*---------------decode.asp ---------------
* 기능: 특정 디렉터리의 모든 파일과 암호화된 .asp 파일을 탐색합니다.
* 소스 파일의 암호를 해독하고 기록합니다.
* 예시: 단일 파일 복호화
* Response.Write(DncodeFile(Server.MapPath("conn.asp")));
* 예: 디렉토리의 모든 파일을 복호화합니다.
* DncodeFolderFiles(Server.MapPath("xml"))
* 저자:wanghr100(grey bean baby.net)
* 업데이트:2004-5-17 11:31
*---------------decode.asp ---------------
*/
함수 DncodeFile(sFilePath)
{
/*
*--------------- DncodeFile(sFilePath) -----------------
* Dncode파일(s파일 경로)
* 기능: sFilePath 파일을 열고 인코딩하여 암호를 해독한 후 파일을 다시 작성합니다.
* 매개변수: sFilePath, 문자열, 파일 경로.
* 반환: sFilePath, 파일 경로.
* 예: Response.Write(DncodeFile(Server.MapPath("conn.asp")));
* 저자:wanghr100(grey bean baby.net)
* 업데이트:2004-5-17 0:58
*--------------- DncodeFile(sFilePath) -----------------
*/
var ForReading = 1, ForWriting =2, ForAppending =8;
var fso = Server.CreateObject("Scripting.FileSystemObject");
var f = fso.OpenTextFile(sFilePath,ForReading,true);
sFileText = f.ReadAll();
f.닫기();
sDncodeText = strdec(sFileText)
var f = fso.OpenTextFile(sFilePath,ForWriting,true);
f.쓰기(sDncodeText);
f.닫기();
//sDncodeText를 반환합니다.
sFilePath를 반환합니다.
}
함수 GetFilesPath(sFolderPath)
{
/*
*--------------- GetFilesPath(sFolderPath) --------------
* GetFilesPath(sFolderPath)
* 기능: sFolderPath 디렉터리의 모든 파일을 탐색합니다. 파일 경로를 저장합니다.
* 매개변수: sFolderPath, 문자열, 디렉터리 절대 경로.
* 예: Response.Write(GetFilesPath(Server.MapPath("xml")))
* 업데이트:2004-5-12 8:33
* 저자:wanghr100(grey bean baby.net)
*--------------- GetFilesPath(sFolderPath) --------------
*/
var sFilePath = new Array();
var fso = Server.CreateObject("Scripting.FileSystemObject");
var oFolder = fso.GetFolder(sFolderPath);
var oSubFolders = oFolder.SubFolders;
var oFiles = oFolder.Files;
icount = oFiles.Count;
var enmFiles = new Enumerator(oFiles);
for(;!enmFiles.atEnd();enmFiles.moveNext())
{
sFilePath[sFilePath.length] = enmFiles.item().Path
}
var enmFolders = new Enumerator(oSubFolders);
for(;!enmFolders.atEnd();enmFolders.moveNext())
{
/* 기존 배열은 다차원 배열입니다. */
//sFilePath[sFilePath.length]=GetFilesPath(enmFolders.item().Path);
/* 2004-5-17 11:09 1차원 배열만 추가*/
sFilePath=sFilePath.concat(GetFilesPath(enmFolders.item().Path));
}
sFilePath 반환
}
함수 GetFileType(sFileName)
{
/*
*---------------- GetFileType(s파일 이름) ------------------
* GetFileType(s파일명)
* 기능: 접미사를 통해 sFileName의 파일 형식을 가져옵니다.
* 매개변수: sFileName, 문자열, 파일 이름.
* 예: Response.Write(GetFileType("decode.asp"))
* 업데이트:2004-5-13 8:33
* 저자:wanghr100(grey bean baby.net)
*---------------- GetFileType(s파일 이름) ------------------
*/
sFileName = 문자열(sFileName);
return sFileName.split(".")[sFileName.split(".").length-1];
}
/* 복호화 구현 시작: Li Huihuang Start*/
함수 스크린코드(s,l)
{enc=new ActiveXObject("Scripting.Encoder");
return enc.EncodeScriptFile("."+l,s,0,l+"cript");
}
var STATE_COPY_INPUT = 100
var STATE_READLEN = 101
var STATE_DECODE = 102
var STATE_UNESCAPE = 103
var pick_encoding = 새 배열(
1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0,
1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2,
1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2,
1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2
)
var rawData = 새로운 배열(
0x64,0x37,0x69, 0x50,0x7E,0x2C, 0x22,0x5A,0x65, 0x4A,0x45,0x72,
0x61,0x3A,0x5B, 0x5E,0x79,0x66, 0x5D,0x59,0x75, 0x5B,0x27,0x4C,
0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43,
0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63,
0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79,
0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B,
0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D,
0x69,0x49,0x70, 0x3F,0x3F,0x3F, 0x27,0x78,0x7B, 0x3F,0x3F,0x3F,
0x67,0x5F,0x51, 0x3F,0x3F,0x3F, 0x62,0x29,0x7A, 0x41,0x24,0x7E,
0x5A,0x2F,0x3B, 0x66,0x39,0x47, 0x32,0x33,0x41, 0x73,0x6F,0x77,
0x4D,0x21,0x56, 0x43,0x75,0x5F, 0x71,0x28,0x26, 0x39,0x42,0x78,
0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67,
0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22,
0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A,
0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C,
0x24,0x2C,0x5D, 0x2D,0x77,0x27, 0x54,0x44,0x59, 0x37,0x3F,0x25,
0x7B,0x6D,0x7C, 0x3D,0x7C,0x23, 0x6C,0x43,0x6D, 0x34,0x38,0x28,
0x6D,0x5E,0x31, 0x4E,0x5B,0x39, 0x2B,0x6E,0x7F, 0x30,0x57,0x36,
0x6F,0x4C,0x54, 0x74,0x34,0x34, 0x6B,0x72,0x62, 0x4C,0x25,0x4E,
0x33,0x56,0x30, 0x56,0x73,0x5E, 0x3A,0x68,0x73, 0x78,0x55,0x09,
0x57,0x47,0x4B, 0x77,0x32,0x61, 0x3B,0x35,0x24, 0x44,0x2E,0x4D,
0x2F,0x64,0x6B, 0x59,0x4F,0x44, 0x45,0x3B,0x21, 0x5C,0x2D,0x37,
0x68,0x41,0x53, 0x36,0x61,0x58, 0x58,0x7A,0x48, 0x79,0x22,0x2E,
0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F
)
var 변환 = 새 배열()
for (var i=0; i<3; i++) 변환[i] = new Array()
for (var i=31; i<=126; i++) for (var j=0; j<3; j++) 변환됨[j][rawData[(i-31) * 3 + j]] = (i== 31)?9:i
var 숫자 = 새로운 배열()
for (var i=0; i<26; i++)
{
숫자["A".charCodeAt(0)+i] = i
숫자["a".charCodeAt(0)+i] = i+26
}
for (var i=0; i<10; i++) 숫자["0".charCodeAt(0)+i] = i+52
숫자[0x2b] = 62
숫자[0x2f] = 63
함수 이스케이프 해제(문자)
{
var escapes = "#&!*$"
var escaped = "rn<>@"
if (char.charCodeAt(0) > 126) return char
if (escapes.indexOf(char) != -1) return escaped.substr(escapes.indexOf(char), 1)
반품 "?"
}
함수 decodeBase64(문자열)
{
Varval=0
val += (숫자[string.substr(0,1).charCodeAt(0)] << 2)
val += (숫자[string.substr(1,1).charCodeAt(0)] >> 4)
val += (digits[string.substr(1,1).charCodeAt(0)] & 0xf) << 12
val += ((digits[string.substr(2,1).charCodeAt(0)] >> 2) << 8)
val += ((digits[string.substr(2,1).charCodeAt(0)] & 0x3) << 22)
val += (숫자[string.substr(3,1).charCodeAt(0)] << 16)
반환 값
}
함수 strdec(encodingString)
{
var 마커 = "#@~^"
var 문자열 인덱스 = 0
var scriptIndex = -1
var unEncodingIndex = 0
var 문자 = null
var 인코딩 길이 = unEncodinglength = 0
var 상태 = STATE_COPY_INPUT
var unEncodingString = ""
다시, arr
동안(상태)
{
스위치(상태)
{
사례(STATE_COPY_INPUT):
scriptIndex = 인코딩String.indexOf(마커, stringIndex)
if (스크립트 인덱스 != -1)
{
unEncodingString += 인코딩String.substring(stringIndex, scriptIndex)
scriptIndex += marker.length
상태 = STATE_READLEN
}
또 다른
{
stringIndex = stringIndex==0 0 : 문자열인덱스
unEncodingString += 인코딩String.substr(stringIndex, 인코딩String.length)
상태 = 0
}
부서지다
사례(STATE_READLEN):
인코딩길이 = 인코딩스트링.서브스트(스크립트인덱스, 6)
unEncodinglength = decodeBase64(encodingLength)
scriptIndex += (6 + "==".length)
상태 = STATE_DECODE
부서지다
경우(STATE_DECODE):
if (!unEncoding길이)
{
stringIndex = scriptIndex + " DQgAAA==^#~@".length
unEncodingIndex = 0
상태 = STATE_COPY_INPUT
부서지다
}
char = 인코딩String.substr(scriptIndex, 1)
if (char == "@") 상태 = STATE_UNESCAPE
또 다른
{
if (char.charCodeAt(0) < 0xFF)
{
unEncodingString += String.fromCharCode(transformed[pick_encoding[unEncodingIndex%64]][char.charCodeAt(0)])
unEncodingIndex++
}
또 다른
{
unEncodingString += 문자
}
스크립트인덱스++
unEncodinglength--
부서지다
}
사례 STATE_UNESCAPE:
unEncodingString += unescape(encodingString.substr(++scriptIndex, 1))
scriptIndex++; unEncodinglength -=2
unEncodingIndex++
상태 = STATE_DECODE
부서지다
}
}
re = new RegExp("(JScript|VBscript).encode", "gmi")
while(arr = re.exec(unEncodingString)) unEncodingString = RegExp.leftContext + RegExp.$1 + RegExp.rightContext
unEncodingString 반환
}
/* 복호화 구현 종료: Li HuihuangEnd*/
함수 DncodeFolderFiles(sFolderPath)
{
/*
*---------------DncodeFolderFiles(sFolderPath) --------------
* DncodeFolderFiles(sFolderPath)
* 기능: sFolderPath 디렉터리의 모든 파일과 암호화된 .asp 파일을 탐색합니다.
* 소스 파일의 암호를 해독하고 기록합니다.
* 예: DncodeFolderFiles(Server.MapPath("xml"));
* 저자:wanghr100(grey bean baby.net)
* 업데이트:2004-5-17 8:07
*---------------DncodeFolderFiles(sFolderPath) --------------
*/
var arrFiles = GetFilesPath(sFolderPath)
for(var i=0;i<arrFiles.length;i++)
{
if(GetFileType(arrFiles[i])=="asp")
{
응답.쓰기(DncodeFile(arrFiles[i]))
Response.Write("확인.<br>")
}
}
}
//xml 디렉토리의 모든 파일을 가져와서 복호화합니다.
DncodeFolderFiles(Server.MapPath("xml"))
//t.asp.decryption을 가져옵니다.
Response.Write(DncodeFile(Server.MapPath("t.asp")))
%>