자바스크립트에서 사용되는 난독화 기법 몇가지를 알아보고, C 소스 코드 난독화에 대한 힌트를 얻어보려고 한다.
1. eval()메서드를 이용
eval()은 문자열로 된 자바스크립트 코드를 실행시키는 함수이다.
위 사진에서 a라는 변수는 ‘1+2+3’ 이라는 문자열이다.
eval(a)를 실행하면 1+2+3의 값인 6이 나오는것을 알 수 있다. 이러한 eval메서드의 특징을 이용하여 난독화를 할 수 있다.
Crystal에 해당하는 아스키코드를 16진수로 작성해 변수에 쓰고 document.write 를 실행하도록 했다.
2. Split
문자열을 잘라서 여러개의 변수로 나누어 저장하고 이를 다시 합쳐서 사용하는 방법이다.
1번에서 eval에 들어간 표현을 a~f의 변수로 만들고 실행한 결과이다.
3. 문자열을 16진수(Heximal), 10진수(Decimal)로 바꾸기
String.fromCharCode메서드는 UTF-16 코드 유닛의 시퀀스로부터 문자열을 생성해 반환한다.
4. replace
스크립트 코드를 문자열(S)로 작성하고 그 문자열 사이사이에 특정 문자열(string)을 삽입한다.
나중에 실행할 때, S.replace(/string/g, ““)와 같이 끼워넣은 부분을 replace를 통해 제거하면 원하는 기능을 수행한다.
5. 아스키코드에 대한 XOR 등의 연산
A^B=C 이고, C^A=B이고, A^C=B라는 XOR연산의 특징을 이용하여 아스키코드에 대한 난독화를 수행할 수 있다.
예를 들어, Crystal 이라는 문자열은 10진수 아스키코드값 ‘67, 114, 121, 115, 116, 97, 108’을 가진다.
이에 대해 임의의숫자 79를 XOR연산한 결과는 ‘12, 61, 54, 60, 59, 46, 35’가 된다.
document.write('Crystal');
이라는 표현이 document.write(String.fromCharCode(12^79, 61^79, 54^79, 60^79, 59^79, 46^79, 35^79));
이렇게 난독화 되었다.
아스키코드를 이용해 뭔가 만들어 볼 수 있을듯 한데 아직 아이디어가 떠오르지 않아 이 점에 대해서 더 고민해봐야겠다.