자바스크립트는 클라이언트에서 동작하는 언어이기 때문에 소스코드를 숨기기 위한 난독화가 필요하다.
간단히 몇가지 난독화 종류가 정리된 블로그 글이다.
대부분 문자열 인코딩 방식이고 document.write
로 코드를 작성한다.
그 중 마지막, 생성자를 이용한 난독화 방식을 확인해보자
jjencode
라고도 부른다.
기호만 사용하여 자바스크립트 코드를 만드는 것이다.
$=~[];
~
는 자바스크립트 tilde 연산자로-1
이 $에 저장된다.$$$$:(![]+"")[++$]
'f'
이다$_$$:({}+"")[(++$)+1]
"[object Object]"
라는 저장가능한 내장문자열로 치환된다.'b'
이다난독화한 코드를 구동시키는 방법이다.
다음처럼 선언되있다고 할 때,
$.$$="return"
$.$=(0)["constructor"]["constructor"];
위의 변수를 이용하여 원하는 함수를 호출한다.
$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\""+$.$_$_+"\\\");"+"\"")())();
위 표현은 아래와 같다.
$.$($.$(return"ale\162t(\"a\");")())();
결과는 alert('a')
가 정상적으로 실행된다.
위에서 선언한 $.$
를 함수처럼 호출하고 있는데
(0)["constructor"]["constructor"](함수내용) // is equal to $.$()
이처럼 호출할 경우, 해당 함수내용이 실행된다.
또한 특정 문자열을 코드로서 실행시키려고 할 때
다음처럼
"return alert('a')"
return 실행시키려는 코드
를 문자열로 만들고
#1을 두번 호출하는 방식으로 해당 코드를 실행할 수 있다.
http://www.hakawati.co.kr/226#recentComments
너무 잘 정리되어있다.