도움말

자바스크립트 난독화 해제: 읽기 쉬운 코드로 되돌리기

자바스크립트 난독화 해제 도구는 코드를 읽기 어렵게 만든 장치를 되돌려요. 이 도구는 단순한 문자열 배열을 풀고, 상수식을 계산하고, 16진수와 유니코드 이스케이프를 디코딩하고, _0x 형태의 이름을 바꾼 다음 결과를 2칸 들여쓰기로 출력해요. 전부 코드를 읽어서 하는 일이고 실행하지는 않아요. 내 JavaScript는 실행되지도, 업로드되지도 않고, 아래에 적은 일부 난독화는 그대로 남겨 둬요.


JavaScript 난독화 해제 사용 방법

  1. 코드를 난독화된 JavaScript 칸에 붙여넣으세요. 붙여넣기 전에는 "난독화된 JavaScript를 여기에 붙여넣으세요…"가 보여요. 한도는 5,000,000자예요.
  2. 난독화 해제 옵션을 선택하면 체크박스 네 개가 열리고, 기본값은 모두 켜져 있어요. 문자열 배열 풀기, 상수 계산, 16진수·유니코드 이스케이프 디코딩, 16진수 변수 이름 바꾸기 중 원하지 않는 단계는 체크를 해제하세요.
  3. 난독화 해제를 누르세요. 난독화를 푼 코드 화면에 결과가 색이 입혀진 읽기 전용 코드로 나와요.
  4. 코드 위의 칩을 확인하세요. "배열 참조 3개를 바꿨어요", "식 5개를 단순화했어요", "리터럴 2개를 디코딩했어요", "변수 4개의 이름을 바꿨어요"처럼 무엇이 바뀌었는지 알려 줘요. 해당하는 것이 없으면 "풀거나 단순화할 부분이 없어서 코드 서식만 정리했어요."라고 나와요.
  5. 복사(누르면 복사했어요로 바뀌어요) 또는 .js 다운로드를 누르면 코드를 난독화해제.js로 저장할 수 있어요.
  6. 코드 편집을 선택하면 입력 화면으로 돌아가 다른 옵션으로 다시 실행할 수 있어요.

입력한 내용이 올바른 JavaScript가 아니면 "올바른 JavaScript가 아니에요. N번째 줄 M번째 열에 구문 오류가 있어요."라고 실제 줄과 열이 표시되고, 아무것도 바뀌지 않아요.

JS 난독화 풀기: 옵션별로 하는 일

단계는 이 순서로 실행돼요. 그래서 배열 참조를 먼저 푼 다음, 상수 계산에서 앞뒤 문자열과 이어 붙일 수 있어요. 속성 이름, 레이블, import와 export 이름은 바꾸지 않고, 스크립트 맨 위의 shebang 줄은 그대로 둬요.

예제로 보는 변환 결과

이 입력에는 문자열 배열, 16진수 형태의 이름, 따옴표가 붙은 속성, 덧셈이 들어 있어요.

var _0x1a2b = ['hello', 'world', '\x68\x69']; function _0x3c(_0x4d) { console['log'](_0x1a2b[0] + ' ' + _0x1a2b[1], _0x4d, _0x1a2b[2]); } _0x3c(1 + 2 * 3);

결과는 이래요.

function func1(arg1) { console.log("hello world", arg1, "hi"); } func1(7);

칩에는 "배열 참조 3개를 바꿨어요", "식 5개를 단순화했어요", "리터럴 1개를 디코딩했어요", "변수 2개의 이름을 바꿨어요"가 표시돼요. 실제 출력은 2칸 들여쓰기로 여러 줄에 나뉘어 나와요.

되돌릴 수 있는 것과 없는 것

이 도구는 코드를 실행하지 않아서 텍스트에서 보이는 것만 되돌릴 수 있어요. 프로그램을 먼저 실행해야 알 수 있는 것은 짐작하지 않고 그대로 둬요.

이 도구는 읽기를 돕는 용도이고 보안 검사기가 아니에요. 코드가 해로운지 확인하지 않고, 낯선 코드를 안전하게 만들어 주지도 못해요. 믿을 수 없는 곳에서 받은 스크립트는 결과가 깔끔해 보여도 실행하지 마세요.

회전된 문자열 배열이 그대로 남는 이유

많은 난독화 도구는 처음 읽기 전에 짧은 반복문으로 문자열 배열의 항목을 돌려 놓아요. 그래서 소스에서 처음 보이는 항목이 list[0]이 아닐 수 있어요. 눈에 보이는 항목을 그대로 넣으면 코드에 엉뚱한 텍스트가 들어가요.

그래서 배열의 모든 사용이 범위 안의 숫자를 쓴 list[3] 또는 list.length일 때만 풀어요. 배열이 함수에 전달되거나, push로 추가되거나, 다시 대입되거나, 계산할 수 없는 인덱스로 읽히면 그 배열은 쓰인 그대로 남아요.

난독화 해제 도구와 큰 파일

난독화되지 않은 압축 코드는 2칸 들여쓰기로 다시 정리되어 나오고, 칩에는 레이아웃만 바뀌었다고 표시돼요. a나 b 같은 짧은 이름은 16진수 형태가 아니고 원래 이름도 사라졌기 때문에 바꾸지 않아요. 이미 읽기 쉬운 코드를 정리하거나 JSON, HTML, CSS까지 보기 좋게 만들려면 코드 포맷터를 쓰세요. 스타일시트를 다시 줄이려면 CSS 압축기가, 스크립트 안에서 찾은 Base64 문자열을 디코딩하려면 Base64 변환기가 있어요.

모든 처리는 Web Worker에서 이루어져서 큰 파일에서도 페이지가 멈추지 않아요. 아주 길거나 깊게 중첩된 식은 페이지가 감당하지 못할 수 있고, 그때는 코드가 너무 크거나 중첩이 너무 깊어서 여기서는 처리할 수 없다고 알려 줘요.


자주 묻는 질문

자바스크립트 난독화 해제는 어떻게 하나요?

코드를 "난독화된 JavaScript"에 붙여넣고 "난독화 해제"를 누르세요. 코드는 구문 트리로 바뀌고, 문자열 배열이 풀리고, 상수가 계산되고, 이스케이프가 디코딩되고, _0x 이름이 바뀐 뒤, 들여쓰기된 코드로 다시 출력돼요. 복사하거나 ".js 다운로드"를 눌러 난독화해제.js로 저장하세요.

JavaScript deobfuscator online 도구가 있나요?

네, 이 페이지가 바로 그런 도구예요. 브라우저 탭 안에서 동작하고, 코드는 Web Worker에서 분석되며 업로드되지도 실행되지도 않아요. 단순한 문자열 배열, 상수식, 16진수와 유니코드 이스케이프, _0x 형태의 이름을 처리해요. 모든 종류의 난독화를 되돌리지는 못하고, 그대로 남는 것의 목록은 이 페이지에 있어요.

obfuscator.io로 난독화한 코드도 되나요?

코드를 실행하지 않아도 되는 부분만 돼요. 16진수와 유니코드 이스케이프는 디코딩하고, 상수는 계산하고, _0x 이름은 var1, func1, arg1로 바꿔요. obfuscator.io가 시작할 때 push(shift())로 회전시키는 문자열 배열과 디코더 함수로 가져오는 문자열은 되돌리려면 코드를 실행해야 해서 그대로 남아요.

난독화된 코드의 16진수 문자열은 어떻게 디코딩하나요?

네. "난독화 해제 옵션"에서 "16진수·유니코드 이스케이프 디코딩"을 켜 두세요. \x68\u0069 같은 문자열은 hi가 되고, 0x1f 같은 16진수 숫자는 31이 돼요. 코드에 적힌 이스케이프만 디코딩되고, 프로그램이 실행 중에 만들어 내는 16진수 문자열은 대상이 아니에요.

압축된 코드 정리에도 쓸 수 있나요?

네, 출력은 항상 2칸 들여쓰기로 다시 출력되기 때문에 풀 것이 없어도 압축된 코드가 읽기 쉬워져요. 이때는 "풀거나 단순화할 부분이 없어서 코드 서식만 정리했어요."라고 나와요. 입력의 주석은 지워져요. a, b처럼 줄여진 변수 이름은 되살릴 수 없어요.

이 자바스크립트 난독화 해제 툴은 내 JavaScript를 실행하나요?

아니요. 코드는 텍스트로 읽어서 다시 쓸 뿐이에요. eval도 Function 호출도 없고, 페이지에서도 Web Worker에서도 실행하지 않아요. 그래서 회전된 배열과 디코더 함수는 그대로 남아요. 보안 검사도 아니에요. 결과는 읽기 쉬워지지만, 스캔이나 악성코드 판정은 다른 작업이에요.

문자열 배열이 결과에 그대로 남은 이유가 뭔가요?

배열은 모든 사용이 list[3]이나 list.length 같은 고정 인덱스일 때만 풀려요. 코드가 배열을 회전시키거나, 함수에 넘기거나, push로 추가하거나, 계산된 인덱스로 읽으면 읽기를 바꿔 넣었을 때 엉뚱한 문자열이 나올 수 있어서 배열 전체를 그대로 둬요.

"16진수 변수 이름 바꾸기"는 무엇을 하나요?

_0x1a2b 같은 이름에 읽기 쉬운 이름을 붙여요. 변수는 var1, 함수는 func1, 매개변수는 arg1이에요. 같은 이름의 사용 위치는 한꺼번에 바뀌고, 프로그램에 이미 있는 이름은 다시 쓰지 않으며, 속성 이름과 레이블은 건드리지 않아요. 원래 이름은 파일에 없어서 되살릴 수 없어요.

코드는 얼마나 클 수 있고, 오류가 있으면 어떻게 되나요?

최대 5,000,000자예요. 올바른 JavaScript가 아니면 "올바른 JavaScript가 아니에요. N번째 줄 M번째 열에 구문 오류가 있어요."라고 실제 숫자가 표시되고, 아무것도 바뀌지 않아요. 입력한 텍스트는 칸에 그대로 남으니 그 부분을 고치세요.

이 자바스크립트 난독화 해제 사이트는 내 코드를 어딘가에 업로드하나요?

아니요. 분석, 다시 쓰기, 출력은 모두 브라우저 안의 Web Worker에서 이루어지고, 서버로는 아무것도 전송되지 않아요. 코드가 실행되는 일도 없어요.